Estoy usando libros de jugadas Ansible generados programáticamente. En general, debido a que los libros de jugadas son solo YAML, esto es sencillo. Sin embargo, cuando se usa la forma "simple" key=value
, los libros de jugadas no son YAML puros, sino que incluyen contenido incrustado en una shlex
forma analizable.
Para evitar la ambigüedad en esta forma (¿es eso key=value
emparejar un argumento con el comando o un argumento para ansible?) Y tener un solo formato para analizar y generar, estoy usando incondicionalmente el complejo mecanismo de argumentos demostrado por ejemplo en el ansible -positorio de ejemplos .
Esto usa una sintaxis del siguiente tipo:
action: module-name
args:
key1: value1
key2: value2
... que está bien y bien. Sin embargo, al intentar usar este formulario para los módulos shell
o command
( 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 lo que estoy tratando de lograr.
¿Cuál es la forma correcta de usar módulos Ansible que toman comandos de "forma libre" usando sintaxis YAML pura?
- shell: ...
? Si esta estructura es algo que solo se puede generar de manera confiable a mano, eso de alguna manera frustra el punto de la pregunta....
parte en general. Si nos fijamos enlibrary/commands/command
, encontrará una coincidencia de expresiones regulares bastante generosocreates=
,removes=
,chdir=
, y así sucesivamente. Si necesita garantizar que se pueda pasar algún comando, deberá escribir su propio módulo.Esto se aborda en la documentación de Ansible ahora.
Tenga en cuenta que no hay ningún parámetro llamado 'free_form'.
fuente
args
evita que losk=v
pares sean analizadoscommand
, en caso de existir? (Si es así, esto aborda la ambigüedad de manera limpia; de lo contrario, parece que todavía existe).