ahora mismo 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 un script de varias líneas en el módulo de shell de Ansible
Respuestas:
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 mediante espacios. La siguiente sintaxis:Asignaría el valor
This text has multiple lines\n
akey
.El
|
personaje es un operador de bloque literal. Esto es probablemente lo que desea para los scripts de shell de varias líneas. La siguiente sintaxis:Asignaría el valor
This text\nhas multiple\nlines\n
akey
.Puede usar esto para scripts de shell de varias líneas como este:
Hay una advertencia: Ansible realiza una manipulación tonta de los argumentos del
shell
comando, por lo que, si bien lo anterior generalmente funcionará como se esperaba, lo siguiente no lo hará:Ansible en realidad representará ese texto con espacios
EOF
iniciales , lo que significa que el shell nunca encontrará la cadena al comienzo de una línea. Puede evitar las inútiles heurísticas de Ansible utilizando elcmd
parámetro como este:fuente
https://support.ansible.com/hc/en-us/articles/201957837-How-do-I-split-an-action-into-a-multi-line-format-
menciona continuaciones de línea YAML.
Como ejemplo (probado con ansible 2.0.0.2):
El comando de shell se contrae en una sola línea, como en
ls --color /home
fuente
>
tiene un significado muy específico. Intenté esto y no funcionó como se esperaba.Agregar un espacio antes del delimitador EOF permite evitar cmd:
fuente