【问题标题】:howto conditionally define hosts for a play in Ansible如何有条件地为 Ansible 中的游戏定义主机
【发布时间】:2021-12-01 21:32:47
【问题描述】:

我在多组节点上运行一组任务。 我为每组定义了组的节点都有一个专用的 INI 文件。

对于其中一个组,有一个节点('nfs_server')我想对其进行例外处理。 我创建了一个带有条件定义主机的剧本,例如:

  hosts: "{{ nfs_server if monitoring_enabled else '' }}"
  gather_facts: yes
  become: yes
  tasks:
    - debug: var=monitoring_enabled
    - name: install monitoring
      when: monitoring_enabled
      include: extras/setup_monitoring.yml

我尝试在清单或 group_vars 文件中定义变量,但我总是收到未定义变量的错误:

ERROR! The field 'hosts' has an invalid value, which includes an undefined variable. The error was: 'monitoring_enabled' is undefined.

当我将主机(临时)更改为“全部”时,运行完成,并且我看到变量已正确评估:

ok: [master1] => { "monitoring_enabled": "false" }

WA1:我确实找到了一个相当丑陋的解决方法,方法是使用“children”语句在我的库存中定义一个额外的组。然后必须使用适合我所有的节点来定义该组 我要添加额外监控的服务器,并在库存中为异常集清空。

WA2:我还在Can I use inventory data from a web service within a playbook? 中找到了一种解决方法,其中“add_host”用于创建动态组。我已经能够完成这项工作,但又不是很干净。

问题:有没有更简单的方法来有条件地定义播放的主机集?

强烈的偏好是这样的,我也可以有一个布尔值的默认值,这样我就不需要在任何地方定义它。

谢谢,M.

【问题讨论】:

  • 没有。没有更简单的方法。 add_host 的动态组是 playbook 中的唯一选项。

标签: ansible conditional-statements


【解决方案1】:

关于你的发现

...在我的库存中定义一个额外的组使用“孩子” 陈述。然后必须使用适当的节点定义该组 我所有的服务器...

我不认为这是一种解决方法。如果您的基础架构以某种方式结构化,那么您提到的方法将具有一些优势。假设您的库存看起来像

[infra:children]
prod
qa
dev

webserver
database

[infra:vars]
# No global variables yet

[prod:children]
webserver_prod
database_prod

[qa:children]
webserver_qa
database_qa

[dev:children]
webserver_dev
database_dev

# Logical services nodes

[webserver:children]
webserver_prod
webserver_qa
webserver_dev

[database:children]
database_prod
database_qa
database_dev

# List of all hosts

# [prod:children]

[webserver_prod]
web.prod.example.com

[database_prod]
primary.prod.example.com
secondary.prod.example.com

# [qa:children]

[webserver_qa]
web.qa.example.com

[database_qa]
primary.qa.example.com
secondary.qa.example.com

# [dev:children]

[webserver_dev]
web.dev.example.com

[database_dev]
primary.dev.example.com
secondary.dev.example.com

可以将剧本、任务等仅应用于该图中的某些节点,例如

ansible-inventory dev --graph
ansible-inventory database_dev --graph
...

所有都取决于库存的结构,但之后会更容易。

【讨论】:

  • 我认为“我不认为这是一种解决方法”是指这是最好的解决方案?感谢您确认。
  • @Monger39,关于“你的意思是这是最好的解决方案”,它适用于我和我的环境,只有 100 台服务器,这是我能找到的最简单和最简单的方法.因为我可以将我喜欢的任何角色(如防病毒、安全扫描、监控、备份、审计等)应用到任何主机、组或数据中心或网段,只需命名即可。
猜你喜欢
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 2011-06-19
  • 2021-05-10
  • 1970-01-01
相关资源
最近更新 更多