ansible - Ansible 忽略剧本中的条件
问题描述
在使用 ansible 时,我在使用 when 条件时遇到了一些麻烦。有五个具有不同主机的主机组。不知何故,ansible 忽略了条件并仍然尝试运行任务,尽管它不在条件中。参见示例:
库存.yml
[devices]
dev1 ansible_host=10.0.0.1
[router]
router ansible_host=10.1.1.8
[hostsA]
hostA1 ansible_host=10.1.1.9
[hosts]
host1 ansible_host=10.2.1.9
host2 ansible_host=10.1.1.7
[groupB]
hostB1 ansible_host=10.1.1.5
install_packages.yml
-name: Install packages for devices and router
pip:
req: ~/requirements.txt
when: "'devices' and 'router' in group_names"
-name: Install packages for host2
pip:
req: ~/requirements.txt
when: "'host2' in group_names"
如果我执行ansible-playbook rollout.yaml -i inv.yml --limit="host2"
它仍然会尝试执行第一个任务而不是跳过它(按预期)。有谁知道为什么以及我能做什么?
解决方案
修复条件
when:
- "'devices' in group_names"
- "'router' in group_names"
这是一样的
when: "'devices' in group_names and 'router' in group_names"
如果您想测试更多组,则创建一个列表会更有效,例如my_groups
. 查找公共组列表(相交)并比较项目数,例如
when: my_groups|intersect(group_names)|length == my_groups|length
vars:
my_groups: [devices, router]
问:“ Ansible 正在跳过每个主机的任务。 ”
答:这是正确的。引用特殊变量
" group_names: 当前主机所属的组列表"
在您的清单中,没有任何主机是devices
和的成员router
。结果,条件总是失败。例如
- hosts: router,dev1
tasks:
- debug:
var: group_names
- debug:
msg: OK
when:
- "'devices' in group_names"
- "'router' in group_names"
- debug:
msg: OK
when: "'devices' in group_names and 'router' in group_names"
- debug:
msg: OK
when: my_groups|intersect(group_names)|length == my_groups|length
vars:
my_groups: [devices, router]
给
PLAY [router,dev1] *****************************************************
TASK [debug] ***********************************************************
ok: [router] =>
group_names:
- router
ok: [dev1] =>
group_names:
- devices
TASK [debug] ***********************************************************
skipping: [router]
skipping: [dev1]
TASK [debug] ***********************************************************
skipping: [router]
skipping: [dev1]
TASK [debug] ************************************************************
skipping: [router]
skipping: [dev1]
推荐阅读
- reactjs - 如何渲染父组件和子组件?
- css - OpenTypeFont 不显示在 Firefox 和 Safari 上
- oracle - 为什么我不能插入主键定义为 NULL 的行?
- python - 如何通过在 tkinter 中使用 pack 来确定小部件的坐标?
- python - 要传递给 model.compile() 的损失函数的缩写?
- arrays - SwiftUI - 无法从 JSON 响应显示嵌套数组 - “没有成员'标题”
- python - Discord Bot 图像循环 (Python)
- python - 在我的 Flask 应用程序中询问用户他们的位置并在他们离开网站时摆脱它
- javascript - 绘制不在画布上的对象或检查它们是否更有效?
- laravel - Laravel 8 验证 - 需要任何一个字段,但不是两个