我能够在单个主机上找到变量totalsize
中所有三个文件的总大小,如下所示。
猫所有主机
[destnode]
myhost1
myhost2
myhost3
猫myplay.yml
- name: "Play 1"
hosts: "destnode"
gather_facts: false
tasks:
- name: Fail if file size is greater than 2GB
include_tasks: "{{ playbook_dir }}/checkfilesize.yml"
with_items:
- "{{ source_file_new.splitlines() }}"
cat checkfilesize.yml
- name: Check file size
stat:
path: "{{ item }}"
register: file_size
- set_fact:
totalsize: "{{ totalsize | default(0) |int + ( file_size.stat.size / 1024 / 1024 ) | int }}"
- debug:
msg: "TOTALSIZE: {{ totalsize }}"
要运行:
ansible-playbook -i all.hosts myplay.yml -e source_file_new="/tmp/file1.logn/tmp/file1.logn/tmp/file1.log"
上面的播放效果很好,它为我提供了各个主机上变量source_file_new
中提到的所有文件的大小总和。
我的要求是从提到的destnode
组的所有三个(或更多(主机中获得所有文件的总大小。
因此,如果每个主机上的每个文件都是10MB,那么当前的剧本在主机1上打印10+10+10=30MB,在主机2和主机3上打印一样。
相反,我希望来自所有主机的所有大小的总和,如下面的
host1 (10+10+10) + host2 (10+10+10) + host3 (10+10+10) = 90MB
从hostvars
中提取destnode
中每个节点的totalsize
事实,并将它们相加。
简而言之,在当前checkfilesize.yml
任务文件的末尾,替换调试任务:
- name: Show total size for all nodes
vars:
overall_size: "{{ groups['destnode'] | map('extract', hostvars, 'totalsize')
| map('int') | sum }}"
debug:
msg: "Total size for all nodes: {{ overall_size }}"
run_once: true
如果以后需要重用该值,可以立即将其存储在一个事实中,该事实将为所有主机设置相同的值:
- name: Set overall size as fact for all hosts
set_fact:
overall_size: "{{ groups['destnode'] | map('extract', hostvars, 'totalsize')
| map('int') | sum }}"
run_once: true
- name: Show the overall size (on result with same value for each host)
debug:
msg: "Total size for all nodes: {{ overall_size }} - (from {{ inventory_hostname }})"
作为替代方案,您可以在播放级别用变量声明来替换set_fact
。