我想在y主机组上运行一个命令,该命令在stdout中给出'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"
答案 0 :(得分:0)
一个选择是创建一个临时文件,并将其用于共享目的。下面的游戏
- 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
答案 1 :(得分:0)
如果我有确切的需求,则无需使用shell就可以得到结果。请注意,在下面的示例中使用json_query需要pip install jmespath
。如果无法做到这一点,则可以使用结合了“提取”和“属性=”的map
过滤器来达到相同的结果。
- 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