J'ai une tâche ansible qui crée un nouvel utilisateur sur ubuntu 12.04;
- name: Add deployment user
action: user name=deployer password=mypassword
il se termine comme prévu, mais lorsque je me connecte en tant qu'utilisateur et que j'essaye de sudo avec le mot de passe que j'ai défini, il dit toujours que c'est incorrect. Qu'est-ce que je fais mal?
password
n'est pas censé être en texte brut mais plutôt préhaché.Réponses:
Si vous lisez le manuel d'Ansible pour le
user
module , il vous dirigera vers le dépôt github Ansible-examples pour plus de détails sur l'utilisation dupassword
paramètre .Là, vous verrez que votre mot de passe doit être haché.
Si votre playbook ou votre ligne de commande ansible a votre mot de passe tel quel en texte brut, cela signifie que votre hachage de 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 Ansible concernant certaines nuances du paramètre de mot de passe et comment l'utiliser correctement.
la source
openssl passwd -salt <salt> -1 <plaintext>
pour générer le hachage du mot de passe, plutôt que le one-liner Python que vous avez ci-dessus. J'ai eu du mal à obtenir une sortie correcte de Python, probablement en raison de ma propre incompétence et la commande openssl fonctionnait mieux./etc/shadow
après avoir défini le mot de passe manuellement en utilisantpasswd <user>
.Je suis peut-être trop tard pour répondre à cela, mais j'ai récemment découvert que les filtres jinja2 avaient la capacité de gérer la génération de mots de passe cryptés. Dans mon,
main.yml
je génère le mot de passe crypté comme:"uusername" et "upassword" sont passés comme
--extra-vars
au playbook et notez que j'ai utilisé le filtre jinja2 ici pour crypter le mot de passe passé.J'ai ajouté ci-dessous le tutoriel lié à cela à mon blog
la source
password={{upassword|password_hash('sha512', upassword_salt)}}
. Cela vous permet de mettre du sel dans un coffre - fort de variables , comme vous le feriez probablement avecupassword
aussi, en gardant les deux hors du fichier tasks.yml.update_password: on_create
le module utilisateur à cette réponse pour empêcher l'expiration des mots de passe pour les utilisateurs déjà créés.pip install passlib
. Ensuite , pour pouvoir utiliser une voûte en ligne chaîne cryptée je devais reformater avec l'ajout suivant:password: {{ upassword | string | password_hash('sha512') }}
. Cela évite le message d'erreursecret must be unicode or bytes, not ansible.parsing.yaml.objects.AnsibleVaultEncryptedUnicode
Je souhaite proposer encore une autre solution:
Pourquoi c'est mieux? Comme cela a déjà été noté ici, les jeux Ansible doivent être idempotents. Vous ne devriez pas les considérer comme une séquence d'actions dans un style impératif, mais comme un état souhaité, un style déclaratif. En conséquence, vous devriez pouvoir l'exécuter plusieurs fois et obtenir le même résultat, le même état de serveur.
Tout cela sonne bien, mais il y a quelques nuances. L'un d'eux est la gestion des utilisateurs. «État souhaité» signifie que chaque fois que vous exécutez une lecture qui crée un utilisateur, il sera mis à jour pour correspondre exactement à cet état. Par «mis à jour», je veux dire que son mot de passe sera également modifié. Mais ce n'est probablement pas ce dont vous avez besoin. Habituellement, vous devez créer un utilisateur, définir et expirer son mot de passe une seule fois, les autres parties ne doivent pas mettre à jour son mot de passe.
Heureusement, Ansible a un
update_password
attribut dans leuser
module qui résout ce problème. En mélangeant cela avec des variables enregistrées, vous pouvez également expirer son mot de passe uniquement lorsque l'utilisateur est réellement mis à jour.Notez que si vous changez manuellement le shell de l'utilisateur (supposons que vous n'aimez pas le shell que l'administrateur maléfique a forcé dans son jeu), l'utilisateur sera mis à jour, donc son mot de passe sera expiré.
Notez également comment vous pouvez facilement utiliser les mots de passe initiaux en texte brut dans les jeux. 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.
la source
"{{ '{{vaulted_password}}' | password_hash('sha512') }}"
ne semble pas fonctionner ...{{ vaulted_password | password_hash('sha512') }}
, oùvaulted_password
est une clé de la valeur dans le coffre-fort?update_password: on_create
ne semble pas fonctionner (il y a un bogue ouvert à ce sujet à partir de 2017), donc les mots de passe changeront chaque fois qu'il y a un changement d'état sur un utilisateur.Le module «utilisateur» d'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 aide la deuxième action à déterminer si l'utilisateur est nouveau (newuser.changed == True) ou existant (
newuser.changed==False
), pour ne générer le mot de passe qu'une seule fois.Le playbook Ansible comprend:
la source
essaie comme ça
la source
L'objectif du rôle dans cette réponse est de générer un mot de passe aléatoire pour new_user_name et d'expirer le mot de passe immédiatement. Le nouveau nom_utilisateur est requis pour changer le mot de passe lors de sa première connexion.
create_user.yml:
roles / create_user / tasks / main.yml:
Lorsque vous souhaitez créer un nouvel utilisateur:
la source
Voici le moyen le plus simple:
la source
C'est comme ça que ça a fonctionné pour moi
la source
Juste pour être complet, je publierai la commande ad-hoc en utilisant ansible car il y a aussi un piège.
Essayez d'abord de générer un mot de passe chiffré à l'aide de l'utilitaire mkpasswd disponible sur la plupart des systèmes Linux:
Ensuite, essayez la commande ansible ad-hock:
Mais assurez-vous que:
--sudo
ou vous vous retrouvez avec une erreur comme (useradd: cannot lock /etc/passwd; try again later
)la source
La définition de tâche pour le module utilisateur doit être différente dans la dernière version d'Ansible.
la source
En combinant quelques solutions ci-dessus, j'ai créé un livre de lecture qui génère automatiquement des hachages de mot de passe corrects basés sur des mots de passe en texte clair stockés dans un fichier de coffre-fort local crypté:
Exécutez cette commande en utilisant l'option "--ask-vault-pass" pour décrypter votre fichier de coffre-fort (voir ansible-vault pour plus d'informations sur la gestion d'un coffre-fort chiffré).
la source
Comment créer un mot de passe chiffré pour passer à
password
var à lauser
tâche Ansible (à partir du commentaire de @Brendan Wood):Le résultat ressemblera à:
Exemple de
user
tâche:UPD: crypte utilisant SHA-512 voir ici et ici :
Python
Perl
Rubis
la source
Vous pouvez utiliser ansible-vault pour utiliser des clés secrètes dans les playbooks. Définissez votre mot de passe en yml.
ex. pass: secret ou
cryptez votre fichier secrets avec:
ansible-vault encrypt /path/to/credential.yml
ansible demandera un mot de passe pour le crypter. (je vais vous expliquer comment utiliser ce pass)
Et puis vous pouvez utiliser vos variables où vous le souhaitez. Personne ne peut les lire sans clé de coffre-fort.
Utilisation de la clé du coffre-fort:
via un argument de passage lors de l'exécution de playbook.
ou vous pouvez enregistrer dans un fichier comme password.txt et vous cacher quelque part. (utile pour les utilisateurs CI)
Dans votre cas: incluez vars yml et utilisez vos variables.
la source
password={{user.pass}}
va s'étendre pour inclure le mot de passe réel, alors qu'ansible attend le hachage là-bas.Générer un mot de passe aléatoire pour l'utilisateur
il faut d'abord définir la variable utilisateurs, puis suivre ci-dessous
Tâches:
la source
La réponse de Mxx est correcte, mais la
crypt.crypt()
méthode python 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 à partir de MacOS et exécutez un playbook sous Linux. Dans ce cas, vous pouvez utiliser passlib (
pip install passlib
pour installer localement).la source
Aucune des solutions ne fonctionnait directement sur mon Mac contrôlant Ubuntu. Donc, pour le bien des autres, en combinant les réponses Mxx et JoelB, voici la solution actuelle de Python 3:
Le résultat sera
$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.
, comme dans la réponse de Mxx.Mieux encore , utilisez SHA512 au lieu de MD5:
Résultat:
la source
J'ai créé un livre de jeu ansible qui vous permet de créer un compte Linux qui permet l'authentification par mot de passe.
Voir CreateLinuxAccountWithAnsible .
Le mot de passe haché est généré à l'aide de la
mkpasswd
commande. J'ai fourni les moyens d'installermkpasswd
sur différents systèmes d'exploitation.Voici les étapes requises pour utiliser mon script:
Remplacez
<your_user_name>
et à l'<your_password>
intérieurrun.sh
par le nom d'utilisateur et le mot de passe souhaités.Modifiez les informations de connexion dans
inventory
afin qu'ansible puisse se connecter à la machine pour créer un utilisateur.Exécutez
./run.sh
pour exécuter le script.la source
Si vous souhaitez accomplir cela en tant que commande ad hoc Ansible, vous pouvez effectuer les opérations suivantes:
Sortie de la commande ci-dessus:
la source
Je sais que je suis en retard à la fête, mais il y a une autre solution que j'utilise. Cela peut être pratique pour les distributions qui n'ont pas
--stdin
de binaire passwd.Label in
loop_control
est responsable de l'impression uniquement du nom d'utilisateur. L'ensemble du playbook ou simplement les variables utilisateur (que vous pouvez utiliservars_files:
) doivent être chiffrés avec ansible-vault.la source
Ma solution utilise la recherche et génère un mot de passe automatiquement.
la source
J'ai essayé de nombreux utilitaires, y compris mkpasswd, Python, etc. Mais il semble qu'il y ait un problème de compatibilité avec Ansible lors de la lecture des valeurs HASH générées par d'autres outils. Donc, finalement, cela a fonctionné par la valeur # ansible elle-même.
ansible all -i localhost, -m debug -a "msg = {{'yourpasswd' | password_hash ('sha512', 'mysecretsalt')}}"
Playbook -
la source
Eh bien, je suis totalement en retard pour faire la fête :) J'ai eu besoin d'un jeu ansible qui crée plusieurs utilisateurs locaux avec des mots de passe aléatoires. C'est ce que je suis venu avec, utilisé quelques exemples de haut et les mettre ensemble avec quelques changements.
create-user-with-password.yml
/roles/create-user-with-password/tasks/main.yml
la source