通过“hosts”限制 ansible playbook
Limit ansible playbook by `hosts` of plays
我有一个清单文件,例如:
[my_domain]
255.255.255.255
[production:children]
my_domain
[load_balancer:children]
my_domain
[webservers:children]
my_domain
我有一个 playbook.yml
喜欢:
---
- hosts: webservers
gather_facts: no
tasks:
- debug:
msg: Hello webservers
- hosts: load_balancer
gather_facts: no
tasks:
- debug:
msg: Hello load_balancer
当 运行 执行以下命令时,它 运行 执行剧本中的两个剧本,即打印 "Hello webservers" 和 "Hello load_balancer":
ansible-playbook ./playbook.yml --limit "webservers:&production"
我可以通过向其添加标签并在命令行上使用 tags
使其仅 运行 网络服务器播放,例如:
...
- hosts: webservers
tags: ['webservers']
# or if using roles then:
# roles:
# - { role: provision_webserver, tags: [ 'provision_webservers' ] }
...
并使用:
ansible-playbook ./playbook.yml --limit "webservers:&production" --tags "webservers"
我希望 limit
arg 不仅适用于库存文件,而且适用于每场比赛的 hosts
价值。 The docs seem to suggest this is possible 尽管他们给出了使用 ansible
和一次性命令而不是 ansible-playbook
和剧本的示例:
This can mean what hosts to communicate with, but in terms of Playbooks it actually means what hosts to apply a particular configuration or IT process to.
我认为答案是我使用的剧本不对 should only have one play per playbook which necessarily means it will only have one hosts
and you select which plays you want to run by changing the playbook<-abc>.yml
you are using。但是,最后一个 link 还建议您可以只使用 --limit
来设置哪些主机。很困惑。
你是对的,根据 best practices,你可能希望将不同类型的配置拆分为单独的剧本,以便能够 运行 分开。
不过这段文字可能有点乱:
This is analogous to the “–limit” parameter to ansible but a little more explicit:
ansible-playbook site.yml --limit webservers
ansible-playbook webservers.yml
仅当 webservers
组中的主机不属于任何其他组时才为真。 否则(如您的示例)如果主机 server1
在 webservers
和 load_balancers
组中,然后将为该主机应用网络服务器和负载平衡器的播放。
此外,正如您正确指出的那样,您可以使用标签标记剧本的某些部分,并使用 --tags
根据此标准限制剧本 运行。
有时我会使用一个技巧让相同的主机使用不同的清单名称,以便 Ansible 将它们视为不同的主机:
[webservers]
myhost_ws ansible_host=myhost
[load_balancers]
myhost_lb ansible_host=myhost
这样 myhost_ws
和 myhost_lb
实际上是同一个服务器,但是 --limit webservers
只会执行这个剧本的第一个游戏:
- hosts: webservers
....
- hosts: load_balancers
....
但请记住,使用此设置,在第一次播放期间为 myhost_ws
收集的任何事实在第二次播放期间无法直接用于 myhost_lb
(但您仍然可以通过 hostvars['myhost_ws']
).
我有一个清单文件,例如:
[my_domain]
255.255.255.255
[production:children]
my_domain
[load_balancer:children]
my_domain
[webservers:children]
my_domain
我有一个 playbook.yml
喜欢:
---
- hosts: webservers
gather_facts: no
tasks:
- debug:
msg: Hello webservers
- hosts: load_balancer
gather_facts: no
tasks:
- debug:
msg: Hello load_balancer
当 运行 执行以下命令时,它 运行 执行剧本中的两个剧本,即打印 "Hello webservers" 和 "Hello load_balancer":
ansible-playbook ./playbook.yml --limit "webservers:&production"
我可以通过向其添加标签并在命令行上使用 tags
使其仅 运行 网络服务器播放,例如:
...
- hosts: webservers
tags: ['webservers']
# or if using roles then:
# roles:
# - { role: provision_webserver, tags: [ 'provision_webservers' ] }
...
并使用:
ansible-playbook ./playbook.yml --limit "webservers:&production" --tags "webservers"
我希望 limit
arg 不仅适用于库存文件,而且适用于每场比赛的 hosts
价值。 The docs seem to suggest this is possible 尽管他们给出了使用 ansible
和一次性命令而不是 ansible-playbook
和剧本的示例:
This can mean what hosts to communicate with, but in terms of Playbooks it actually means what hosts to apply a particular configuration or IT process to.
我认为答案是我使用的剧本不对 should only have one play per playbook which necessarily means it will only have one hosts
and you select which plays you want to run by changing the playbook<-abc>.yml
you are using。但是,最后一个 link 还建议您可以只使用 --limit
来设置哪些主机。很困惑。
你是对的,根据 best practices,你可能希望将不同类型的配置拆分为单独的剧本,以便能够 运行 分开。
不过这段文字可能有点乱:
This is analogous to the “–limit” parameter to ansible but a little more explicit:
ansible-playbook site.yml --limit webservers ansible-playbook webservers.yml
仅当 webservers
组中的主机不属于任何其他组时才为真。 否则(如您的示例)如果主机 server1
在 webservers
和 load_balancers
组中,然后将为该主机应用网络服务器和负载平衡器的播放。
此外,正如您正确指出的那样,您可以使用标签标记剧本的某些部分,并使用 --tags
根据此标准限制剧本 运行。
有时我会使用一个技巧让相同的主机使用不同的清单名称,以便 Ansible 将它们视为不同的主机:
[webservers]
myhost_ws ansible_host=myhost
[load_balancers]
myhost_lb ansible_host=myhost
这样 myhost_ws
和 myhost_lb
实际上是同一个服务器,但是 --limit webservers
只会执行这个剧本的第一个游戏:
- hosts: webservers
....
- hosts: load_balancers
....
但请记住,使用此设置,在第一次播放期间为 myhost_ws
收集的任何事实在第二次播放期间无法直接用于 myhost_lb
(但您仍然可以通过 hostvars['myhost_ws']
).