Ich habe eine ansible Aufgabe, die einen neuen Benutzer auf Ubuntu 12.04 erstellt;
- name: Add deployment user
action: user name=deployer password=mypassword
Es wird wie erwartet abgeschlossen, aber wenn ich mich als dieser Benutzer anmelde und versuche, mit dem von mir festgelegten Passwort zu sudo, heißt es immer, dass es falsch ist. Was mache ich falsch?
password
sollst du nicht im Klartext sein, sondern vorgewaschen.Antworten:
Wenn Sie das Handbuch für Ansible für
user
Module lesen , werden Sie zum Ansible-Beispiel- Github-Repo weitergeleitet, um Einzelheiten zur Verwendung vonpassword
Parametern zu erfahren .Dort sehen Sie, dass Ihr Passwort gehasht werden muss.
Wenn Ihr Playbook oder Ihre ansible Befehlszeile Ihr Passwort so wie es ist im Klartext hat, bedeutet dies, dass Ihr in Ihrer Schattendatei aufgezeichneter Passwort-Hash falsch ist. Das heißt, wenn Sie versuchen, sich mit Ihrem Passwort zu authentifizieren, stimmt der Hash nie überein.
Siehe auch Ansible FAQ in Bezug auf einige Nuancen von Passwort - Parameter und wie richtig es zu benutzen.
quelle
openssl passwd -salt <salt> -1 <plaintext>
zu verwenden, um den Kennwort-Hash zu generieren, und nicht den Python-Einzeiler, den Sie oben haben. Ich hatte einige Probleme, die korrekte Ausgabe von Python zu erhalten, wahrscheinlich aufgrund meiner eigenen Inkompetenz, und der Befehl openssl funktionierte besser./etc/shadow
nachdem ich das Passwort manuell mit festgelegt habepasswd <user>
.Ich bin vielleicht zu spät, um darauf zu antworten, aber kürzlich habe ich herausgefunden, dass jinja2-Filter die Generierung verschlüsselter Passwörter ermöglichen. In meinem
main.yml
generiere ich das verschlüsselte Passwort als:"uusername" und "upassword" werden als übergeben
--extra-vars
das Playbook übergeben und ich habe festgestellt, dass ich hier den jinja2-Filter verwendet habe, um das übergebene Passwort zu verschlüsseln.Ich habe das dazugehörige Tutorial zu meinem Blog hinzugefügt
quelle
password={{upassword|password_hash('sha512', upassword_salt)}}
. Auf diese Weise können Sie Salt in einen Variablentresor legen , wie Sie es vermutlich auchupassword
tun würden , und beide aus der task.yml heraushalten.update_password: on_create
dieser Antwort ein Benutzermodul hinzufügen , um zu verhindern, dass Kennwörter für bereits erstellte Benutzer ablaufen.pip install passlib
. Um dann eine mit Inline-Tresor verschlüsselte Zeichenfolge verwenden zu können, musste ich mit dem folgenden Zusatz neu formatieren :password: {{ upassword | string | password_hash('sha512') }}
. Dies vermeidet die Fehlermeldungsecret must be unicode or bytes, not ansible.parsing.yaml.objects.AnsibleVaultEncryptedUnicode
Ich möchte noch eine andere Lösung vorschlagen:
Warum ist es besser? Wie hier bereits erwähnt, sollten Ansible-Spiele idempotent sein. Sie sollten sie nicht als eine Abfolge von Aktionen im imperativen Stil betrachten, sondern als einen gewünschten Zustand, einen deklarativen Stil. Infolgedessen sollten Sie es mehrmals ausführen können und dasselbe Ergebnis und denselben Serverstatus erhalten.
Das klingt alles großartig, aber es gibt einige Nuancen. Einer von ihnen verwaltet Benutzer. "Gewünschter Status" bedeutet, dass jedes Mal, wenn Sie ein Spiel ausführen, das einen Benutzer erstellt, dieser aktualisiert wird, um genau diesem Status zu entsprechen. Mit "aktualisiert" meine ich, dass auch sein Passwort geändert wird. Aber höchstwahrscheinlich ist es nicht das, was Sie brauchen. Normalerweise müssen Sie einen Benutzer erstellen, sein Passwort nur einmal festlegen und ablaufen lassen. Weitere Wiedergabeläufe sollten sein Passwort nicht aktualisieren.
Glücklicherweise hat Ansible ein
update_password
Attribut imuser
Modul , das dieses Problem löst. Wenn Sie dies mit registrierten Variablen mischen, können Sie sein Passwort auch nur dann ablaufen lassen, wenn der Benutzer tatsächlich aktualisiert wird.Beachten Sie, dass der Benutzer aktualisiert wird, wenn Sie die Shell des Benutzers manuell ändern (angenommen, Sie mögen die Shell nicht, die der böse Administrator in seinem Spiel erzwungen hat), sodass sein Passwort abgelaufen ist.
Beachten Sie auch, wie Sie einfache Klartext-Anfangspasswörter in Spielen verwenden können. Sie müssen sie nicht woanders codieren und Hashes einfügen. Sie können dafür den Jinja2-Filter verwenden . Dies kann jedoch eine Sicherheitslücke sein, wenn sich jemand vor Ihrer ersten Anmeldung anmeldet.
quelle
"{{ '{{vaulted_password}}' | password_hash('sha512') }}"
scheint nicht zu funktionieren ...{{ vaulted_password | password_hash('sha512') }}
, wovaulted_password
ist ein Schlüssel für den Wert im Tresor?update_password: on_create
scheint nicht zu funktionieren (es gibt einen offenen Fehler ab 2017), daher ändern sich Kennwörter jedes Mal, wenn sich der Status eines Benutzers ändert.Das Ansible-Modul "Benutzer" verwaltet Benutzer auf idempotente Weise. Im folgenden Playbook deklariert die erste Aufgabe state = present für den Benutzer. Beachten Sie, dass ' register: newuser ' in der ersten Aktion der zweiten Aktion hilft, festzustellen, ob der Benutzer neu (newuser.changed == True) oder vorhanden (
newuser.changed==False
) ist, und das Kennwort nur einmal zu generieren.Das Ansible-Spielbuch enthält:
quelle
versuche es so
quelle
Der Zweck der Rolle in dieser Antwort besteht darin, ein zufälliges Kennwort für new_user_name zu generieren und das Kennwort sofort abzulaufen. Der neue_Benutzername ist erforderlich, um das Kennwort bei seiner ersten Anmeldung zu ändern.
create_user.yml:
Rollen / create_user / task / main.yml:
Wenn Sie einen neuen Benutzer erstellen möchten:
quelle
Dies ist der einfache Weg:
quelle
So hat es bei mir funktioniert
quelle
Der Vollständigkeit halber werde ich den Ad-hoc-Befehl mit ansible veröffentlichen, da es dort auch einen Haken gibt.
Versuchen Sie zunächst, ein verschlüsseltes Kennwort mit dem Dienstprogramm mkpasswd zu generieren, das auf den meisten Linux-Systemen verfügbar ist:
Versuchen Sie dann den ansible ad-hock-Befehl:
Aber stellen Sie sicher:
--sudo
oder Sie erhalten einen Fehler wie (useradd: cannot lock /etc/passwd; try again later
)quelle
Die Aufgabendefinition für das Benutzermodul sollte in der neuesten Ansible-Version unterschiedlich sein.
quelle
Aus einigen Lösungen von oben habe ich ein Playbook erstellt, das automatisch korrekte Passwort-Hashes basierend auf Klartext-Passwörtern generiert, die in einer verschlüsselten, lokalen ansible-Tresordatei gespeichert sind:
Führen Sie diesen Befehl mit der Option "--ask-vault-pass" aus, um Ihre Tresordatei zu entschlüsseln (Informationen zum Verwalten eines verschlüsselten Tresors finden Sie unter ansible-vault).
quelle
So erstellen Sie ein verschlüsseltes Kennwort für die Übergabe an
password
var an die Ansible-user
Aufgabe (aus dem Kommentar von @Brendan Wood):Das Ergebnis sieht folgendermaßen aus:
Beispiel einer
user
Aufgabe:UPD: Krypta mit SHA-512 siehe hier und hier :
Python
Perl
Rubin
quelle
Sie können ansible-vault verwenden, um geheime Schlüssel in Spielbüchern zu verwenden. Definieren Sie Ihr Passwort in yml.
Ex. Pass: geheim oder
verschlüsseln Sie Ihre Geheimdatei mit:
ansible-vault encrypt /path/to/credential.yml
ansible fragt nach einem Passwort, um es zu verschlüsseln. (Ich werde erklären, wie man diesen Pass benutzt)
Und dann können Sie Ihre Variablen verwenden, wo Sie möchten. Niemand kann sie ohne Tresorschlüssel lesen.
Verwendung des Tresorschlüssels:
über übergebene Argumente beim Ausführen von Playbook.
oder Sie können in einer Datei wie password.txt speichern und irgendwo verstecken. (nützlich für CI-Benutzer)
In Ihrem Fall: Fügen Sie vars yml hinzu und verwenden Sie Ihre Variablen.
quelle
password={{user.pass}}
erweitert wird, um das eigentliche Passwort einzuschließen, während ansible den Hash dort erwartet.Zufälliges Passwort für Benutzer generieren
Zuerst muss die Benutzervariable definiert werden, dann folgen Sie unten
Aufgaben:
quelle
Die Antwort von Mxx ist richtig, aber Sie, die Python-
crypt.crypt()
Methode, ist nicht sicher, wenn verschiedene Betriebssysteme beteiligt sind (im Zusammenhang mit dem auf Ihrem System verwendeten Glibc-Hash-Algorithmus).Zum Beispiel funktioniert es nicht, wenn Sie Ihren Hash unter MacOS generieren und ein Playbook unter Linux ausführen. In diesem Fall können Sie passlib verwenden (
pip install passlib
um lokal zu installieren).quelle
Keine der Lösungen funktionierte direkt auf meinem Mac, der Ubuntu steuert. Für andere, die Mxx- und JoelB-Antworten kombinieren, ist hier die aktuelle Python 3-Lösung:
Das Ergebnis wird
$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.
wie in der Antwort von Mxx sein.Besser noch , verwenden Sie SHA512 anstelle von MD5:
Ergebnis:
quelle
Ich habe ein Ansible-Playbook erstellt, mit dem Sie ein Linux-Konto erstellen können, das die Kennwortauthentifizierung ermöglicht.
Siehe CreateLinuxAccountWithAnsible .
Das Hash-Passwort wird mit dem
mkpasswd
Befehl generiert . Ich habe die Möglichkeiten zur Installation bereitgestelltmkpasswd
auf verschiedenen Betriebssystemen .Hier sind die Schritte, die zur Verwendung meines Skripts erforderlich sind:
Ersetzen
<your_user_name>
und<your_password>
innenrun.sh
durch Ihren gewünschten Benutzernamen und Passwort.Ändern Sie die Verbindungsinformationen
inventory
so, dass ansible eine Verbindung zum Computer herstellen kann, um einen Benutzer zu erstellen.Ausführen
./run.sh
, um das Skript auszuführen.quelle
Wenn Sie dies als Ansible-Ad-hoc-Befehl ausführen möchten, können Sie Folgendes tun:
Ausgabe vom obigen Befehl:
quelle
Ich weiß, dass ich zu spät zur Party komme, aber es gibt eine andere Lösung, die ich benutze. Dies kann für Distributionen nützlich sein, die keine
--stdin
passwd-Binärdatei haben.Label in
loop_control
ist dafür verantwortlich, nur den Benutzernamen zu drucken . Das gesamte Playbook oder nur Benutzervariablen (die Sie verwenden könnenvars_files:
) sollten mit ansible-vault verschlüsselt werden.quelle
Meine Lösung verwendet die Suche und generiert automatisch ein Passwort.
quelle
Versuchte viele Dienstprogramme, einschließlich mkpasswd, Python usw. Aber es scheint, dass es ein Kompatibilitätsproblem mit Ansible beim Lesen von HASH-Werten gibt, die von anderen Tools generiert wurden. Also funktionierte es schließlich mit ansible # value selbst.
ansible all -i localhost, -m debug -a "msg = {{'yourpasswd' | password_hash ('sha512', 'mysecretsalt')}}"
Spielbuch -
quelle
Nun, ich bin total spät zum Feiern :) Ich hatte das Bedürfnis nach einem vernünftigen Spiel, das mehrere lokale Benutzer mit zufälligen Passwörtern erstellt. Das, was ich mir ausgedacht habe, hat einige Beispiele von oben verwendet und sie mit einigen Änderungen zusammengestellt.
create-user-with-password.yml
/roles/create-user-with-password/tasks/main.yml
quelle