通过“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 组中的主机不属于任何其他组时才为真。 否则(如您的示例)如果主机 server1webserversload_balancers 组中,然后将为该主机应用网络服务器和负载平衡器的播放。

此外,正如您正确指出的那样,您可以使用标签标记剧本的某些部分,并使用 --tags 根据此标准限制剧本 运行。

有时我会使用一个技巧让相同的主机使用不同的清单名称,以便 Ansible 将它们视为不同的主机:

[webservers]
myhost_ws ansible_host=myhost

[load_balancers]
myhost_lb ansible_host=myhost

这样 myhost_wsmyhost_lb 实际上是同一个服务器,但是 --limit webservers 只会执行这个剧本的第一个游戏:

- hosts: webservers
  ....

- hosts: load_balancers
  ....

但请记住,使用此设置,在第一次播放期间为 myhost_ws 收集的任何事实在第二次播放期间无法直接用于 myhost_lb(但您仍然可以通过 hostvars['myhost_ws']).