如何禁用主机:全部在 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 自动创建包装器。
我想在 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 自动创建包装器。