在主机上运行命令,最后输出标准输出总和

时间:2019-03-26 16:14:32

标签: ansible

我想在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"

2 个答案:

答案 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