Запустить команду на хостах и получить сумму стандартного вывода в конце

#ansible

#ansible

Вопрос:

Я хочу запустить команду на y группах хостов, которая выдает ‘1’ в стандартном выводе. После запуска на всех хостах я хочу получить сумму всех 1.

Например, он выполняется на 5 хостах, для всех 5 хостов я получу 1 … в конце я хочу, чтобы в качестве выходных данных было 5

Или может быть способ выполнить команду и вычислить сумму только в одной задаче.

 - name: Check file in tmp
  shell: ls -ltrh /tmp/a.txt | wc -l
  register: count
  when: "'webserver' in group_names"
  

Ответ №1:

Одним из вариантов было бы создать временный файл и использовать его для общих целей. Воспроизведение ниже

 - hosts: test_jails
  gather_facts: true
  tasks:
    - name: Create tempfile
      tempfile:
        state: file
      register: fcounter
      run_once: true
      delegate_to: localhost
    - name: Write hostname to the tempfile
      shell: "echo {{ ansible_hostname }} >> {{ fcounter.path }}"
      delegate_to: localhost

      # < --------- HERE COMES THE PLAY --------- >

    - name: Print number of hosts
      shell: "cat {{ fcounter.path }} | wc -l"
      register: counter
      run_once: true
      delegate_to: localhost
    - debug:
        var: counter.stdout
      run_once: true
  

дает:

 ok: [test_01] => {
"counter.stdout": "3"
}
PLAY RECAP ****************************************************************
test_01                    : ok=5    changed=3    unreachable=0    failed=0   
test_02                    : ok=2    changed=1    unreachable=0    failed=0   
test_03                    : ok=2    changed=1    unreachable=0    failed=0
  

Ответ №2:

Если я получу ваши точные данные, вы можете получить результат без использования shell. Пожалуйста, обратите внимание, что для использования json_query в моем примере ниже требуется pip install jmespath . Если это невозможно, вы, скорее всего, можете достичь того же результата, используя map фильтр, объединяющий ‘extract’ и ‘attribute=’.

 - name: Check file exists on server
  stat:
    path: /tmp/a.txt
  register: a_file
  when: whatever_condition

- name: Count number of matches
  debug:
    msg: >-
      {{ 
        hostvars
        | json_query('*[].a_file.stat.exists')
        | map('ternary', 1, 0)
        | sum
      }}
  delegate_to: localhost
  run_once: true