run register playbook modules example custom shell ansible

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 la key .

  • 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 valor This text/nhas multiple/nlines/n a la key .

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