Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

383
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda