通过“主机”来限制 ansible playbook

AJP*_*AJP 4 ansible ansible-inventory

我有一个清单文件,如:

[my_domain]
255.255.255.255

[production:children]
my_domain


[load_balancer:children]
my_domain

[webservers:children]
my_domain
Run Code Online (Sandbox Code Playgroud)

我有一个playbook.yml喜欢:

---

- hosts: webservers
  gather_facts: no
  tasks:
    - debug:
        msg: Hello webservers

- hosts: load_balancer
  gather_facts: no
  tasks:
    - debug:
        msg: Hello load_balancer
Run Code Online (Sandbox Code Playgroud)

运行以下命令时,它会运行剧本中的两个剧本,即打印“Hello webservers”和“Hello load_balancer”:

ansible-playbook ./playbook.yml --limit "webservers:&production"
Run Code Online (Sandbox Code Playgroud)

我可以通过向它添加标签并tags在命令行上使用来让它只运行网络服务器播放,例如:

...
- hosts: webservers
  tags: ['webservers']
  # or if using roles then:
  # roles:
  #   - { role: provision_webserver, tags: [ 'provision_webservers' ] }
  ...
Run Code Online (Sandbox Code Playgroud)

并使用:

ansible-playbook ./playbook.yml --limit "webservers:&production" --tags "webservers"
Run Code Online (Sandbox Code Playgroud)

我希望limitarg 不仅适用于库存文件,而且适用于hosts每次播放的价值。 文档似乎表明这是可能的,尽管他们给出了使用ansible和一次性命令而不是ansible-playbook剧本的示例:

这可能意味着要与哪些主机通信,但就 Playbooks 而言,它实际上意味着将特定配置或 IT 流程应用于哪些主机。

我认为答案是,我使用的剧本错误的,应该只有每个剧本一次玩这必然意味着它只会有一个hosts你选择你想通过改变运行起着playbook<-abc>.yml您使用。但是,最后一个链接还建议您可以仅使用--limit来设置哪些主机。非常困惑。

Kon*_*rov 8

您是对的,根据最佳实践,您可能希望将不同类型的配置拆分为单独的剧本,以便能够单独运行它们。

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

这类似于 ansible 的“–limit”参数,但更明确一点:

ansible-playbook site.yml --limit webservers
ansible-playbook webservers.yml
Run Code Online (Sandbox Code Playgroud)

仅当webservers组中的主机不属于任何其他组时才为真。否则(如您的示例),如果主机server1在组中webservers并且load_balancers,则为网络服务器和负载均衡器的播放将应用于该主机。

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

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

[webservers]
myhost_ws ansible_host=myhost

[load_balancers]
myhost_lb ansible_host=myhost
Run Code Online (Sandbox Code Playgroud)

这种方式myhost_wsmyhost_lb实际上是同一台服务器,但--limit webservers会从这个剧本只执行第一次玩:

- hosts: webservers
  ....

- hosts: load_balancers
  ....
Run Code Online (Sandbox Code Playgroud)

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