【问题标题】:ansible-playbook not limiting hostsansible-playbook 不限制主机
【发布时间】:2015-11-17 07:25:52
【问题描述】:

我有一个 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”参数指定“组”所需的“角色”,例如

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

它最终对服务器运行所有的游戏。为什么这样做?我可以让它只运行与该特定服务器组关联的一组播放/角色吗?

【问题讨论】:

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

标签: ansible roles ansible-playbook limits


【解决方案1】:

这是设计使然,限制是作为主机列表实现的,尽管限制表达式可以是主机和组的任意复杂组合。我们不排除未在限制表达式中指定的组定义(听起来这就是您想要的) - 这会严重阻碍限制表达式在更复杂的用例中的实用性。

例如:如果你有一个针对两个组的交集的剧本,“mysite:&myrole”,我认为如果你通过了 mysite 的限制表达式,它就会运行。如果我们为未在限制表达式中指定的组定义显式删除主机,则不会。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-04
    • 2022-08-15
    • 1970-01-01
    • 2021-01-17
    • 2020-11-13
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多