Estou usando playbooks Ansible gerados programaticamente. Em geral, como os playbooks são apenas YAML, isso é direto. No entanto, ao usar o key=value
formulário "simples" , os playbooks não são YAML puros - eles incluem conteúdo incorporado em um shlex
formulário comparável.
Para evitar a ambiguidade neste formulário (esse key=value
par é um argumento para o comando ou um argumento para ansible?) E tem apenas um único formato para analisar e gerar, estou usando incondicionalmente o mecanismo args complexo demonstrado por exemplo no ansible repositório -examples .
Isso usa uma sintaxe do seguinte tipo:
action: module-name
args:
key1: value1
key2: value2
... o que é bom e bom. No entanto, ao tentar usar este formulário para os módulos shell
ou command
( cuja documentação descreve o comando real como sendo passado em um argumento chamado free_form
), isso não funciona tão bem:
action: shell
args:
free_form: echo hello_world >/tmp/something
creates: /tmp/something
Quando invocado, isso executa o seguinte:
/bin/sh -c " free_form='echo hello_world >/tmp/something' "
... o que não é o que estou tentando realizar.
Qual é a maneira correta de usar módulos Ansible que tomam comandos "de forma livre" usando a sintaxe YAML pura?
- shell: ...
? Se essa estrutura é algo que só pode ser gerado de forma confiável com a mão, isso acaba com o argumento da questão....
parte em geral. Se você olharlibrary/commands/command
, você vai encontrar uma correspondência regex bastante generosacreates=
,removes=
,chdir=
, e assim por diante. Se você precisar garantir que qualquer comando possa ser transmitido, precisará escrever seu próprio módulo.Isso é abordado na documentação do Ansible agora.
Observe que não há parâmetro chamado 'free_form'.
fonte
args
impede que osk=v
pares sejam analisadoscommand
, deve existir algum? (Se sim, isso aborda a ambiguidade de maneira limpa; caso contrário, parece que ainda existe).