在ansible中获取(客户端\组\名称,[])
我有一个ansible playbok yaml文件,它有一个条件和一个委托在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', [
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”的组中代码不是来自剧本而是来自一项任务,还是我弄错了?它来自ceph ansible playbookops,我错过了。现在更新。