Pregunta Pasando comandos de forma libre a Ansible usando el formulario de argumentos complejos


Estoy usando los libros de juego de Ansible generados programáticamente. En general, debido a que los libros de jugadas son solo YAML, esto es sencillo. Sin embargo, cuando se utiliza el "simple" key=value forma, libros de jugadas no son YAML puro - incluyen contenido incrustado en un shlex-preparable forma.

Para evitar la ambigüedad en esta forma (es que key=value ¿emparejar un argumento con el comando o un argumento para ansible?), y tener un solo formato para analizar y generar, estoy utilizando el mecanismo complejo de argumentos que se muestra con el ejemplo en incondicional. el repositorio de ejemplos ansible.

Esto utiliza una sintaxis del siguiente tipo:

action: module-name
args:
  key1: value1
  key2: value2

... lo que es bueno y bueno. Sin embargo, al intentar utilizar este formulario para el shell o command módulos (cuya documentación describe el comando real como se pasa en un argumento llamado free_form), esto no funciona tan bien:

action: shell
args:
  free_form: echo hello_world >/tmp/something
  creates: /tmp/something

Cuando se invoca, esto ejecuta lo siguiente:

/bin/sh -c " free_form='echo hello_world >/tmp/something'  "

... que no es mucho lo que estoy tratando de lograr.

¿Cuál es la forma correcta de usar los módulos Ansible que toman comandos de "forma libre" usando la sintaxis pura de YAML?


9
2018-03-23 22:43


origen




Respuestas:


Respuesta corta: No use el command, raw, scripto shell módulos Escriba su propio módulo que acepte el comando como un argumento "normal".

Respuesta larga:

En la mayoría de los casos, puedes hacer esto:

- shell: echo hello_world > /tmp/something
  args:
    creates: /tmp/something

Sin embargo, esto falla en algunos casos de borde:

- shell: echo hello_world > creates=something
  args:
    creates: creates=something  # The file is named "creates=something"

No conozco una forma general de manejar esto, pero una solución específica de bash es:

- shell: echo hello_world > "creates=something"
  args:
    creates: creates=something

5
2018-06-13 16:44



¿Existe una estructura de datos que pueda pasar a cualquier generador YAML compatible para hacer que emita - shell: ...? Si esta estructura es algo que solo se puede generar de forma confiable a mano, eso anula de alguna manera el punto de la pregunta. - Charles Duffy
@CharlesDuffy: No creo que puedas escapar de la ... Parte en general. Si miras library/commands/command, encontrarás una combinación de expresiones regulares bastante generosa creates=, removes=, chdir=, y así. Si necesitas garantizar alguna El comando se puede pasar, tendrás que escribir tu propio módulo. - Snowball
Justo 'nuff. Esto es, en mi opinión, un error significativo de diseño ... pero, bueno, es lo que es. - Charles Duffy


Esto se aborda en el Documentación ansible ahora.

# You can also use the 'args' form to provide the options. This command
# will change the working directory to somedir/ and will only run when
# /path/to/database doesn't exist.
- command: /usr/bin/make_database.sh arg1 arg2
  args:
    chdir: somedir/
    creates: /path/to/database

Tenga en cuenta que no hay ningún parámetro llamado 'free_form'.


0
2018-04-19 20:02



Hace presencia de args previene k=v pares de ser analizados fuera de command¿Debería existir alguna? (Si es así, esto aborda la ambigüedad de manera limpia; de lo contrario, parece que todavía existe). - Charles Duffy