134 votes

Création d'un nouvel utilisateur et d'un mot de passe avec Ansible

J'ai une tâche ansible qui crée un nouvel utilisateur sur ubuntu 12.04;

- name: Ajouter un utilisateur de déploiement
    action: user name=deployer password=mypassword

il se termine comme prévu mais lorsque je me connecte en tant qu'utilisateur et essaie de faire sudo avec le mot de passe que j'ai défini, il dit toujours que c'est incorrect. Qu'est-ce que je fais de mal?

211voto

thinkingmonster Points 1952

Je suis peut-être trop tard pour répondre à cela, mais récemment j'ai découvert que les filtres jinja2 ont la capacité de gérer la génération de mots de passe chiffrés. Dans mon fichier main.yml, je génère le mot de passe chiffré comme suit :

- name: Créer l'utilisateur "{{ uusername }}" avec un accès administratif
  user: 
    name: {{ uusername }}
    password: {{ upassword | password_hash('sha512') }}
    groups: admin append=yes
  when: assigned_role == "yes"

- name: Créer l'utilisateur "{{ uusername }}" sans accès administratif
  user:
    name: {{ uusername }}
    password: {{ upassword | password_hash('sha512') }}
  when: assigned_role == "no"

- name: Expirer le mot de passe de l'utilisateur "{{ uusername }}"
  shell: chage -d 0 "{{ uusername }}"

"uusername" et "upassword" sont transmis en tant que --extra-vars au playbook et veuillez noter que j'ai utilisé un filtre jinja2 ici pour chiffrer le mot de passe transmis.

J'ai ajouté le tutoriel ci-dessous lié à ceci sur mon blog

128voto

Cror2014 Points 121

Si vous lisez le manuel d'Ansible pour le utilisateur module, il vous dirigera vers le référentiel Ansible-examples github pour savoir comment utiliser le paramètre mot de passe.

Là, vous verrez que votre mot de passe doit être hashé.

- hosts: all
  user: root
  vars:
    # créé avec :
    # python -c 'import crypt; print crypt.crypt("Ceci est mon mot de passe", "$1$SomeSalt$")'
    password: $1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.

  tasks:
    - user: name=tset password={{password}}

Si votre playbook ou votre ligne de commande ansible a votre mot de passe tel quel en texte clair, cela signifie que le hachage de votre mot de passe enregistré dans votre fichier shadow est incorrect. Cela signifie que lorsque vous essayez de vous authentifier avec votre mot de passe, son hachage ne correspondra jamais.

De plus, consultez la FAQ d'Ansible concernant certaines subtilités du paramètre de mot de passe et la manière de l'utiliser correctement.

64voto

madhead Points 4504

Je veux proposer encore une autre solution :

- name: Créer l'utilisateur madhead
  user:
    name: madhead
    password: "{{ 'password' | password_hash('sha512') }}"
    shell: /bin/zsh
    update_password: on_create
  register: madhead
- name: Forcer madhead à changer le mot de passe
  shell: chage -d 0 madhead
  when: madhead.changed

Pourquoi est-ce mieux? Comme cela a déjà été mentionné ici, les tâches Ansible doivent être idempotentes. Vous devriez les considérer non pas comme une séquence d'actions de style impératif, mais comme un état désiré, de style déclaratif. En conséquence, vous devriez être capable de l'exécuter plusieurs fois et obtenir le même résultat, le même état du serveur.

Tout cela semble génial, mais il y a quelques subtilités. L'une d'entre elles concerne la gestion des utilisateurs. "État désiré" signifie que chaque fois que vous exécutez une tâche qui crée un utilisateur, il sera mis à jour pour correspondre exactement à cet état. Par "mis à jour", j'entends que son mot de passe sera également modifié. Mais très probablement, ce n'est pas ce dont vous avez besoin. Généralement, vous devez créer un utilisateur, définir et expirer son mot de passe une seule fois, les tâches ultérieures ne devraient pas mettre à jour son mot de passe.

Heureusement, Ansible a l'attribut update_password dans le module user qui résout ce problème. En mélangeant cela avec les variables enregistrées, vous pouvez également expirer son mot de passe uniquement lorsque l'utilisateur est effectivement mis à jour.

Remarquez que si vous changez manuellement le shell de l'utilisateur (supposons que vous n'aimez pas le shell que l'admin malveillant a imposé dans sa tâche), l'utilisateur sera mis à jour, donc son mot de passe sera expiré.

Remarquez également comment vous pouvez facilement utiliser des mots de passe initiaux en texte brut dans les tâches. Pas besoin de les encoder ailleurs et de coller des hachages, vous pouvez utiliser le filtre Jinja2 pour cela. Cependant, cela peut être une faille de sécurité si quelqu'un se connecte avant vous initialement.

15voto

Artem Feofanov Points 131

Essaie comme ça

vars_prompt:
 - name: "user_password"    
   prompt: "Entrez un mot de passe pour l'utilisateur"    
   private: yes    
   encrypt: "md5_crypt" #besoin d'avoir python-passlib installé sur la machine locale avant de pouvoir l'utiliser    
   confirm: yes    
   salt_size: 7

 - name: "ajouter nouvel utilisateur" utilisateur: name="{{user_name}}" commentaire="{{description_user}}" mot_de_passe="{{user_password}}" home="{{home_dir}}" shell="/bin/bash"

14voto

datasmid Points 1664

Le module 'utilisateur' Ansible gère les utilisateurs de manière idempotente. Dans le playbook ci-dessous, la première tâche déclare state=present pour l'utilisateur. Notez que 'register: newuser' dans la première action permet à la deuxième action de déterminer si l'utilisateur est nouveau (newuser.changed==True) ou existant (newuser.changed==False), afin de générer le mot de passe une seule fois.

Le playbook Ansible contient :

tâches :
  - name: créer un utilisateur de déploiement
    utilisateur : 
      nom: deployer 
      createhome: oui 
      state: présent 
    register: newuser

  - name: générer un mot de passe aléatoire pour l'utilisateur uniquement à la création
    shell: /usr/bin/openssl rand -base64 32 | passwd --stdin deployer
    when: newuser.changed

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X