Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

380
Views
comando linux awk en bucle ansible

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.txt

tenga 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 : 0

aunque 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?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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: 0

Ahora, 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: 0

Combine 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
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!