【发布时间】:2021-11-19 19:16:02
【问题描述】:
我希望能够确定多个主机上特定目录列表的平均大小。我首先在主机上找到我想要的目录,评估它们的大小并将结果放入一个不错的字典中:
- name: find log dirs
shell: "find / -type d -name 'log' 2>/dev/null | sort"
register: log_list
- name: evaluate dir sizes
shell: "du -sk {{ item }} | awk '{ print $1 }'"
register: folder_size
loop : "{{ log_list.stdout_lines }}"
- name: build dict
set_fact:
folder_info: "{{ folder_info|default({}) | combine({item.item: {'path': item.item, 'size': item.stdout|int}}) }}"
loop: "{{ folder_size.results }}"
回到 Ansible 控制器,我将所有这些 dicts 放在一个不错的大 dict 中,并放在一起 dirs 列表:
- name: gather folder info
set_fact:
all_dirs: "{{ all_dirs|default([]) + hostvars[item].dir_list|unique }}"
all_folder_info: "{{ all_folder_info|default({}) | combine({hostvars[item].inventory_hostname:hostvars[item].folder_info}) }}"
loop: "{{ groups['backoffice'] }}"
调试 all_folder_info 给了我这样的东西:
TASK [debug] *******************************************************************
ok: [localhost] => {
"all_folder_info": {
"some.host.com": {
"/some/directory/": {
"path": "/some/directory",
"size": 220
},
"/some/other/directory": {
"path": "/some/other/directory",
"size": 8
},
"/some/third/directory": {
"path": "/some/third/directory",
"size": 319404
}
},
我现在需要遍历这个巨大的字典来提取我想要的信息并对其进行数学运算,但我被困住了。我试过这样压缩,Ansible 说不能模板:
- name: debug
debug:
var: (all_folder_info[item.0].[item.1].size | sum) / (all_folder_info[item.0].[item.1].size | length)
loop: "{{ groups['backoffice']|zip_longest(all_dirs|unique)|list }}"
这似乎充其量只是将两个列表放入键:值对中。我做错了什么?
【问题讨论】:
-
我想了解你最后想要得到什么,如果我误解了,请告诉我。对于
backoffice组中的每个主机,您希望通过在all_folder_info[someHost]中查找该主机来打印出平均目录大小。 -
没错。所以我的直觉是我需要同时在 [someHost] 和 [someDir] 上循环来实现...
标签: python ansible yaml jinja2