首页 > 解决方案 > groups.get(client_group_name, []) 在 ansible

问题描述

我有一个具有一个条件和一个委托的 ansible-playbok yaml 文件

when: not delegate_facts_host | bool or inventory_hostname in groups.get(client_group_name, [])


delegate_to: "{{ item }}"
delegate_facts: True
with_items: "{{ groups['all'] | difference(groups.get('clients', [])) }}" 

我不明白这一行。当我打印

delegate_facts_host 

即使我设置它也显示 True

  vars:
    delegate_facts_host: False 

最令人困惑的部分是

groups.get(client_group_name, [])

我搜索但我完全不明白

标签: ansible

解决方案


我在这里看到了一个很好的 Ansible ......

  1. groups['all']是所有主机的列表(组 'all' 包含所有主机,组是一个神奇的变量)。
  2. groups.get('clients', [])是 Ansible 和 Python 的混合体。Groups 是一个神奇的变量(它是一个 python 字典!),所以我们使用 python 'get' 方法将groups['clients']默认值设置为空列表([])。见[1]
  3. |difference是 Jinja 过滤器,它从左侧 ( ) 中获取列表groups['all']并从右侧 ( ) 中减去列表groups.get('clients', [])。结果是“不在客户端组中的所有主机的列表”。
  4. with_items遍历这个列表。
  5. delegate_to: {{ item }}在此列表中的每个主机上运行代码。
  6. 何时:not delegate_facts_host | bool使用布尔拟合器(将字符串“是”、“否”等转换为布尔值)-如果delegate_facts_host设置为“否”或如果inventory_hostname in groups.get(client_group_name, [])-第二部分检查主机是否在名称为“client_group_name”的组中,则运行任务。

基本上,它说“在所有客户端上使用来自非客户端的数据运行它”(在所有客户端上运行,但委托给所有非客户端)。它简洁明了,但对初学者不友好,是的。

[1] https://docs.python.org/3/library/stdtypes.html#typesmapping

获取(键[,默认值])

如果键在字典中,则返回键的值,否则返回默认值。如果未给出默认值,则默认为无,因此此方法永远不会引发 KeyError。


推荐阅读