Como posso passar uma variável para um manual ansible na linha de comando?

218

Eu sou novo no ansible e gostaria de saber como fazê-lo, pois o seguinte não funcionou

ansible-playbook -i '10.0.0.1,' yada-yada.yml --tags 'loaddata' django_fixtures="tile_colors"

Onde django_fixturesestá minha variável.

Édouard Lopez
fonte

Respostas:

307

Lendo os documentos, encontro a seção Passando variáveis ​​na linha de comando , que fornece este exemplo:

ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"

Outros exemplos demonstram como carregar da string JSON (≥ 1.2) ou do arquivo (≥ 1.3)

Édouard Lopez
fonte
33
Observe também que as variáveis ​​definidas com --extra-varssubstituirão as variáveis ​​definidas dentro do manual.
soma de verificação
5
Observe também (dos documentos): os valores passados ​​usando a key=valuesintaxe são interpretados como seqüências de caracteres . Use o formato JSON se precisar passar algo que não deva ser uma string (booleanos, números inteiros, flutuantes, listas etc.). Por exemplo:--extra-vars '{"i_wasted_30_mins_debugging_a_boolean_string":true}'
smilin_stan 11/10/19
159

Outras respostas indicam como passar nas variáveis ​​da linha de comando, mas não como acessá-las, portanto, se você fizer:

--extra-vars "version=1.23.45 other_variable=foo"

No seu arquivo yml, você os atribui a variáveis ​​ansible com escopo, fazendo algo como:

vars:
    my_version: "{{ version }}"
    my_other_variable: {{ other_variable }}

Uma alternativa ao uso de argumentos de linha de comando é utilizar variáveis ​​ambientais que já estão definidas em sua sessão, você pode referenciá-las em seus arquivos yml ansible como este:

vars:
    my_version: "{{ lookup('env', 'version') }}"
    my_other_variable: {{ lookup('env', 'other_variable') }}
GreensterRox
fonte
29
Não tenho certeza do que você está falando?? Minha resposta expande as respostas aceitas anteriormente, consultando o sinalizador da linha de comando --extra-vars E como referenciá-las na sua configuração do yaml. Então, ofereço uma maneira alternativa de fazê-lo também.
GreensterRox
1
A questão aqui é especificamente passar a variável pela linha de comando . É exatamente por isso que seria melhor, pois é uma pergunta / resposta própria e um link relacionado. Você pode e o link relacionado como um comentário para a pergunta.
Edouard Lopez
43
A resposta expandida me ajudou. Certamente saber como referenciar as variáveis ​​passadas em parte de saber como passar parâmetros. Caso contrário, você não os passará, mas apenas declarará que deseja passar a variável. Passar um objeto requer um doador e um receptor. Para passar uma variável requer uma declaração de parâmetro e um uso do parâmetro.
Conteh
lookup('env', SOMETHING)corresponde ao fator 12.
zx1986 22/03/19
1
Lembre-se de alterar o nome da variável: version: {{ version }} está errado, como definir versionpor si só.
Minh Nghĩa
41
ansible-playbook release.yml -e "version=1.23.45 other_variable=foo"
lanni654321
fonte
25
A -ebandeira é a forma abreviada de--extra-vars
Édouard Lopez
4
Posso passar arquivo variável?
OpsEco
13
@AniruddhaJawanjal yes, like--extra-vars "@some_file.json"
AlanSE
1
@OpsEco @AlanSE observe que, se você estiver passando variáveis ​​de um arquivo, precisará de um segundo --extra-varssinalizador para passar variáveis ​​que não estão no arquivo. Por exemplo--extra-vars "@some_file.json" --extra-vars "other_variable=foo"
bonh 08/04/19
Obrigado @bonh era o que eu estava procurando
33

Você pode usar a --extra-varsopção Veja os documentos

jarv
fonte
31

Por alguma razão, nenhuma das respostas acima funcionou para mim. Como eu preciso passar vários vars extras para o meu manual no Ansbile 2.2.0, é assim que eu o faço funcionar (observe a opção -e antes de cada var):

ansible-playbook site.yaml -i hostinv -e firstvar=false -e second_var=value2
OpenITeX
fonte
4
-eé a forma abreviada de--extra-vars
Édouard Lopez
@LXCdev KohaLappi +1 para demonstrar que você pode especificar vars adicionais em sua própria -ebandeira
ctlockey
Você também pode definir várias variáveis ​​usando uma única bandeira:-e "firstvar=false second_var=value2"
Nils Breunese
Mesmo problema. Vários vars com um único sinalizador não funcionariam. Eu quero saber porque?
Bret
14
ansible-playbook test.yml --extra-vars "arg1=${var1} arg2=${var2}"

No arquivo yml, você pode usá-los assim

---
arg1: "{{ var1 }}"
arg2: "{{ var2 }}"

Além disso, --extra-varse -esão os mesmos, você pode usar um deles.

Ali Atakan
fonte
4
 s3_sync:
      bucket: ansible-harshika
      file_root: "{{ pathoftsfiles  }}"
      validate_certs: false 
      mode: push
      key_prefix: "{{ folder }}"

aqui as variáveis ​​estão sendo usadas nomeadas como 'pathoftsfiles' e 'folder'. Agora, o valor para essa variável pode ser dado pelo comando abaixo

sudo ansible-playbook multiadd.yml --extra-vars "pathoftsfiles=/opt/lampp/htdocs/video/uploads/tsfiles/$2 folder=nitesh"

Nota: Não use vírgulas invertidas ao passar os valores para a variável no comando shell

Nitesh Jain
fonte
2
ansible-playbook release.yml --extra-vars "username=hello password=bye"

#you can now use the above command anywhere in the playbook as an example below:
tasks:
- name: Create a new user in Linux
shell: useradd -m -p {{username}} {{password}}"
Naveen Goyal
fonte
2

Isso também funcionou para mim se você deseja usar variáveis ​​de ambiente do shell:

ansible-playbook -i "localhost," ldap.yaml --extra-vars="LDAP_HOST={{ lookup('env', 'LDAP_HOST') }} clustername=mycluster env=dev LDAP_USERNAME={{ lookup('env', 'LDAP_USERNAME') }} LDAP_PASSWORD={{ lookup('env', 'LDAP_PASSWORD') }}"

user164328
fonte
1

ansible-playbok -i <inventory> <playbook-name> -e "proc_name=sshd"

Você pode usar o comando acima nos manuais abaixo.

---
- name: Service Status
gather_facts: False
tasks:
- name: Check Service Status (Linux)
shell: pgrep "{{ proc_name }}"
register: service_status
ignore_errors: yes
debug: var=service_status.rc`
Rajeev Singh
fonte