Ansible 忽略剧本中的条件

时间:2021-02-10 13:04:14

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

3 个答案:

答案 0 :(得分:0)

修正条件

      when:
        - "'devices' in group_names"
        - "'router' in group_names"

这是一样的

      when: "'devices' in group_names and 'router' in group_names"

如果你想测试更多的组,创建一个列表会更有效,例如my_groups。查找公共组列表 (intersect) 并比较项目数,例如

      when: my_groups|intersect(group_names)|length == my_groups|length
      vars:
        my_groups: [devices, router]

问:Ansible 正在跳过每个主机的任务。

答:这是正确的。引用自 Special Variables

<块引用>

"group_names:当前主机所属的组列表"

在您的清单中,没有主机是 devicesrouter 的成员。结果,条件总是失败。例如

- 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]

答案 1 :(得分:0)

部分问题在于您的条件语句没有按照您的想法执行。当你写:

"'devices' and 'router' in group_names"

你已经有效地写了:

('devices') and ('router' in group_names)

并且由于非零字符串计算为布尔值 true,因此转换为:

(true) and ('router' in group_names)

你可以改写:

when: 'devices' in group_names and 'router' in group_names

或者:

when:
  - 'devices' in group_names
  - 'router' in group_names

答案 2 :(得分:-3)

所以感谢您的帮助和提示,我设法通过使用来解决问题

when: inventory_hostname == "device" or inventory_hostname == "router"

我会尝试其他解决方案以获得更持久或更高效的解决方案

相关问题