在ansible中获取(客户端\组\名称,[])

在ansible中获取(客户端\组\名称,[]),ansible,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', [

我有一个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 
即使我设置了

  vars:
    delegate_facts_host: False 
最令人困惑的是

groups.get(client_group_name, [])

我搜索了一下,但我一点也不懂。

我在这里看到了一个很好的答案

  • groups['all']
    是所有主机的列表(group'all'包含所有主机,groups是一个神奇的变量)
  • groups.get('clients',[])
    是Ansible和Python的混合体。Groups是一个神奇的变量(它是一个python字典!),因此我们使用python的“get”方法将
    组['clients']
    的默认值设置为空列表(
    []
    )。见[1]
  • | difference
    是一个Jinja过滤器,它从左部分(
    组['all']
    )获取列表,从右部分(
    组.get('clients',[])减去列表。结果是“不在客户端组中的所有主机的列表”
  • with_items
    迭代此列表
  • delegate_to:{{item}
    是此列表中每个主机上的运行代码
  • 当:
    not delegate\u facts\u host | bool
    使用bool fiter(将字符串“yes”、“no”等转换为bool值)-如果delegate\u facts\u host设置为“no”或
    inventory\u hostname在组中,任务将运行。get(client\u group\u name,[])
    -第二部分检查主机是否位于名为“client\u group\u name”的组中
  • 基本上,它说“在所有客户机上使用来自非客户机的数据运行此程序”(在所有客户机上运行,但委托给所有非客户机)。它简洁明了,但不适合初学者

    [1]

    获取(键[,默认])

    如果键在字典中,则返回键的值,否则为默认值。如果未给出default,则默认为None,因此 方法从不引发键错误


    代码不是来自剧本而是来自一项任务,还是我弄错了?它来自ceph ansible playbookops,我错过了。现在更新。