如何实现Ansible同地址主机组单任务仅执行一次及按唯一地址执行
Ansible 重复地址任务去重执行方案
一、组内所有主机地址相同时任务仅执行一次
如果你的group_host组内所有主机的ansible_host都指向同一个地址,想让任务只执行一次,可以用条件判断结合run_once实现:
- name: 仅当组内所有主机地址一致时执行任务 debug: msg: "任务仅执行一次" when: (groups['group_host'] | map('extract', hostvars, 'ansible_host') | unique | length) == 1 run_once: true
说明
这段逻辑会先提取组内所有主机的ansible_host值,去重后如果只剩一个结果(说明所有主机指向同一地址),就触发任务;run_once: true确保任务只在任意一台主机上执行一次,不会重复三次。
二、每个唯一服务器地址对应执行一次任务
如果组内存在多个不同地址,同时每个地址下有重复主机条目,想让每个唯一地址只执行一次任务,可以通过groupby按地址分组实现:
- name: 按唯一地址分组执行任务 debug: msg: "在地址 {{ item.0 }} 上执行任务" delegate_to: "{{ item.1.0.inventory_hostname }}" loop: "{{ groups['group_host'] | map('extract', hostvars) | groupby('ansible_host') }}" run_once: true
说明
- 先用
map('extract', hostvars)获取组内所有主机的变量集合,再用groupby('ansible_host')按服务器地址分组,每个唯一地址会生成一个分组; - 循环每个分组时,通过
delegate_to指定分组内的第一个主机作为执行目标(同组主机都指向同一地址,选任意一个都可以); run_once: true保证每个唯一地址对应的任务只执行一次,自动跳过重复的主机条目。
内容的提问来源于stack exchange,提问作者Wolf
相关产品推荐
相关产品推荐

