Escribir variable en un archivo en Ansible

101

Estoy extrayendo JSON a través del módulo URI y quiero escribir el contenido recibido en un archivo. Puedo obtener el contenido y enviarlo al depurador, así que sé que se ha recibido el contenido, pero no conozco las mejores prácticas para escribir archivos.

Keith Adler
fuente

Respuestas:

200

Podrías usar el copymódulo, con el contentparámetro:

- copy: content="{{ your_json_feed }}" dest=/path/to/destination/file

Los documentos aquí: módulo de copia

Ramón de la Fuente
fuente
5
content = "{{your_json_feed}}" trata con espacios en blanco y nuevas líneas. Las citas son importantes.
m.kocikowski
@RamondelaFuente Si quisiera agregar contenido de varias vars al archivo, necesito usar el módulo "copiar" varias veces o hay alguna otra forma?
KishoreReddy
1
@KishoreReddy Me imagino que puedes usar la sintaxis jinja2 para agregar variables. Algo como "{{variable ~ otra_variable}}". No es bonito, pero si las cosas se complican, puede usar el template:módulo y llenarlo con las variables registradas en tiempo de ejecución.
Ramon de la Fuente
Esto funciona mejor cuando desea generar un archivo de suma sha256 en el formulario shahash /path/to/file(nota 2 espacios entre) y luego validar desde la línea de comando (vía sha256sum -c shafile) lo que generó a través de Ansible.
Daniel Andrei Mincă
11

A menos que esté escribiendo archivos muy pequeños, probablemente debería usar plantillas .

Ejemplo:

- name: copy upstart script
  template: 
    src: myCompany-service.conf.j2 
    dest: "/etc/init/myCompany-service.conf"
Janus Troelsen
fuente
2
Aunque la respuesta de Ramón aborda exactamente lo que se preguntó, esta respuesta es el mejor enfoque en general. Por ejemplo, si tiene un libro de jugadas que crea VM en la nube y le gustaría generar un inventario de hosts para otro libro de jugadas, una plantilla es el camino a seguir.
Luis Artola
¿Puedes explicar por qué esto es mejor?
Vorticity
@Vorticidad mejor que qué?
Janus Troelsen
@JanusTroelsen Lo siento, ¿puede explicar por qué es mejor que la respuesta aceptada al escribir archivos grandes?
Vorticity
1
@Vorticidad porque se vuelve difícil de manejar cuando tiene un archivo incrustado en otro archivo. necesita escapar y el resaltado de sintaxis no funcionará. el mecanismo de plantillas permite insertar cosas en el medio si lo necesita.
Janus Troelsen
9

Según la respuesta de Ramón, me encuentro con un error. El problema donde los espacios en el JSON que intenté escribir lo solucioné cambiando la tarea en el libro de jugadas para que se pareciera a:

- copy:
    content: "{{ your_json_feed }}"
    dest: "/path/to/destination/file"

A partir de ahora, no estoy seguro de por qué fue necesario. Mi mejor suposición es que tuvo algo que ver con cómo se reemplazan las variables en Ansible y se analiza el archivo resultante.

Tobias Kremer
fuente
0

Podemos especificar directamente el archivo de destino con la destopción ahora. En el siguiente ejemplo, el json de salida se almacena en el/tmp/repo_version_file

- name: Get repository file repo_version model to set ambari_managed_repositories=false
  uri:
    url: 'http://<server IP>:8080/api/v1/stacks/HDP/versions/3.1/repository_versions/1?fields=operating_systems/*'
    method: GET
    force_basic_auth: yes
    user: xxxxx
    password: xxxxx
    headers:
      "X-Requested-By": "ambari"
      "Content-type": "Application/json"
    status_code: 200
    dest: /tmp/repo_version_file
venkata
fuente