tower - execute ansible yaml
Ansible: ¿Guardar el comando stdout en una nueva variable? (5)
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:
tasks:
- shell: echo $(cat /etc/issue | awk {''print $7''})
register: echo_content
- shell: echo "It works"
when: echo_content.stdout == "12"
register: out
- debug: var=out.stdout_lines
Dentro de mi libro de jugadas me gustaría crear una variable que contenga la salida de un comando externo. Después 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
(Observe 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 usar
{{command_output.stdout}}
en mis plantillas, pero quiero deshacerme de ese
.stdout
para
.stdout
lectura.
No hay necesidad de establecer un hecho.
- shell: cat "hello"
register: cat_contents
- shell: echo "I cat hello"
when: cat_contents.stdout == "hello"
Soy un novato en Ansible, pero sugeriría la siguiente solución:
playbook.yml
...
vars:
command_output_full:
stdout: will be overriden below
command_output: {{ command_output_full.stdout }}
...
...
...
tasks:
- name: Create variable from command
command: "echo Hello"
register: command_output_full
- debug: msg="{{ command_output }}"
Debería funcionar (y funciona para mí) porque Ansible usa una evaluación perezosa.
Pero parece que verifica la validez antes del lanzamiento, por lo que tengo que definir
command_output_full.stdout
en vars.
Y, por supuesto, si hay demasiados vars en la sección
vars
, se verá feo.
Tienes que almacenar el contenido como un hecho :
- set_fact:
string_to_echo: "{{ command_output.stdout }}"
Una ligera modificación más allá de la respuesta de @ udondan.
Me gusta reutilizar los nombres de las variables registradas con
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 al crear
set_fact
.
Ejemplo
- name: generate PSK
shell: openssl rand -base64 48
register: psk
delegate_to: 127.0.0.1
run_once: true
- set_fact:
psk={{ psk.stdout }}
- debug: var=psk
run_once: true
Entonces cuando lo ejecuto:
$ ansible-playbook -i inventory setup_ipsec.yml
PLAY [all] *************************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************************
ok: [hostc.mydom.com]
ok: [hostb.mydom.com]
ok: [hosta.mydom.com]
TASK [libreswan : generate PSK] ****************************************************************************************************************************************************
changed: [hosta.mydom.com -> 127.0.0.1]
TASK [libreswan : set_fact] ********************************************************************************************************************************************************
ok: [hosta.mydom.com]
ok: [hostb.mydom.com]
ok: [hostc.mydom.com]
TASK [libreswan : debug] ***********************************************************************************************************************************************************
ok: [hosta.mydom.com] => {
"psk": "6Tx/4CPBa1xmQ9A6yKi7ifONgoYAXfbo50WXPc1kGcird7u/pVso/vQtz+WdBIvo"
}
PLAY RECAP *************************************************************************************************************************************************************************
hosta.mydom.com : ok=4 changed=1 unreachable=0 failed=0
hostb.mydom.com : ok=2 changed=0 unreachable=0 failed=0
hostc.mydom.com : ok=2 changed=0 unreachable=0 failed=0