如何在指定数量的需更新包的主机上执行Ansible任务?
解决方案:从有更新的主机中选指定数量执行升级
1. 先在所有主机上检查待更新包
执行原有的检查任务,注意统一变量名(你之前的判断条件里写了stat_check_output,但实际注册的是stat_yum_check_output,这里要修正避免报错):
- name: yum check | Check for updates on all hosts yum: list: updates update_cache: true register: stat_yum_check_output become: true
2. 在控制节点筛选目标主机并创建临时组
通过add_host模块在控制节点一次性处理全局主机数据,筛选出有更新的主机,再取前number_of_hosts台加入临时组hosts_to_upgrade:
- name: Select target hosts for upgrade add_host: name: "{{ item }}" groups: hosts_to_upgrade loop: "{{ ansible_play_hosts | select('extract', hostvars) | selectattr('stat_yum_check_output.results', 'defined') | selectattr('stat_yum_check_output.results', 'length', '>', 0) | map(attribute='inventory_hostname') | list | first(number_of_hosts) }}" run_once: true delegate_to: localhost
这段过滤逻辑的作用:
ansible_play_hosts:获取当前剧本的所有目标主机- 筛选出有
stat_yum_check_output.results且结果长度大于0的主机(即有更新包的主机) - 提取主机名后取前
number_of_hosts台(需提前定义变量number_of_hosts: 3)
3. 对临时组主机执行升级任务
直接针对临时组hosts_to_upgrade执行升级操作,确保只有选中的主机运行该任务:
- name: Upgrade all packages, excluding java ansible.builtin.yum: name: '*' state: latest exclude: java* become: true hosts: hosts_to_upgrade
如果需要在同一个play内完成,也可以用when条件判断主机是否在临时组中:
- name: Upgrade all packages, excluding java ansible.builtin.yum: name: '*' state: latest exclude: java* become: true when: inventory_hostname in groups['hosts_to_upgrade']
内容的提问来源于stack exchange,提问作者Sir_Yaro
相关产品推荐
相关产品推荐

