ansible playbook不限制主机

ansible playbook不限制主机,ansible,roles,ansible-playbook,limits,Ansible,Roles,Ansible Playbook,Limits,我有一个hosts文件,指定属于多个组的服务器: [web] 192.168.45.37 [integration] 192.168.45.37 [database] 192.168.45.37 在剧本中,不同的小组有不同的角色: - hosts: all roles: - { role: base, tags: ['base'] } - { role: logstash, tags: ['logstash'] } - hosts: database roles:

我有一个hosts文件,指定属于多个组的服务器:

[web]
192.168.45.37

[integration]
192.168.45.37

[database]
192.168.45.37
在剧本中,不同的小组有不同的角色:

- hosts: all
  roles:
    - { role: base, tags: ['base'] }
    - { role: logstash, tags: ['logstash'] }
- hosts: database
  roles:
    - { role: mysql, tags: ['database', 'mysql'] }
    - { role: mysql-backup, tags: ['database', 'mysql', 'backup'] }
- hosts: web
  roles:
    - { role: nginx, tags: ['web', 'nginx'] }
    - { role: ssl-certs, tags: ['web', 'ssl-certs'] }
- hosts: integration
  roles:
    - { role: jetty, tags: ['integration', 'jetty'] }
我的问题是,当我运行剧本时,试图通过使用“-limit”参数指定“group”来将剧本限制为只需要“roles”

ansible-playbook -i hosts site.yml -l integration

它最终会对服务器运行所有播放。为什么会这样?我能让它只运行与特定服务器组相关联的一组角色吗?

这是设计的-在封面下,限制是作为主机列表实现的,尽管限制表达式可以是主机和组的任意复杂组合。我们不排除没有在限制表达式中指定的组定义(听起来这正是您想要的)——这将严重阻碍限制表达式在更复杂用例中的应用

例如:如果你有一个剧本是针对两个群体的交叉点的,“mysite:&myrole”,我认为人们的期望是,如果你通过了mysite的极限表达式,它就会运行。如果我们显式删除限制表达式中未指定的组def的主机,则不会


在这里使用标签绝对是正确的,它们可以在游戏级别为特定于角色的内容指定,因此您不必为下面的每个角色/任务重复该部分。pre_tasks部分应该以与标记相同的方式运行(即,任务需要标记才能运行,但请确保您知道“始终”)-如果不知道,您肯定应该报告这一问题。

而不是-l集成,您可以使用-t集成,它将使用标记。虽然这是事实,但我发现使用“标记”不执行我在“site.yml”中指定的“pre_tasks”部分。(为了简单起见,我在描述中省略了它)。此外,这意味着我必须确保维护每个服务器组的“标记”,确保在标记列表中包含组名。这在我看来似乎很愚蠢。不幸的是,这是Ansible的预期行为。它将找到匹配的主机列表,然后获取这些主机所在的所有组的信息。