J'aimerais pouvoir demander ma variable de mot de passe super sécurisé si elle ne figure pas déjà dans les variables d'environnement. (Je pense que je ne veux peut-être pas mettre la définition dans .bash_profile ou dans l'un des autres emplacements.)
Ceci ne fonctionne pas. Cela m'invite toujours.
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
NOTE: Je suis sur un Mac, mais j'aimerais que toute solution soit indépendante de la plate-forme.
D'après les réponses de devs et un test rapide que j'ai effectué avec la dernière version, le vars_Prompt
est exécuté avant "GATHERING FACTS". Cela signifie que la variable env var SSHPWD
est toujours null
au moment de votre vérification avec when
.
Malheureusement, il semble qu'il n'y ait aucun moyen d'autoriser l'instruction vars_Prompt
au niveau de la tâche.
Selon Michael DeHaan, autoriser les invites au niveau de la tâche ouvrirait la porte à des rôles posant de nombreuses questions. Cela rendrait difficile l’utilisation de rôles Ansible Galaxy:
Dans Ansible, l’automatisation a été clairement mise en avant et poser des questions au niveau des tâches n’est pas quelque chose que nous voulons vraiment faire.
Cependant, vous pouvez toujours poser des questions à vars_Prompt au niveau de la lecture et utiliser ces variables tout au long des tâches. Vous ne pouvez simplement pas poser de questions dans les rôles.
Et vraiment, c’est ce que je voudrais appliquer: si beaucoup de rôles dans Galaxy commencent à poser des questions, je peux voir que cela est agaçant :)
Je pourrais être en retard à la fête, mais un moyen rapide d'éviter vars_Prompt
consiste à désactiver le interactive mode
en procédant de la sorte:
echo -n | ansible-playbook -e MyVar=blih site.yaml
Cela n’ajoute aucun contrôle sur la propriété vars_Prompt à éviter, mais associé à default: "my_default"
, il peut être utilisé dans un script.
Exemple complet ici:
---
- hosts: localhost
vars_Prompt:
- Prompt: Enter blah value
- default: "{{ my_blah }}"
- name: blah
echo -n | ansible-playbook -e my_blah=blih site.yaml
MODIFIER:
J'ai constaté qu'en utilisant le module pause
et l'argument Prompt
, je faisais ce que je voulais:
---
- 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
Ceci n'est en effet pas possible par défaut dans Ansible. Je comprends le raisonnement derrière ne pas le permettre, mais je pense que cela peut être approprié dans certains contextes. Je suis en train d'écrire un script de déploiement AWS EC2, à l'aide du système de déploiement bleu/vert, et à un moment donné du rôle, je dois demander à l'utilisateur s'il est nécessaire d'effectuer une restauration en cas de problème. Comme dit, il n'y a aucun moyen de le faire (sous condition et/ou sans fugacité).
J'ai donc écrit un très simple plug-in d'action Ansible (2.x), basé sur l'action de pause de la bibliothèque standard. C'est un peu spartiate en ce sens qu'il n'accepte que d'une simple pression sur une touche, mais peut être utile. Vous pouvez le trouver dans un Github Gist ici . Vous devez copier l'intégralité du fichier Gist dans le répertoire action_plugins
de votre répertoire playbook. Voir la documentation dans le fichier.
Cela fonctionne pour moi (2.3) .. faire deux bits dans le même fichier . Cela me permet de détruire un fichier tmp vars lors de l'exécution du playbook via jenkins .. mais aussi de permettre une invite sur la ligne de commande
Et vous ne le faites qu'avec le seul var utilisé
---
- 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}}"
Basé sur la réponse de tehmoon avec quelques modifications, je l'ai fait comme suit:
- hosts:
- hostA
become: yes
pre_tasks:
- pause:
Prompt: "Give your username"
register: Prompt
no_log: yes
run_once: yes
- set_fact:
username: "{{Prompt.user_input}}"
no_log: yes
run_once: yes
- pause:
Prompt: "Give your password"
echo: no
register: Prompt
no_log: yes
run_once: yes
- set_fact:
password: "{{Prompt.user_input}}"
no_log: yes
run_once: yes
tags: [my_role_using_user_pass]
roles:
- role: my_role_using_user_pass
Comme on peut le voir dans le code - source , le mot clé when
n'est pas implémenté pour vars_Prompt
(et ne l'a jamais été). La même chose a été mentionné dans ce Github commentaire .
Le seul moyen pour lequel vars_Prompt
est actuellement conditionnel est de ne l'inviter que lorsque la variable (définie dans name
) est déjà définie (à l'aide de l'argument de ligne de commande extra_vars
).