在 Ansible
中,如果你有一个主 playbook
包含了多个 playbook
,而这些子 playbook
指定的 hosts
不一样,你可以通过两种方式统一在主 playbook
中指定 hosts
:
1. 在主 playbook
中指定全局的 hosts
你可以在主 playbook
中通过顶层的 hosts
指定统一的目标主机。这种方式会覆盖子 playbook
中定义的 hosts
。
示例:
# main_playbook.yml
---
- hosts: all # 在主 playbook 里统一指定 hosts
import_playbook: playbook1.yml
- hosts: all # 或者为每个 import_playbook 指定
import_playbook: playbook2.yml
- hosts: all
import_playbook: playbook3.yml
这样,所有子 playbook
将会使用 main_playbook.yml
中定义的 hosts: all
,从而覆盖各个子 playbook
中定义的 hosts
。
2. 在 include
时动态传递 hosts
你可以在 import_playbook
或 include_playbook
时显式为每个子 playbook
定义不同的 hosts
。这样即使子 playbook
中有 hosts
定义,也会被覆盖。
示例:
# main_playbook.yml
---
- import_playbook: playbook1.yml
hosts: webservers # 指定 playbook1 的 hosts
- import_playbook: playbook2.yml
hosts: dbservers # 指定 playbook2 的 hosts
- import_playbook: playbook3.yml
hosts: all # 指定 playbook3 的 hosts
通过这种方式,你可以为每个子 playbook
动态指定不同的目标主机,而不必修改各个子 playbook
的内容。
3. 使用 limit
参数控制执行范围
除了在 playbook
中直接指定 hosts
,你还可以使用 ansible-playbook
命令中的 --limit
选项来限制主机范围。例如:
ansible-playbook main_playbook.yml --limit webservers
这样可以只执行指定主机组 webservers
上的任务,而不需要修改 playbook
文件中的 hosts
设置。
总结:
- 可以通过在主
playbook
中统一指定hosts
,覆盖各个子playbook
的hosts
设置。 - 也可以为每个子
playbook
单独指定hosts
,在import_playbook
时动态传递。 - 使用
ansible-playbook --limit
命令参数来指定目标主机,也是一种灵活的方式。
通过这些方法,可以灵活地控制多个 playbook
的主机范围,并在需要时统一管理。