限制ansible playbook的`plays`主机。

5

我有一个像这样的库存文件:

[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中的两个plays,即打印"Hello webservers"和"Hello load_balancer":

ansible-playbook ./playbook.yml --limit "webservers:&production"

我可以通过添加标签并在命令行中使用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 参数不仅适用于清单文件,还适用于每个 play 的 hosts 值。文档似乎表明这是可能的,尽管它们使用 ansible 和一次性命令而不是 ansible-playbook 和 playbook 来举例:(参见文档)

这可以表示要与哪些主机通信,但在 Playbooks 方面,它实际上意味着将某个配置或 IT 过程应用于哪些主机。

我认为答案是我错误地使用了 playbooks,并且每个 playbook 只能有一个 play,这必然意味着它只有一个 hosts,并且你通过更改所使用的 playbook<-abc>.yml 来选择要运行的 plays。然而,最后一个链接也建议你可以使用 --limit 来设置要使用的主机。非常困惑。
1个回答

10

你说得对,根据最佳实践,您可能希望将不同类型的配置拆分到单独的playbook中以便能够单独运行它们。

但是这段文字可能会有点令人困惑:

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

ansible-playbook site.yml --limit webservers
ansible-playbook webservers.yml

只有当webservers组中的主机不属于任何其他组时才为真。 否则(就像您的示例一样),如果主机server1webserversload_balancers组中,则将应用于此主机的是webservers和load balancers中的playbooks。

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

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

[webservers]
myhost_ws ansible_host=myhost

[load_balancers]
myhost_lb ansible_host=myhost

这样,myhost_wsmyhost_lb实际上是同一台服务器,但--limit webservers将仅执行此剧本中的第一个任务:

这里,myhost_wsmyhost_lb指的是同一台服务器,但是在使用--limit webservers参数时,只有此剧本中的第一个任务会被执行。

- hosts: webservers
  ....

- hosts: load_balancers
  ....

请记住,使用此设置,在第一次播放期间收集的任何有关myhost_ws的信息不会直接对第二次播放中的myhost_lb可用(但您仍可以通过hostvars ['myhost_ws']获取它们)。


只有当webservers组中的主机不属于任何其他组时,才为真。我早就猜到了 :) ansible_host=... 是个好技巧。目前我会继续使用当前的多播放剧本和标签。感谢您的快速回答。 - AJP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接