Ansible 按剧本的“主持人”限制易读剧本

Ansible 按剧本的“主持人”限制易读剧本,ansible,ansible-inventory,Ansible,Ansible Inventory,我有一个清单文件,如: [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 we

我有一个清单文件,如:

[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
当运行以下命令时,它会运行playbook中的两个播放,即打印“Hello WebServer”和“Hello load_balancer”:

我可以通过添加一个标记并在命令行上使用
tags
来让它只运行Web服务器播放,例如:

...
- 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
值也有效。尽管他们给出了使用
ansible
和一次性命令而不是
ansible playbook
和playbook的示例:

- hosts: webservers
  ....

- hosts: load_balancers
  ....
这可能意味着要与哪些主机通信,但就剧本而言,它实际上意味着要将特定配置或it流程应用于哪些主机

我认为答案是我使用了错误的剧本,这必然意味着它只有一个
主机
和。不过,最后一个链接也建议您只需使用
--limit
来设置哪些主机。非常混乱。

您是对的,因为您可能希望将不同类型的配置拆分为单独的剧本,以便能够单独运行它们

但这段文字可能有点混乱:

这类似于ansible的“-limit”参数,但更为明确:

ansible-playbook site.yml --limit webservers
ansible-playbook webservers.yml
只有当
webserver
组中的主机不属于任何其他组时,才是正确的。
否则(如您的示例中所示),如果主机
server1
位于
webserver
组和
load\u balancers
组中,则将为该主机应用Web服务器播放和负载均衡器

此外,正如您正确指出的,您可以使用标记标记playbook的某些部分,并使用
--tags
来限制playbook按此标准运行

有时,我会使用一种技巧,让同一主机具有不同的资源清册名称,以便Ansible将它们视为不同的主机:

[webservers]
myhost_ws ansible_host=myhost

[load_balancers]
myhost_lb ansible_host=myhost
这样一来,
myhost\u ws
myhost\u lb
实际上是同一台服务器,但是
--limit webserver
将只执行此剧本中的第一个播放:

- hosts: webservers
  ....

- hosts: load_balancers
  ....

但请记住,使用此设置,在第一次播放期间为
myhost\u ws
收集的任何事实在第二次播放期间都不可直接用于
myhost\u lb
(但您仍然可以通过
hostvars['myhost\u ws']
)获取它们。

“只有当WebServer组中的主机不属于任何其他组时,这才是正确的。”我也这么怀疑:)巧妙的把戏与
ansible\u主机=…
。目前,我将继续使用当前的多播放剧本和标签。谢谢你的快速回答。