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.
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étodostartswith
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 filtrojson_query
en lugar dejq
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 deloop
para iterar sobre una lista de elementos.Por ejemplo, podrías intentar el siguiente playbook:
Este playbook iterará sobre la lista
get_devices.json.results
y solo ejecutará el comandoshell
para dispositivos concumulus-linux
como fabricante. No debería tener problemas con el métodostartswith
.¡Espero que esto ayude! Avísame si tienes alguna pregunta adicional.