如何禁用主机:全部在 Ansible 中

How to disable hosts: all in Ansible

我想在 Ansible 清单文件中禁用 hosts: all。 有时人们忘记修改 YAML 文件中的主机列,因此他们不小心将新配置推送到内网中的所有主机。

我是 Ansible 的新手,非常感谢任何帮助!

这是不可能的。唯一可以 kind-of-exist 但不属于 all 组的主机是 implicit localhost;任何其他主机都会自动成为 all 的一部分,即使您没有明确将其列为父组也是如此。

假设您想在所有剧本中保留 hosts: all,并希望通过选项 --limit 限制 运行 时间内的主机。接下来,您要防止 运行在所有主机上无限制地使用 playbook。

问:如何在 Ansible 中禁用 hosts:all?

A:Ansible 中没有这样的选项可以禁用 all 组。组 all 是自动创建的,包含清单中的所有主机。

相反,在剧本中,您可以测试剧本是否针对所有主机,例如

shell> cat playbook.yml
- hosts: all
  tasks:
    - assert:
        that: ansible_play_hosts_all|length < groups.all|length
        fail_msg: '[ERROR] All hosts not allowed.'
      run_once: true

没有主办方的限制,比赛将无法继续

shell> ansible-playbook playbook.yml

...

TASK [assert] **************************************************************
fatal: [host01]: FAILED! => changed=false 
  assertion: ansible_play_hosts_all|length < groups.all|length
  evaluated_to: false
  msg: '[ERROR] All hosts not allowed.'

实施

您不必修改所有剧本。相反,创建包装器。例如,给定剧本

shell> cat playbook-509.yml
- hosts: all
  tasks:
    - debug:
        msg: playbook-509 is running ...

创建包装器

shell> cat playbook-509-wrapper.yml
- hosts: all
  gather_facts: false
  tasks:
    - assert:
        that: ansible_play_hosts_all|length < groups.all|length
        fail_msg: '[ERROR] All hosts not allowed.'
      run_once: true

- import_playbook: playbook-509.yml

只允许用户 运行 包装器。例如,如果用户 运行 无限制地包装

,播放将不会 运行
shell> ansible-playbook playbook-509-wrapper.yml

...

TASK [assert] ***************************************************
fatal: [host01]: FAILED! => changed=false 
  assertion: ansible_play_hosts_all|length < groups.all|length
  evaluated_to: false
  msg: '[ERROR] All hosts not allowed.'

如果主持人人数有限运行,该剧将

shell> ansible-playbook playbook-509-wrapper.yml --limit host01

PLAY [all] *****************************************************

TASK [assert] **************************************************
ok: [host01] => changed=false 
  msg: All assertions passed

PLAY [all] *****************************************************

TASK [debug] ***************************************************
ok: [host01] => 
  msg: playbook-509 is running ...

您可以使用 Ansible 自动创建包装器。