ansible - 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 ......
groups['all']
是所有主机的列表(组 'all' 包含所有主机,组是一个神奇的变量)。groups.get('clients', [])
是 Ansible 和 Python 的混合体。Groups 是一个神奇的变量(它是一个 python 字典!),所以我们使用 python 'get' 方法将groups['clients']
默认值设置为空列表([]
)。见[1]|difference
是 Jinja 过滤器,它从左侧 ( ) 中获取列表groups['all']
并从右侧 ( ) 中减去列表groups.get('clients', [])
。结果是“不在客户端组中的所有主机的列表”。with_items
遍历这个列表。delegate_to: {{ item }}
在此列表中的每个主机上运行代码。- 何时:
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。
推荐阅读
- c++ - outline 属性在 Qt styleSheets 中不起作用
- flutter - 带有渐变叠加层的图标按钮在点击时会中断
- python - 来自 pandas Dataframe 不确定性的 LaTeX 表
- flutter - 在可见的抽屉菜单上方显示 Flutter 的 SnackBar?
- angular - 剑道下拉角
- python - 带有while循环的成绩计算器
- ruby-on-rails - 在 Markdown 中使用 ERB 和 Redcarpet
- python - 如何在不显示其中一条线的 y 轴的情况下使用 matplotlib 多折线图?
- django - Django 的 get_initial() 方法无法按预期工作
- python - 如何在 Python 中用 `\n` 替换通用换行符?