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.