You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在指定数量的需更新包的主机上执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:20:25