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

编写Ansible Playbook:统计子目录数并在最少主机执行后续任务

问题:统计多台主机指定路径子目录数,并在数量最少的主机执行任务

我正在编写一份Ansible Playbook,需求为统计多台主机指定路径/var/docker下的子目录数量,随后在子目录数量最少的主机上执行另一组任务。目前我已成功获取各主机的子目录数量,但不知如何推进后续步骤,现有Playbook代码如下:

---
- name: Count subdirectories in /var/docker
  hosts: all
  gather_facts: no
  tasks:
    - name: Find subdirectories in /var/docker
      ansible.builtin.find:
        paths: /var/docker
        recurse: no
        file_type: directory
      register: found_dirs

    - name: Count subdirectories
      set_fact:
        subdirectory_count: "{{ found_dirs.files | length }}"

    - name: Display subdirectory count
      debug:
        var: subdirectory_count

解决方案

通过以下步骤可实现需求:

  1. 收集所有主机的subdirectory_count变量,生成主机名与对应子目录数的字典
  2. 对字典按子目录数排序,筛选出数值最小的主机
  3. 使用delegate_to将后续任务委派到该主机执行

完整Playbook代码如下:

---
- name: Count subdirectories and execute tasks on host with least dirs
  hosts: all
  gather_facts: no
  vars:
    # 生成主机名与子目录数的键值对字典
    host_count: "{{ dict(ansible_play_hosts | zip(ansible_play_hosts | map('extract', hostvars, 'subdirectory_count') | map('int'))) }}"
    # 筛选出子目录数最少的主机名
    host_count_min: "{{ (host_count | dict2items | sort(attribute='value') | first).key }}"

  tasks:
    - name: Find subdirectories in /var/docker
      ansible.builtin.find:
        paths: /var/docker
        recurse: no
        file_type: directory
      register: found_dirs

    - name: Count subdirectories
      set_fact:
        subdirectory_count: "{{ found_dirs.files | length }}"

    - name: Display subdirectory count
      debug:
        var: subdirectory_count

    # 仅执行一次,验证生成的字典和目标主机
    - block:
        - debug:
            var: host_count
        - debug:
            var: host_count_min
      run_once: true

    # 在子目录数最少的主机上执行自定义任务(示例为创建空文件)
    - name: Create empty file /tmp/AAA.txt on target host
      file:
        path: /tmp/AAA.txt
        state: touch
      delegate_to: "{{ host_count_min }}"

关键逻辑说明

  • host_count:通过ansible_play_hosts获取当前play的所有主机列表,结合map('extract')提取每台主机的子目录数,最终用dict()组合成主机名-子目录数的字典
  • host_count_min:将字典转换为列表项后按子目录数排序,取第一个元素的主机名即为目标主机
  • run_once: true:确保验证步骤仅在单台主机执行,避免重复输出
  • delegate_to:将后续任务的执行目标切换到筛选出的主机

内容的提问来源于stack exchange,提问作者dav.ge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:37:35