#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