首页 > 解决方案 > 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" 它仍然会尝试执行第一个任务而不是跳过它(按预期)。有谁知道为什么以及我能做什么?

标签: ansible

解决方案


修复条件

      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]

推荐阅读