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?

2voto

Steve Midgley Points 435

En combinant quelques solutions ci-dessus, j'ai créé un playbook qui génère automatiquement les hachages de mots de passe corrects en fonction des mots de passe en clair stockés dans un fichier vault ansible chiffré et local :

---
- hosts: [vos hôtes]
  tasks:
  - include_vars: [chemin vers votre fichier vault chiffré]
  - local_action: "command openssl passwd -salt '{{password_salt}}' -1 '{{password}}'"
    register: password_hash
  - user: >
        name=[votre nom d'utilisateur]
        state=présent
        password="{{password_hash.stdout}}"

Exécutez cette commande en ajoutant l'option "--ask-vault-pass" pour déchiffrer votre fichier vault (consultez ansible-vault pour plus d'informations sur la gestion d'un vault chiffré).

2voto

Joel B Points 309

La réponse de Mxx est correcte mais la méthode python crypt.crypt() n'est pas sûre lorsque différents systèmes d'exploitation sont impliqués (lié à l'algorithme de hachage glibc utilisé sur votre système).

Par exemple, cela ne fonctionnera pas si vous générez votre hachage depuis MacOS et exécutez un playbook sur Linux. Dans ce cas, vous pouvez utiliser passlib (pip install passlib pour l'installer localement).

from passlib.hash import md5_crypt
python -c 'import crypt; print md5_crypt.encrypt("This is my Password,salt="SomeSalt")'
'$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.'

2voto

slm Points 3435

Si vous souhaitez réaliser ceci en tant que commande ad-hoc Ansible, vous pouvez suivre les étapes suivantes :

$ password='SomethingSecret!'
$ ansible 192.168.1.10 -i some_inventory -b -m user -a "name=joe_user \
       update_password=always password=\"{{ \"$password\" | password_hash('sha512') }}\""

Résultat de la commande ci-dessus :

192.168.1.10 | SUCCÈS => {
    "append": false,
    "changed": true,
    "comment": "Joe User",
    "group": 999,
    "home": "/home/joe_user",
    "move_home": false,
    "name": "joe_user",
    "password": "NOT_LOGGING_PASSWORD",
    "shell": "/bin/bash",
    "state": "present",
    "uid": 999
}

2voto

Orca Points 91

La réponse de @madhead n'est pas parfaite.

Vous ne pouvez vraiment pas vous fier à l'état changed de l'élément, ce n'est pas précis. Mais ce problème pourrait être résolu:

- nom: obtenir les informations de tous les utilisateurs existants
  getent:
    base de données: passwd

# ---- réponse de @madhead ----
- nom: Créer l'utilisateur madhead
  utilisateur:
    nom: madhead
    mot_de_passe: "{{ 'motdepasse' | password_hash('sha512') }}"
    shell: /bin/zsh
    update_password: on_create
  register: madhead
- nom: Forcer madhead à changer de mot de passe
  shell: chage -d 0 madhead
  # origine:
  # when: madhead.changed
  # amélioré:
  when: 'madhead' not in getent_passwd and madhead.changed

1voto

texnic Points 1750

Aucune des solutions n'a fonctionné directement sur mon Mac contrôlant Ubuntu. Donc, pour le bien des autres, en combinant les réponses de Mxx et JoelB, voici la solution actuelle en Python 3 :

pip3 install passlib

python3 -c 'from passlib.hash import md5_crypt; \
      print(md5_crypt.encrypt("Ceci est mon mot de passe", salt="SomeSalt"))'

Le résultat sera $1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI., comme dans la réponse de Mxx.

Mieux encore, utilisez SHA512 au lieu de MD5 :

python3 -c 'from passlib.hash import sha512_crypt; \
      print(sha512_crypt.encrypt("Ceci est mon mot de passe", salt="SomeSalt"))' 

Résultat :

$6$rounds=656000$SomeSalt$oYpmnpZahIsvn5FK8g4bDFEAmGpEN114Fe6Ko4HvinzFaz5Rq2UXQxoJZ9ZQyQoi9zaBo3gBH/FEAov3FHv48

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