Ansible 通过生成的名称设置可解释的事实
我正在编写一个ansible playbook,以将一些服务配置部署到不同的地区,并且我有由Ansible 通过生成的名称设置可解释的事实,ansible,ansible-facts,Ansible,Ansible Facts,我正在编写一个ansible playbook,以将一些服务配置部署到不同的地区,并且我有由导入的初始变量include_vars,如下所示: common: [...] us_local: [...] uk_local: [...] us_global: [...] uk_global: [...] 基本上,我想通过使用hosts.yaml中定义的{{site}}变量,包括来自common的变量、所有全局配置以及该区域的本地配置来生成配置。 例如,如果部署的主机是美国,那么我想使用commo
导入的初始变量include_vars
,如下所示:
common: [...]
us_local: [...]
uk_local: [...]
us_global: [...]
uk_global: [...]
基本上,我想通过使用hosts.yaml中定义的{{site}}
变量,包括来自common
的变量、所有全局配置以及该区域的本地配置来生成配置。
例如,如果部署的主机是美国,那么我想使用common
,us\u local
,us\u global
,uk\u global
我将使用jinja2模板生成最终配置,据我所知,最简单的方法是创建另一个名为current\u site\u local
的变量,并将{site}}}\u local
中的所有内容复制到其中,以便以后我可以在模板中直接引用它。但是,通过set\u facts
我很难让它正常工作
任何帮助都将不胜感激
更新:
我使用了以下语法,它可以工作:
- name: generate curr_site_local
set_fact:
current_site_local: '{{ vars[site + "_local"] }}'
尝试使用
组合
过滤器
- name: Set site config '{{ site }}'
set_fact:
current_site_local: '{{ common
| combine(vars[site + "_global"])
| combine(vars[site + "_local"]) }}'
在这种情况下,优先顺序是本地
配置将覆盖全局
,这将覆盖公共
。
不确定这是否是您想要的,但这是您在问题中给出的顺序,但现在不包括\u global
。如果希望
common
具有最高优先级,只需颠倒顺序即可
有关详细信息,请参阅文档
使用来自的建议更新了我的答案。尝试使用
组合过滤器
- name: Set site config '{{ site }}'
set_fact:
current_site_local: '{{ common
| combine(vars[site + "_global"])
| combine(vars[site + "_local"]) }}'
在这种情况下,优先顺序是本地
配置将覆盖全局
,这将覆盖公共
。
不确定这是否是您想要的,但这是您在问题中给出的顺序,但现在不包括\u global
。
如果希望common
具有最高优先级,只需颠倒顺序即可
有关详细信息,请参阅文档
更新了我的答案,并提供了来自的建议。Heh,看起来我们在几秒钟内就回答了对方的问题,但尽管你的答案比我的要全面得多,但我确实认为在:
时使用块并不是解决该问题的正确方法。如果您更新您的答案以使用vars
和region
,我将很高兴为您的答案投票并删除我的答案。谢谢您的回复。实际上,我只想将{site}}{u local(一个列表)中的内容分配到另一个变量中,称为current{site}{u local,以便稍后我可以在如下模板中使用它:{curr{site}u local%}{entry.name}xxxx{{entry.value}{%endfor%}尝试了您的解决方案,但遇到了一个错误“错!在任务中未检测到任何操作。这通常表示模块名称拼写错误或模块路径不正确。“这个错误只是因为我的打字错误,它现在起作用了。谢谢嘿,看起来我们在几秒钟内就回答了,但是虽然你的答案比我的要全面得多,但我确实认为在:
块时使用,并不是解决这个问题的正确方法。如果您更新您的答案以使用vars
和region
,我将很高兴为您的答案投票并删除我的答案。谢谢您的回复。实际上,我只想将{site}}{u local(一个列表)中的内容分配到另一个变量中,称为current{site}{u local,以便稍后我可以在如下模板中使用它:{curr{site}u local%}{entry.name}xxxx{{entry.value}{%endfor%}尝试了您的解决方案,但遇到了一个错误“错!在任务中未检测到任何操作。这通常表示模块名称拼写错误或模块路径不正确。“错误只是因为我的输入错误,现在可以正常工作了。谢谢!