首页 > 解决方案 > 通过生成的名称设置 ansible 事实

问题描述

我正在编写一个 ansible playbook 以将一些服务配置部署到不同的区域,并且我有include_vars如下导入的初始变量:

common: [...]
us_local: [...]
uk_local: [...]
us_global: [...]
uk_global: [...]

基本上,我想通过包含 vars from common、所有全局配置以及该区域的本地配置来生成配置,使用{{ site }}在 hosts.yaml 中定义的变量。例如,如果部署的主机是我们,那么我想使用common, us_local, us_global, uk_global

我将使用 jinja2 模板生成最终配置,据我了解,最简单的方法是创建另一个名为的变量current_site_local并将所有内容复制{{ site }}_local到其中,以便稍后我可以直接在模板中引用它。但是,我无法通过set_facts.

任何帮助,将不胜感激。

更新:

我使用了以下语法并且它有效:

- name: generate curr_site_local
  set_fact:
    current_site_local: '{{ vars[site + "_local"] }}'

标签: ansibleansible-facts

解决方案


尝试使用combine过滤器。

- name: Set site config '{{ site }}'
  set_fact:
    current_site_local: '{{ common 
      | combine(vars[site + "_global"])
      | combine(vars[site + "_local"]) }}'

在这种情况下,优先顺序是local配置将覆盖global,而这将覆盖common. 不确定这是否是您想要的,但这是您在问题中给出的顺序,但<other>_global现在不包括在内。
如果您想common拥有最高优先级,只需颠倒顺序即可。

请参阅文档以获取combine.

用Matthew L Daniel的建议更新了我的答案。


推荐阅读