soy un principiante en el uso de awk. Usando ansible, quiero imprimir el resultado recibido del comando ping y luego escribirlo en el archivo. Los pings se realizan desde los hosts 10.0.0.3 y 10.0.0.6 a 10.0.0.1 y 10.0.0.2, respectivamente. La siguiente es una tarea ansible que tengo:
- name: CHECK PING shell: ping {{ item[0] }} -c 2 -s {{ item[1] }} | grep -i received | awk '{print "{{item[1]}} :\n"," {{item[0]}} :", $4}' 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.txttenga en cuenta que el elemento [1] es el origen del ping (10.0.0.3 y 10.0.0.6) y el elemento [0] es el destino del ping. el siguiente es el contenido de 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 : 0aunque la salida es correcta, no quiero una "clave" doble, por lo que la salida que quiero es:
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(es decir, concatenar los datos 10.0.0.3 y 10.0.0.6 para que su "clave" no sea doble). ¿Qué cambios se deben hacer en el script para obtener este resultado?
Configurar awk para imprimir YAML válido
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}}'Crear una lista de claves agrupadas
- set_fact: l1: "{{ p.results| map(attribute='stdout')| map('from_yaml')| map('dict2items')| flatten| groupby('key') }}"da
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: 0Ahora, combina el diccionario
- set_fact: d1: "{{ d1|d({})|combine({_key: _val}) }}" loop: "{{ l1 }}" vars: _key: "{{ item.0 }}" _val: "{{ item.1|map(attribute='value')|list }}"da
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: 0Combine los elementos de valor si desea obtener diccionarios en lugar de listas
_val: "{{ item.1|map(attribute='value')|combine }}"da el resultado esperado
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