#ansible #ansible-facts
Вопрос:
Команда,
Я хочу вывести значение каждого вывода элемента, на который я зациклился. Мой случай заключается в том, чтобы найти размер каталога списка директорий, передаваемых в цикле. поэтому я не могу распечатать имя и размер каталога, которые получаю из вывода моей команды du -sk /core
, например, в одном случае
задача
- name: Calculate directories size
command: "du -sk /{{ item }}"
register: folder_size_raw
with_items: "{{ directories }}"
ignore_errors: yes
tags: tag_directories_size
- set_fact:
stdout_lines: []
- set_fact:
stdout_lines: "{{ stdout_lines item.stdout_lines }}"
with_items: "{{ folder_size_raw.results }}"
- debug:
msg: "This is a stdout line: {{ item }}"
with_items: "{{ stdout_lines }}"
vars/main.yaml
#variables
directories: ["core", "home", "lib", "mnt", "root", "raid", "usr", "var/lib", "var"]
выход
16:07:51 PLAY [Node_Operations] *********************************************************
16:07:51 TASK [node_operations : Calculate directories size] ****************************
16:07:51 Saturday 06 March 2021 00:07:51 0000 (0:00:00.153) 0:00:00.153 ********
16:07:54 changed: [node1] => (item=core)
16:07:57 changed: [node1] => (item=home)
16:07:57 changed: [node1] => (item=lib)
16:07:57 changed: [node1] => (item=mnt)
16:07:58 changed: [node1] => (item=root)
16:07:59 changed: [node1] => (item=raid)
16:07:59 changed: [node1] => (item=usr)
16:10:28 changed: [node1] => (item=var/lib)
16:13:31 changed: [node1] => (item=var)
16:13:31
ожидаемый
16:07:51 PLAY [Node_Operations] *********************************************************
16:07:51
16:07:51 TASK [node_operations : Calculate directories size] ****************************
16:07:51 Saturday 06 March 2021 00:07:51 0000 (0:00:00.153) 0:00:00.153 ********
16:07:54 changed: [node1] => (item=core)
16:07:57 changed: [node1] => (item=home)
16:07:57 changed: [node1] => (item=lib)
16:07:57 changed: [node1] => (item=mnt)
16:07:58 changed: [node1] => (item=root)
16:07:59 changed: [node1] => (item=raid)
16:07:59 changed: [node1] => (item=usr)
16:10:28 changed: [node1] => (item=var/lib)
16:13:31 changed: [node1] => (item=var)
16:13:31
This is a stdout line: 1GB /core
This is a stdout line: 3GB /home
......
....
...
Комментарии:
1. Как насчет прямого перебора
folder_size_raw.results
и отладкиitem.stdout_lines
? Или вам нужен аккумуляторitem.stdout_lines
для другого использования? Вы можете напрямую получить список каждого атрибута списка сmap
помощью фильтра:stdout_lines: "{{ folder_size_raw.results | map(attribute='stdout_lines') }}"
без зацикливания и накопления.
Ответ №1:
Ansible имеет встроенный учет результатов итераций цикла.
---
- name: localhost
hosts: localhost
vars:
directories: ["home", "usr/share/doc", "usr/local"]
tasks:
- name: Calculate directories size
command: "du -sk /{{ item }}"
register: folder_size_raw
with_items: "{{ directories }}"
ignore_errors: yes
register: dir_size_loop
tags: tag_directories_size
- debug:
var: dir_size_loop['results']