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
我是 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