linux ansible循环中的awk命令

linux awk command in ansible looping

我是 awk 的初学者。使用ansible,我想打印接收到的ping命令的输出,然后将其写入文件。 ping 分别从主机 10.0.0.3 和 10.0.0.6 到 10.0.0.1 和 10.0.0.2。以下是我的任务:

- name: CHECK PING
  shell: ping {{ item[0] }} -c 2 -s {{ item[1] }} | grep -i received | awk '{print "{{item[1]}} :\n"," {{item[0]}} :", }'
  register: p
  with_nested:
  - [ '10.0.0.1', '10.0.0.2' ]
  - [ '10.0.0.3', '10.0.0.6' ]

- copy:
    content: "{{ p.results | map(attribute='stdout') | join('\n')}}"
    dest: ping.txt

请记住,item[1] 是 ping 源(10.0.0.3 和 10.0.0.6),item[0] 是 ping 目标。以下是ping.txt

的内容
10.0.0.3 :
   10.0.0.1 : 2
10.0.0.6 :
   10.0.0.1 : 2
10.0.0.3 :
   10.0.0.2 : 0
10.0.0.6 :
   10.0.0.2 : 0

虽然输出是正确的,但我不想要双“钥匙”,所以我想要的输出是:

10.0.0.3 :
   10.0.0.1 : 2
   10.0.0.2 : 0
10.0.0.6 :
   10.0.0.1 : 2
   10.0.0.2 : 0

(即连接数据 10.0.0.3 和 10.0.0.6,以便它们的“密钥”不是双重的)。需要对脚本进行哪些更改才能获得此结果?

配置awk打印有效的YAML

    p:
      results:
        - stdout: '{10.0.0.3: {10.0.0.1: 2}}'
        - stdout: '{10.0.0.6: {10.0.0.1: 2}}'
        - stdout: '{10.0.0.3: {10.0.0.2: 0}}'
        - stdout: '{10.0.0.6: {10.0.0.2: 0}}'

创建分组键列表

    - set_fact:
        l1: "{{ p.results|
                map(attribute='stdout')|
                map('from_yaml')|
                map('dict2items')|
                flatten|
                groupby('key') }}"

给予

l1:
  - - 10.0.0.3
    - - key: 10.0.0.3
        value:
          10.0.0.1: 2
      - key: 10.0.0.3
        value:
          10.0.0.2: 0
  - - 10.0.0.6
    - - key: 10.0.0.6
        value:
          10.0.0.1: 2
      - key: 10.0.0.6
        value:
          10.0.0.2: 0

现在,合并字典

    - set_fact:
        d1: "{{ d1|d({})|combine({_key: _val}) }}"
      loop: "{{ l1 }}"
      vars:
        _key: "{{ item.0 }}"
        _val: "{{ item.1|map(attribute='value')|list }}"

给予

d1:
  10.0.0.3:
    - 10.0.0.1: 2
    - 10.0.0.2: 0
  10.0.0.6:
    - 10.0.0.1: 2
    - 10.0.0.2: 0

如果您想获取字典而不是列表,请合并值项

        _val: "{{ item.1|map(attribute='value')|combine }}"

给出了预期的结果

  d1:
    10.0.0.3:
      10.0.0.1: 2
      10.0.0.2: 0
    10.0.0.6:
      10.0.0.1: 2
      10.0.0.2: 0