如何让Ansible任务在主机属于含指定后缀的组时执行?
Ansible任务条件:匹配包含指定子串的主机组
问题背景
某主机的group_names事实数据如下:
ok: [domain.examle.com] => { "ansible_facts": { "group_names": [ "abc", "abc_b", "abc_b_p", "abc_b_p_mn", "abc_b_p_shd" ] }, "changed": false }
需要设置任务执行条件,当主机所属组名包含_shd或_mn时运行对应任务,原使用的when: "'_shd' in group_names"仅能匹配完整组名,无法满足需求。
可行解决方案
利用Ansible的any()过滤器遍历group_names列表,检查每个组名是否包含目标子串:
1. 匹配单个子串(以_shd为例)
when: group_names | any('_shd' in item for item in group_names)
2. 匹配多个子串(_shd或_mn)
写法一:拆分判断用or连接
when: group_names | any('_shd' in item for item in group_names) or group_names | any('_mn' in item for item in group_names)
写法二:单过滤器内组合判断
when: group_names | any(('_shd' in item) or ('_mn' in item) for item in group_names)
写法三:正则匹配(精准匹配结尾子串)
如果需要仅匹配以_shd或_mn结尾的组名,可使用正则search过滤器:
when: group_names | any(item | search('_(shd|mn)$') for item in group_names)
若只需包含子串而非结尾,去掉正则中的$即可:
when: group_names | any(item | search('_(shd|mn)') for item in group_names)
效果说明
以上所有写法都会遍历主机的全部组名,只要存在任意一个组名符合匹配规则,条件就会成立,任务将被执行。
内容的提问来源于stack exchange,提问作者Po_temkin
相关产品推荐
相关产品推荐

