Passando comandos de formato livre para Ansible usando a forma complex-args

9

Estou usando os playbooks Ansible gerados por programação. Em geral, porque os playbooks são apenas YAML, isso é simples. No entanto, ao usar o formulário "simples" key=value , os playbooks não são YAML puro - eles incluem conteúdo incorporado em um formulário shlex -parable.

Para evitar a ambiguidade neste formulário (é que key=value emparelha um argumento para o comando ou um argumento para ansible?) e tem apenas um formato único para analisar e gerar, estou usando incondicionalmente o mecanismo args complexo demonstrado pelo exemplo em o repositório ansible-examples .

Isso usa uma sintaxe do tipo a seguir:

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 usando comandos de forma livre usando a sintaxe YAML pura?

    
por Charles Duffy 23.03.2014 / 23:43

2 respostas

5

Resposta curta: não use os módulos command , raw , script ou shell . Escreva seu próprio módulo que aceita o comando como um argumento "normal".

Resposta longa:

Na maioria dos casos, você pode fazer isso:

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

No entanto, isso falha em alguns casos extremos:

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

Eu não conheço uma maneira geral de lidar com isso, mas uma solução específica para o bash é:

- shell: echo hello_world > "creates=something"
  args:
    creates: creates=something
    
por 13.06.2014 / 18:44
0

Isso é abordado na documentação Ansible agora.

# 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

Observe que não há parâmetro chamado 'free_form'.

    
por 19.04.2016 / 22:02

Tags