web-dev-qa-db-fra.com

Ansible à conditionnellement invite pour une variable?

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.

31
AnneTheAgile

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 :)

33
adm_

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
25
tehmoon

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.

4
Confiks

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}}"
2
Alex Pretty

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
1
keypress

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).

1
Silveri