编写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
解决方案
通过以下步骤可实现需求:
- 收集所有主机的
subdirectory_count变量,生成主机名与对应子目录数的字典 - 对字典按子目录数排序,筛选出数值最小的主机
- 使用
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
相关产品推荐
相关产品推荐

