在 Ansible 动态清单中,如何按标签过滤主机?

Posted

技术标签:

【中文标题】在 Ansible 动态清单中,如何按标签过滤主机?【英文标题】:In Ansible dynamic inventory, how do I filter host by a tag? 【发布时间】:2021-03-04 01:37:51 【问题描述】:

堆栈:

    Git 存储库 Ansible AWX,具体来说,AzureRM Inventory Plugin

问题:只有当虚拟机具有特定标签并且该标签具有特定价值时,我才需要在库存中导入虚拟机。

背景: Azure Inventory 插件有一个过滤器“exclude_host_filters”,下面的文档中提供了示例:

# excludes a host from the inventory when any of these expressions is true, can refer to any vars defined on the host
exclude_host_filters:
# excludes hosts in the eastus region
- location in ['eastus']
# excludes hosts that are powered off
- powerstate != 'running'

问题:我正在尝试在排除主机过滤器中使用标签。逻辑上我需要:

    过滤所有带有“所有者”标签的主机。 然后过滤所有标签为“owner”且值为“testing_ansible”的主机。

这是我尝试做的:

exclude_host_filters:
- if tags.owner is defined
- tags.owner != 'testing_ansible'

我也尝试了其他过滤器,但没有奏效。文档需要 jinja2 格式。 如何检查标签是否存在以及是否具有一定的价值导入主机?

【问题讨论】:

【参考方案1】:

根据the inventory plugin source code,exclude_host_filters 或default_host_filters 中定义的过滤器使用此表达式进行评估:

"% if filter % True % else % False % endif %"

您的第一个过滤器中的 if 不允许评估此表达式。 检查标签是否存在并具有一定的价值:

exclude_host_filters:
- tags.owner is defined
- tags.owner != 'testing_ansible'

【讨论】:

以上是关于在 Ansible 动态清单中,如何按标签过滤主机?的主要内容,如果未能解决你的问题,请参考以下文章

Ansible AWS 动态清单实例过滤器不起作用

Ansible 文档译文主机清单文件

Ansible 五(inventory文件 主机清单)

Ansible---Inventory(主机清单)与YAML文件

ansible的主机清单,yml语法,playbook详解+操作

自动化运维之Ansible基础元素介绍