Ansible `where` 子句用于表示“这些主机是否在该组中?”

Ansible `where` 子句用于表示“这些主机是否在该组中?”

我正在编写一个 ansible (v2.9.6) 任务,该任务应仅针对特定组中的主机运行。我该如何编写子句where来匹配该任务?

when: "'my_group_name' in {{ group_names }}"

出现以下错误

fatal: [hostname1.example.com]: FAILED! => {"msg": "The conditional check ''my_group_name' in {{ group_names }}' failed. The error was: template error while templating string: expected token ',', got 'string'. String: {% if 'my_group_name' in [u'apache_webservers', u'my_group_name', u'webservers', u'ubuntu_servers'] %} True {% else %} False {% endif %}\n\nThe error appears to be in ...

答案1

- name: test playbook
  hosts: all
  vars:
    my_group: openvpn

  tasks:
  - name: debug
    debug:
      msg: 'my_group is: {{my_group}} , group_names are: {{group_names}}'

  - debug:
      msg: 'condition passed'
    when: my_group in group_names

结果:

PLAY [test playbook] ************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [host1]
ok: [host2]

TASK [debug] ********************************************************************************************************************************************************************************************************************************
ok: [host2] => {
    "msg": "my_group is: openvpn , group_names are: ['openvpn']"
}
ok: [host1] => {
    "msg": "my_group is: openvpn , group_names are: ['openvpn']"
}

TASK [debug] ********************************************************************************************************************************************************************************************************************************
ok: [host2] => {
    "msg": "condition passed"
}
ok: [host1] => {
    "msg": "condition passed"
}

在 ansible 2.9.6 上测试

答案2

开始一个新的剧本,可以在同一个剧本文件中。

- name: Deploy thing 
  hosts: my_group_name

  tasks:
  - name: Do thing
    debug:
      msg: thing

这不是您要求的 when 条件。但是,由于该游戏仅运行符合模式的主机,因此可以更清楚地了解正在发生的事情。

相关内容