Dentro de mi libro de jugadas, me gustaría crear una variable que contenga la salida de un comando externo. Luego quiero hacer uso de esa variable en un par de plantillas.
Estas son las partes relevantes del libro de jugadas:
tasks:
- name: Create variable from command
command: "echo Hello"
register: command_output
- debug: msg="{{command_output.stdout}}"
- name: Copy test service
template: src=../templates/test.service.j2 dest=/tmp/test.service
- name: Enable test service
shell: systemctl enable /tmp/test.service
- name: Start test service
shell: systemctl start test.service
y digamos que esta es mi plantilla:
[Unit]
Description=MyApp
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox1
ExecStartPre=-/usr/bin/docker rm busybox1
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "while true; do echo {{ string_to_echo }}; sleep 1; done"
[Install]
WantedBy=multi-user.target
(Note el {{ string_to_echo }}
)
Entonces, lo que básicamente estoy buscando es una forma de almacenar el contenido de command_output.stdout
(que se genera / recupera durante la primera tarea) en una nueva variable string_to_echo
.
Esa variable que me gustaría usar en varias plantillas después.
Supongo que podría usarlo {{command_output.stdout}}
en mis plantillas, pero quiero deshacerme de eso .stdout
para mejorar la legibilidad.
fuente
.stdout
también.Una ligera modificación más allá de la respuesta de @ udondan. Me gusta reutilizar los nombres de las variables registradas con el
set_fact
para ayudar a mantener el desorden al mínimo.Entonces, si tuviera que registrarme usando la variable,
psk
usaría el mismo nombre de variable para crear elset_fact
.Ejemplo
Luego, cuando lo ejecuto:
fuente
Soy un novato en Ansible, pero sugeriría la siguiente solución:
playbook.yml
Debería funcionar (y funciona para mí) porque Ansible usa la evaluación perezosa. Pero parece que verifica la validez antes del lanzamiento, así que tengo que definirlo
command_output_full.stdout
en vars.Y, por supuesto, si hay demasiadas vars en la
vars
sección, se verá feo.fuente
En caso de que desee almacenar un comando complejo para comparar el resultado del texto, por ejemplo, para comparar la versión del sistema operativo, tal vez esto pueda ayudarlo:
fuente
Si desea ir más allá y extraer la información exacta que desea de los resultados de Playbook, use el lenguaje de consulta JSON como jmespath, un ejemplo:
fuente