es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ejecutar comando jq en tareas de Ansible.

Quiero tener un archivo que consista en la combinación de dos archivos en loop, y estoy usando Ansible para repetir el comando jq. Estas son mis tareas en el playbook:

  • nombre: COMBINAR ARCHIVOS JSON
    shell: jq -s ‘{bgp_verif:.[0], vni_verif:.[1]}’ {{ item.name }}-bgp.json {{ item.name }}-vni.json > {{ item.name }}-result.json
    with_file:

    • “/containers/http_server/data/verif_json/{{ item.name }}-bgp.json”
    • “/containers/http_server/data/verif_json/{{ item.name }}-vni.json”
      loop: “{{ get_devices.json.results }}”
      when: “item.device_type.manufacturer.slug == ‘cumulus-linux'”

Después de ejecutar el playbook, obtengo este error:

Se produjo una excepción durante la ejecución de la tarea. Para ver la traza completa, use -vvv. El error fue: AttributeError: el objeto ‘dict’ no tiene el atributo ‘startswith’
fatal: [localhost]: FAILED! => {“msg”: “Fallo inesperado durante la ejecución del módulo.”, “stdout”: “”}

¿Estoy omitiendo algo en mis tareas? Agradecería mucho si pudieras decirme cómo solucionar este error, gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Basado en el mensaje de error que recibiste, parece que el problema está en la condición del loop en tu playbook. El mensaje de error está indicando que hay un problema con la forma en que se llama al método startswith en un objeto diccionario.

    Para solucionar este error, debes comprobar el valor de la variable get_devices.json.results para asegurarte de que es una lista de diccionarios, y no un diccionario en sí mismo. También puedes intentar utilizar el filtro json_query en lugar de jq para combinar los archivos JSON, ya que puede ser una forma más fiable de manejar datos JSON dentro de Ansible.

    Otra posible solución es utilizar la directiva with_items en lugar de loop para iterar sobre una lista de elementos.

    Por ejemplo, podrías intentar el siguiente playbook:

    - name: COMBINAR ARCHIVOS JSON
      shell: jq -s '{bgp_verif:.[0], vni_verif:.[1]}' {{ item.name }}-bgp.json {{ item.name }}-vni.json > {{ item.name }}-result.json
      with_items:
        - "{{ get_devices.json.results }}"
      when: "item.device_type.manufacturer.slug == 'cumulus-linux'"
    

    Este playbook iterará sobre la lista get_devices.json.results y solo ejecutará el comando shell para dispositivos con cumulus-linux como fabricante. No debería tener problemas con el método startswith.

    ¡Espero que esto ayude! Avísame si tienes alguna pregunta adicional.

Comments are closed.