如何在Ansible中基于条件在两个不同inventory组执行相同任务
Ansible按条件选择inventory组执行方案
你原有写法的核心问题是hosts字段不支持直接附加when条件,when仅用于控制任务/角色/块的执行逻辑,不能用来筛选目标主机组,你可以通过以下两种方式实现需求:
方案1:Jinja2条件表达式(简单场景首选,推荐)
直接在hosts字段使用Jinja2三元表达式判断要执行的组,语法如下:
- name: Stop component hosts: "{{ 'group_A' if flag | bool else 'group_B' }}" roles: - stop
执行playbook时通过参数传入flag即可:
- 要在group_A执行:
ansible-playbook 你的playbook文件名.yml -e "flag=true" - 要在group_B执行:
ansible-playbook 你的playbook文件名.yml -e "flag=false"
方案2:动态分组(适合复杂筛选场景)
如果后续需要更复杂的分组逻辑(比如多组组合、结合主机属性筛选),可以用group_by模块先生成动态组再执行任务:
# 第一个play:生成动态目标组 - name: 动态筛选目标主机 hosts: all gather_facts: false tasks: - name: 将符合条件的主机加入动态组 ansible.builtin.group_by: key: "target_{{ 'A' if flag | bool else 'B' }}" when: (flag | bool and 'group_A' in group_names) or (not flag | bool and 'group_B' in group_names) # 第二个play:在目标组执行任务 - name: Stop component hosts: target_{{ 'A' if flag | bool else 'B' }} roles: - stop
内容的提问来源于stack exchange,提问作者Sugetha Chandran
相关产品推荐
相关产品推荐

