¿Cómo puedo pasar variable a libro de jugadas ansible en la línea de comando?

Respuestas:

307

Al leer los documentos, encuentro la sección Pasando variables en la línea de comandos , que dan este ejemplo:

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

Otros ejemplos demuestran cómo cargar desde una cadena JSON (≥ 1.2) o un archivo (≥ 1.3)

Édouard Lopez
fuente
33
Tenga en cuenta también que las variables definidas con --extra-varsanularán las variables definidas dentro del libro de jugadas.
suma de comprobación
55
También tenga en cuenta (de los documentos): los valores pasados ​​al usar la key=valuesintaxis se interpretan como cadenas . Use el formato JSON si necesita pasar algo que no debería ser una cadena (booleanos, enteros, flotantes, listas, etc.). Por ejemplo:--extra-vars '{"i_wasted_30_mins_debugging_a_boolean_string":true}'
smilin_stan
159

Otras respuestas indican cómo pasar las variables de la línea de comandos pero no cómo acceder a ellas, así que si lo hace:

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

En su archivo yml, los asigna a variables ansibles de ámbito haciendo algo como:

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

Una alternativa al uso de argumentos de línea de comando es utilizar variables ambientales que ya están definidas dentro de su sesión, puede hacer referencia a estas dentro de sus archivos yml ansibles de esta manera:

vars:
    my_version: "{{ lookup('env', 'version') }}"
    my_other_variable: {{ lookup('env', 'other_variable') }}
GreensterRox
fuente
29
¿¿No estoy seguro de lo que está hablando?? Mi respuesta amplía las respuestas previamente aceptadas al referirme al indicador de línea de comando --extra-vars Y cómo hacer referencia a ellas dentro de su configuración yaml. Luego ofrezco una forma alternativa de hacerlo también.
GreensterRox
1
La pregunta aquí es específicamente pasar variable a través de la línea de comando . Eso es exactamente por qué sería mejor, ya que es una pregunta / respuesta propia y un enlace relacionado. Puede y el enlace relacionado como un comentario a la pregunta.
Édouard Lopez
43
La respuesta ampliada me ayudó. Seguramente saber cómo hacer referencia a las variables pasadas en parte de saber pasar parámetros. De lo contrario, no los pasará sino que simplemente declarará que desea pasar la variable. Para pasar un objeto requiere un donante y un receptor. Para pasar una variable se requiere una declaración de parámetro y un uso del parámetro.
conteh
lookup('env', SOMETHING)se corresponde con el factor 12.
zx1986
1
Recuerde cambiar el nombre de la variable: version: {{ version }}está mal, como definir versionpor sí mismo.
Minh Nghĩa
41
ansible-playbook release.yml -e "version=1.23.45 other_variable=foo"
lanni654321
fuente
25
La -ebandera es la forma abreviada de--extra-vars
Édouard Lopez
44
¿Puedo pasar un archivo variable?
OpsEco
13
@AniruddhaJawanjal sí, como--extra-vars "@some_file.json"
AlanSE
1
@OpsEco @AlanSE tenga en cuenta que si está pasando variables de un archivo, necesita un segundo --extra-varsindicador para pasar variables que no están en el archivo. Por ejemplo--extra-vars "@some_file.json" --extra-vars "other_variable=foo"
bonh el
Gracias @bonh que era lo que estaba buscando
fan
31

Por alguna razón, ninguna de las respuestas anteriores funcionó para mí. Como necesito pasar varios vars adicionales a mi libro de jugadas en Ansbile 2.2.0, así es como lo hice funcionar (tenga en cuenta la opción -e antes de cada var):

ansible-playbook site.yaml -i hostinv -e firstvar=false -e second_var=value2
OpenITeX
fuente
44
-ees la forma abreviada de--extra-vars
Édouard Lopez
@LXCdev KohaLappi +1 por demostrar que puede especificar vars adicionales en su propia -ebandera
ctlockey
También puede definir múltiples variables usando una sola bandera:-e "firstvar=false second_var=value2"
Nils Breunese
El mismo problema. Varios vars con una sola bandera no funcionarían. ¿Me pregunto porque?
Bret
14
ansible-playbook test.yml --extra-vars "arg1=${var1} arg2=${var2}"

En el archivo yml puedes usarlos así

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

Además, --extra-varsy -eson lo mismo, puedes usar uno de ellos.

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

aquí se usan las variables denominadas 'pathoftsfiles' y 'carpeta'. Ahora el valor de esta variable puede ser dado por el siguiente comando

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

Nota: No use las comillas invertidas al pasar los valores a la variable en el comando de shell

Nitesh Jain
fuente
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
fuente
2

Esto también funcionó para mí si desea utilizar variables de entorno de 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') }}"

usuario164328
fuente
1

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

Puede usar el comando anterior en los siguientes libros de jugadas.

---
- 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
fuente