не удается вывести stdout для каждого элемента цикла в ansible

#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 имеет встроенный учет результатов итераций цикла.

https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#registering-variables-with-a-loop

 ---

- 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']