vars variable set_fact practices playbook facts debug best variables ansible

variables - set_fact - ¿Ansible a la solicitud condicional de una variable?



ansible playbook (5)

Como se puede ver en el código fuente , when palabra clave no está implementada para vars_prompt (y de hecho nunca lo fue). Lo mismo fue mencionado en este comment Github.

La única forma en que vars_prompt es actualmente condicional es que solo avisa cuando la variable (definida en name ) ya está definida (usando el argumento de la línea de comandos extra_vars ).

Me gustaría poder solicitar mi variable de contraseña súper segura si aún no está en las variables de entorno. (Estoy pensando que quizás no quiera poner la definición en .bash_profile o en uno de los otros puntos).

Esto no está funcionando. Siempre me incita.

vars: THISUSER: "{{ lookup(''env'',''LOGNAME'') }}" SSHPWD: "{{ lookup(''env'',''MY_PWD'') }}" vars_prompt: - name: "release_version" prompt: "Product release version" default: "1.0" when: SSHPWD == null

NOTA: Estoy en una Mac, pero me gustaría que las soluciones sean independientes de la plataforma.


De acuerdo con las respuestas de los devs y una prueba rápida que hice con la última versión, el vars_prompt se ejecuta antes de " vars_prompt LOS HECHOS". Esto significa que el env var SSHPWD siempre es null en el momento de su verificación con when .

Lamentablemente, parece que no hay forma de permitir la instrucción vars_prompt en el nivel de la tarea.

El razonamiento de Michael DeHaan para esto es que permitir indicaciones a nivel de tarea abriría las puertas a los roles que planteaban muchas preguntas. Esto haría que utilizar los roles de Ansible Galaxy que hacen esto difícil:

Ha habido un énfasis decidido en la automatización en Ansible y hacer preguntas a nivel de tarea no es algo que realmente queremos hacer.

Sin embargo, todavía puedes hacer vars_prompt preguntas en el nivel de juego y usar esas variables en todas las tareas. No puedes hacer preguntas en roles.

Y realmente, eso es lo que me gustaría hacer cumplir: si muchos roles de Galaxy comienzan a hacer preguntas, puedo ver que eso es molesto :)


Esto de hecho no es posible por defecto en Ansible. Entiendo el razonamiento detrás de no permitirlo, sin embargo, creo que puede ser apropiado en algunos contextos. He estado escribiendo un guión de despliegue AWS EC2, usando el sistema de despliegue azul / verde, y en algún punto del rol necesito preguntar al usuario si es necesario realizar un rollback si algo ha salido mal. Como dije, no hay forma de hacer esto (condicionalmente y / o no).

Así que escribí un plugin de acción Ansible (2.x) muy simple, basado en la acción de pausa de la biblioteca estándar. Es un poco espartano, ya que solo acepta presionar una sola tecla, pero podría ser útil. Puedes encontrarlo en una esencia de Github aquí . action_plugins copiar todo el archivo Gist en el directorio action_plugins de su directorio de libros de jugadas. Ver la documentación en el archivo.


Esto funciona para mí (2.3) ... hacer dos bits en el archivo. Esto me permite compilar un archivo tmp vars cuando ejecuto el libro de jugadas a través de jenkins ... pero también permitir indicaciones en la línea de comando.

Y puedes hacerlo solo con la var utilizada

--- - name: first bit hosts: all connection: local tasks: - set_fact: favColour: "{{ favColour }}" when: favColour is defined - name: second bit hosts: all connection: local vars_prompt: favColour: prompt: "Whats ya favorite colour: " when: favColour is not defined tasks: - debug: msg="{{favColour}}"


Puede que vars_prompt tarde a la fiesta, pero una manera rápida de evitar vars_prompt es deshabilitar el interactive mode haciendo ese simple truco:

echo -n | ansible-playbook -e MyVar=blih site.yaml

Esto no agrega control sobre qué vars_prompt se debe evitar, pero se combina con el default: "my_default" se puede usar en un script.

Ejemplo completo aquí:

--- - hosts: localhost vars_prompt: - prompt: Enter blah value - default: "{{ my_blah }}" - name: blah

echo -n | ansible-playbook -e my_blah=blih site.yaml

EDITAR:

Descubrí que al usar el módulo de pause y el argumento prompt estaba haciendo lo que quería:

--- - pause: prompt: "Sudo password for localhost " when: ( env == ''local'' ) and ( inventory_hostname == "localhost" ) and ( hostvars["localhost"]["ansible_become_password"] is not defined ) register: sudo_password no_log: true tags: - always