【问题标题】:Set ansible facts though generated name通过生成的名称设置 ansible 事实
【发布时间】:2019-03-03 19:52:21
【问题描述】:

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

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

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

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

任何帮助将不胜感激。

更新:

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

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

【问题讨论】:

    标签: ansible ansible-facts


    【解决方案1】:

    尝试使用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 的建议更新了我的答案。

    【讨论】:

    • 嘿,看起来我们在几秒钟内就互相回答了,但是虽然你的回答比我的要全面得多,但我确实认为拥有 when: 块不是正确的方法问题。如果您更新您的答案以使用varsregion,我会很高兴支持您的并删除我的
    • 感谢您的回复。实际上,我只是想将 {{ site }}_local(一个列表)中的内容分配给另一个名为 current_site_local 的变量,以便稍后我可以在如下模板中使用它: {% for entry in curr_site_local %} {{ entry.name }} xxxx {{ entry.value }} {% endfor %} 尝试了您的解决方案,但出现错误“错误!在任务中未检测到任何操作。这通常表示模块名称拼写错误或不正确模块路径。”
    • 这个错误只是因为我的错字,它现在可以工作了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2011-07-08
    • 2010-11-10
    相关资源
    最近更新 更多