【问题标题】:Match single custom host inventory variable when using multiple nested host variables使用多个嵌套主机变量时匹配单个自定义主机库存变量
【发布时间】:2020-05-21 18:38:20
【问题描述】:

我正在尝试遍历清单文件中的匹配主机,其中每个主机都有某些变量,但是,每个主机可能有多个与之关联的嵌套变量,如下所示:

库存文件:

[support]
myhost1 application_role="['role1', 'role2']" team="['ops', 'dev']"
myhost2 application_role="['role1']" team="['ops', 'sales']"

我的目标是尝试仅将文件传递给与客户变量键“team”匹配等于值“sales”的主机。

我正在测试这个测试任务只是为了得到一些响应,但是从输出中可以看出,它正在跳过所有这些,因为它没有捕获嵌套变量,它似乎将变量作为一个完整的字符串读取而不是分裂?

测试任务:

- name: Loop through example servers and show the hostname, team attribute
  debug:
    msg: "team attribute of {{ item }} is {{ hostvars[item]['team'] }}"
  when: hostvars[item]['team'] == "sales"
  loop: "{{ groups['support'] }}"

输出:

PLAY [support] ************************************************************************

TASK [ssh_key_push : Loop through example servers and show the hostname, team attribute msg=team attribute of {{ item }} is {{ hostvars[item]['team'] }}] ***
skipping: [myhost1] => (item=myhost1) 
skipping: [myhost1] => (item=myhost2) 
skipping: [myhost1]
skipping: [myhost2] => (item=myhost1) 
skipping: [myhost2] => (item=myhost2) 
skipping: [myhost2]

我不确定如何从主机清单中读取单个嵌套变量。

谢谢!!!

【问题讨论】:

  • 我最终在 vars/main.yml 中创建了一个名为 team_name 的新变量,并在命令行中使用额外的 var 发出团队名称,然后使用此任务来避免 jinja2 关于条件和 {{ }}: ``` - name: 遍历示例服务器并显示主机名,团队属性调试: msg: "{{ item }} 的团队属性是 {{ hostvars[item]['team'] }}" 当: hostvars[item]['team'] is contains (team_name) loop: "{{ groups['support'] }}" ```

标签: ansible


【解决方案1】:
when: hostvars[item]['team'] == "sales"

此表达式正在比较一个列表,例如

team:
 - ops
 - sales

到单个字符串值sales。这将始终返回 false。

你想做的是check if the list contains that value。正如此链接中所解释的,Jinja2 提供了 in 测试,但 ansbile 提供了 contains,这可以在某些情况下简化编写。两个版本是等效的:

when: hostvars[item]['team'] is contains 'sales'
# or
when: "'sales' in hostvars[item]['team']"

【讨论】:

  • 非常酷,这确实可以命中单个嵌套变量。我想我在这里时想问另一个问题,你知道为什么循环似乎循环了两次吗?我的库存中有两个条目......我猜这就是为什么,但是,之前从未见过,好吧: [host] => (item=host) => {} MSG: 主机的团队属性: 主机包含团队: ['dev'] 跳过: [host] => (item=host) ok: [host] => (item=host) => {} MSG: 主机的团队属性: 主机包含团队: ['dev'] 跳过: [host] => (item=host) ok: [host] => (item=host) = > {}
  • 请花时间阅读help section 并了解这里的规则。问一个其他问题,并尝试使其成为MCVE
猜你喜欢
  • 1970-01-01
  • 2014-02-07
  • 2020-12-29
  • 2021-09-24
  • 2022-11-08
  • 2017-04-20
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
相关资源
最近更新 更多