通过生成的名称设置可靠的事实
Set ansible facts though generated name
我正在编写一个 ansible 剧本来将一些服务配置部署到不同的区域,我有 include_vars
导入的初始变量,如下所示:
common: [...]
us_local: [...]
uk_local: [...]
us_global: [...]
uk_global: [...]
基本上,我想通过包含 common
中的变量、所有全局配置以及该区域的本地配置来生成配置,使用 {{ site }}
中定义的变量 hosts.yaml。
比如部署的host是us,那么我要用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"] }}'
尝试使用 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 的建议更新了我的答案。
我正在编写一个 ansible 剧本来将一些服务配置部署到不同的区域,我有 include_vars
导入的初始变量,如下所示:
common: [...]
us_local: [...]
uk_local: [...]
us_global: [...]
uk_global: [...]
基本上,我想通过包含 common
中的变量、所有全局配置以及该区域的本地配置来生成配置,使用 {{ site }}
中定义的变量 hosts.yaml。
比如部署的host是us,那么我要用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"] }}'
尝试使用 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 的建议更新了我的答案。