register - modulo shell ansible
Cómo hacer un script de shell multilínea en Ansible (3)
Agregar un espacio antes del delimitador EOF permite evitar cmd:
- shell: |
cat <<'' EOF''
This is a test.
EOF
en este momento estoy usando un script de shell en ansible que sería mucho más legible si estuviera en varias líneas
- name: iterate user groups
shell: groupmod -o -g {{ item[''guid''] }} {{ item[''username''] }} ....more stuff to do
with_items: "{{ users }}"
Simplemente no estoy seguro de cómo permitir el script multilínea en el módulo de shell Ansible
Ansible usa la sintaxis YAML en sus libros de jugadas. YAML tiene varios operadores de bloque:
-
El
>
es un operador de bloque plegable. Es decir, une varias líneas juntas por espacios. La siguiente sintaxis:key: > This text has multiple lines
Asignaría el valor
This text has multiple lines/n
para lakey
. -
El
|
El carácter es un operador de bloque literal. Esto es probablemente lo que desea para los scripts de shell de varias líneas. La siguiente sintaxis:key: | This text has multiple lines
This text/nhas multiple/nlines/n
el valorThis text/nhas multiple/nlines/n
a lakey
.
Puede usar esto para scripts de shell multilínea como este:
- name: iterate user groups
shell: |
groupmod -o -g {{ item[''guid''] }} {{ item[''username''] }}
do_some_stuff_here
and_some_other_stuff
with_items: "{{ users }}"
Hay una advertencia: Ansible realiza una manipulación irregular de los argumentos del comando de
shell
, por lo que si bien lo anterior generalmente funcionará como se espera, lo siguiente no:
- shell: |
cat <<EOF
This is a test.
EOF
Ansible en realidad representará ese texto con espacios iniciales, lo que significa que el shell nunca encontrará la cadena
EOF
al comienzo de una línea.
Puede evitar la heurística inútil de Ansible utilizando el parámetro
cmd
esta manera:
- shell:
cmd: |
cat <<EOF
This is a test.
EOF
menciona las continuaciones de la línea YAML.
Como ejemplo (probado con ansible 2.0.0.2):
---
- hosts: all
tasks:
- name: multiline shell command
shell: >
ls --color
/home
register: stdout
- name: debug output
debug: msg={{ stdout }}
El comando de shell se contrae en una sola línea, como en
ls --color /home