Wie gebe ich ein Sudo-Passwort für Ansible auf nicht interaktive Weise an?
Ich verwende Ansible Playbook wie folgt:
$ ansible-playbook playbook.yml -i inventory.ini \
--user=username --ask-sudo-pass
Aber ich möchte es so laufen lassen:
$ ansible-playbook playbook.yml -i inventory.ini \
--user=username` **--sudo-pass=12345**
Gibt es einen Weg? Ich möchte meine Projektbereitstellung so weit wie möglich automatisieren.
Antworten:
Sie können eine Variable in der Befehlszeile über übergeben
--extra-vars "name=value"
. Sudo Passwortvariable istansible_sudo_pass
. Ihr Befehl würde also so aussehen:Update 2017 : Ansible 2.2.1.0 verwendet jetzt var
ansible_become_pass
. Beides scheint zu funktionieren.quelle
history -c
Nach der Ausführung des yml..bash_history
.In den Dokumenten wird dringend empfohlen, das sudo-Kennwort nicht im Klartext festzulegen und stattdessen
--ask-sudo-pass
beim Ausführen in der Befehlszeile zu verwendenansible-playbook
Update 2016:
Ansible 2.0 (nicht 100% wenn)
--ask-sudo-pass
als veraltet markiert . In den Dokumenten wird jetzt empfohlen,--ask-become-pass
stattdessen zu verwenden und gleichzeitig die Verwendung insudo
allen Playbooks mit auszutauschenbecome
.quelle
Der wahrscheinlich beste Weg, dies zu tun - vorausgesetzt, Sie können die von scottod bereitgestellte NOPASSWD-Lösung nicht verwenden, ist die Verwendung der Lösung von Mircea Vutcovici in Kombination mit Ansible Vault .
Zum Beispiel könnten Sie ein Spielbuch wie das folgende haben:
Hier fügen wir eine Datei mit dem Namen
secret
sudo hinzu, die unser sudo-Passwort enthält.Wir werden ansible-vault verwenden, um eine verschlüsselte Version dieser Datei zu erstellen:
Sie werden nach einem Kennwort gefragt und öffnen dann Ihren Standardeditor, um die Datei zu bearbeiten. Sie können Ihre
ansible_sudo_pass
hier setzen.zB
secret
::Speichern und beenden, jetzt haben Sie eine verschlüsselte
secret
Datei, die Ansible entschlüsseln kann, wenn Sie Ihr Playbook ausführen. Hinweis: Sie können die Datei mit bearbeitenansible-vault edit secret
(und das Kennwort eingeben, das Sie beim Erstellen der Datei verwendet haben).Das letzte Puzzleteil besteht darin, Ansible eine zu geben, mit
--vault-password-file
der es Ihresecret
Datei entschlüsseln kann.Erstellen Sie eine Datei mit dem Namen
vault.txt
und geben Sie das Kennwort ein, das Sie beim Erstellen Ihrer Datei verwendet habensecret
Datei verwendet haben. Das Kennwort sollte eine Zeichenfolge sein, die als einzelne Zeile in der Datei gespeichert ist.Aus den Ansible Docs:
Endlich: Sie können Ihr Playbook jetzt mit so etwas wie ausführen
Das Obige setzt das folgende Verzeichnislayout voraus:
Weitere Informationen zu Ansible Vault finden Sie hier: https://docs.ansible.com/playbooks_vault.html
quelle
ansible-vault create group_vars/all/ansible.yml
und dort hinzufügenansible_sudo_pass: yourpassword
. Keine Notwendigkeit, Spielbücher oder Inventar zu ändernfatal: [localhost]: FAILED! => {"changed": false, "failed": true, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE", "parsed": false}
Wenn Sie sich den Code (
runner/__init__.py
) ansehen, können Sie ihn wahrscheinlich in Ihrer Inventardatei festlegen:Es scheint auch einige Bestimmungen in der
ansible.cfg
Konfigurationsdatei zu geben, die derzeit jedoch nicht implementiert sind (constants.py
).quelle
host_vars
oder zu speicherngroup_vars
und die Datei dann mit ansible-vault zuIch glaube nicht, dass Sie mit ansible ein Passwort in den Flags angeben können, wie Sie es möchten. Es kann irgendwo in den Konfigurationen sein, dass dies eingestellt werden kann, aber dies würde die Verwendung von Ansible insgesamt weniger sicher machen und würde nicht empfohlen werden.
Sie können einen Benutzer auf dem Zielcomputer erstellen und ihm kennwortlose Sudo-Berechtigungen für alle Befehle oder eine eingeschränkte Liste von Befehlen gewähren.
Wenn Sie
sudo visudo
eine Zeile wie die folgende ausführen und eingeben, muss der Benutzer 'privilegedUser' kein Kennwort eingeben müssen, wenn er Folgendes ausführtsudo service xxxx start
:quelle
Das sudo-Passwort wird als aufgerufene Variable gespeichert
ansible_sudo_pass
. Sie können diese Variable auf verschiedene Arten festlegen:Pro Host in Ihrer Inventar-Hosts-Datei (
inventory/<inventoryname>/hosts
)Pro Gruppe in Ihrer Inventargruppendatei (
inventory/<inventoryname>/groups
)Pro Gruppe in Gruppe vars (
group_vars/<groupname>/ansible.yml
)Pro Gruppe verschlüsselt (
ansible-vault create group_vars/<groupname>/ansible.yml
)quelle
Sie können das Kennwort für eine Gruppe oder für alle Server gleichzeitig festlegen:
quelle
Ich habe mir hier die Haare ausgerissen, jetzt habe ich eine Lösung gefunden, die macht, was ich will:
1 verschlüsselte Datei pro Host mit dem sudo-Passwort
/ etc / ansible / hosts:
Dann erstellen Sie für jeden Host eine verschlüsselte Var-Datei wie folgt:
mit Inhalt
Wie Sie das Tresorkennwort (Eingabe über --ask-vault-pass) oder per cfg organisieren, liegt ganz bei Ihnen
Aufgrund dessen vermute ich, dass Sie einfach die gesamte Hosts-Datei verschlüsseln können ...
quelle
ansible-playback
. Ich musste-e @vault/filename.ext
den Tresor mit meinemansible-playbook
Anruf benutzen .Ein versierter Weg , dies zu tun , ist Sie speichern
sudo
Passwort in einem sicheren Tresor wie Lastpass oder KeePass und es dann passiertansible-playbook
die Verwendung ,-e@
sondern um den Inhalt in einer aktuellen Datei von hartzucodieren, können Sie das Konstrukt verwenden-e@<(...)
einen Befehl in einem laufen Unter-Shell und leiten Sie die Ausgabe (STDOUT) an einen anonymen Dateideskriptor weiter, und geben Sie das Kennwort effektiv an die-e@<(..)
.Beispiel
Das Obige macht mehrere Dinge, lassen Sie es uns zusammenfassen.
ansible-playbook -i /tmp/hosts pb.yml
- Offensichtlich ein Playbook über Ansible-Playbook laufen lassen$(lpass show folder1/item1 --password)"
- führt die LastPass-CLI auslpass
und ruft das zu verwendende Kennwort abecho "ansible_sudo_pass: ...password..."
- nimmt den String 'ansible_sudo_pass:' und kombiniert ihn mit dem vonlpass
-e@<(..)
- fügt das Obige zusammen und verbindet die Subshell von<(...)
als Dateideskriptor für den Verbrauchansible-playbook
.Weitere Verbesserungen
Wenn Sie das lieber nicht jedes Mal eingeben möchten, können Sie einfach solche Dinge tun. Erstellen Sie zunächst einen Alias
.bashrc
wie folgt:Jetzt können Sie Ihr Playbook folgendermaßen ausführen:
Verweise
quelle
--extra-vars @<(echo ansible_become_pass: $(op get item <item name> | jq --raw-output '.details.sections[0].fields[] | select(.t=="password").v'))
/dev/fd/63
wenn das Kennwort in einem temporären Dateideskriptor enthalten ist, wird es nicht offengelegt.Wenn Sie mit der Speicherung von Kennwörtern in Nur-Text-Dateien vertraut sind, können Sie auch eine JSON-Datei mit dem Parameter --extra-vars verwenden (schließen Sie die Datei unbedingt von der Quellcodeverwaltung aus):
Ansible unterstützt diese Option seit 1.3 .
quelle
Sie können das Sudo-Passwort für Ihr Playbook wie folgt in die Hosts-Datei schreiben:
quelle
Ansible Vault wurde hier ein paar Mal vorgeschlagen, aber ich bevorzuge Git-Crypt, um vertrauliche Dateien in meinen Playbooks zu verschlüsseln. Wenn Sie git verwenden, um Ihre ansible Playbooks zu behalten, ist es ein Kinderspiel. Das Problem, das ich bei ansible vault festgestellt habe, ist, dass ich unweigerlich auf verschlüsselte Kopien der Datei stoße, mit der ich arbeiten möchte, und sie entschlüsseln muss, bevor ich arbeiten kann.
git-crypt
bietet einen schöneren Workflow IMO.Auf diese Weise können Sie Ihre Passwörter in eine Variable in Ihrem Playbook einfügen und Ihr Playbook wie folgt als verschlüsselte Datei markieren
.gitattributes
:Ihr Playbook wird auf Github transparent verschlüsselt. Dann müssen Sie entweder Ihren Verschlüsselungsschlüssel auf dem Host installieren, auf dem Sie ansible ausführen, oder den Anweisungen in der Dokumentation folgen, um ihn einzurichten
gpg
.Hier finden Sie gute Fragen und Antworten zu Weiterleitungsschlüsseln
gpg
wie Ihren Weiterleitungs-ssh-agent
SSH-Schlüsseln: /superuser/161973/how-can-i-forward-a-gpg-key-via-ssh-agent .quelle
Sie können das
sshpass
Dienstprogramm wie folgt verwenden:quelle
Die Verwendung von ansible 2.4.1.0 und den folgenden Funktionen soll funktionieren:
Führen Sie das Playbook mit diesem Inventar wie folgt aus :
quelle
Mein Hack, um dies zu automatisieren, bestand darin, eine Umgebungsvariable zu verwenden und über darauf zuzugreifen
--extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"
.Exportieren Sie eine env-Variable, vermeiden Sie jedoch den Bash- / Shell-Verlauf (stellen Sie ein Leerzeichen oder andere Methoden voran). Z.B:
Suchen Sie die env-
ansible_become_pass
Variableansible-playbook
, während Sie die zusätzliche Variable an Folgendes übergeben: ZB:Gute alternative Antworten:
ansible_become_pass
. Das ist anständig. Für die paranoiden Teams, die ansible Tresorkennwörter teilen und ansible Spiele mit einzelnen Konten ausführen müssen, können sie jedoch das gemeinsame Tresorkennwort verwenden, um das Betriebssystemkennwort des jeweils anderen umzukehren (Identitätsdiebstahl). Sie müssen wohl Ihrem eigenen Team vertrauen?@
@ slm wurde im temporären Dateideskriptor generiert und verwendet das Präfix, um die ansible-Variable aus dem Dateideskriptor zu lesen . Vermeidet zumindest die Bash-Geschichte. Nicht sicher, aber hoffentlich wird das Subshell-Echo bei der Überwachungsprotokollierung (z. B. auditd) nicht erfasst und angezeigt.quelle
Sie können ansible Tresor verwenden der Ihr Passwort in einen verschlüsselten Tresor . Danach können Sie Variablen aus dem Tresor in Playbooks verwenden.
Einige Dokumentationen zu Ansible Vault:
http://docs.ansible.com/playbooks_vault.html
Wir verwenden es als Tresor pro Umgebung. Um den Tresor zu bearbeiten, haben wir folgenden Befehl:
ansible-vault edit inventories/production/group_vars/all/vault
Wenn Sie eine Tresorvariable aufrufen möchten, müssen Sie ansible-playbook mit folgenden Parametern verwenden:
ansible-playbook -s --vault-password-file=~/.ansible_vault.password
Ja, wir speichern das Tresorkennwort im lokalen Verzeichnis im Klartext, aber es ist nicht gefährlicher als das Speichern des Stammkennworts für jedes System. Das Root-Passwort befindet sich in der Tresordatei oder Sie können es wie eine Sudoers-Datei für Ihren Benutzer / Ihre Gruppe haben.
Ich empfehle, die sudoers-Datei auf dem Server zu verwenden. Hier ist ein Beispiel für den Gruppenadministrator:
%admin ALL=(ALL) NOPASSWD:ALL
quelle
Rufen Sie einfach Ihr Spielbuch mit an
--extra-vars "become_pass=Password"
werden_pass = ('ansible_become_password', 'ansible_become_pass')
quelle
Nach fünf Jahren kann ich sehen, dass dies immer noch ein sehr relevantes Thema ist. Spiegelt etwas die Antwort von Leukos wider, die ich in meinem Fall am besten finde, indem ich nur ansible Tools verwende (ohne zentralisierte Authentifizierung, Token oder was auch immer). Dies setzt voraus, dass Sie auf allen Servern denselben Benutzernamen und denselben öffentlichen Schlüssel haben. Wenn Sie dies nicht tun, müssen Sie natürlich genauer sein und die entsprechenden Variablen neben den Hosts hinzufügen:
Hinzufügen:
Dann:
Zumindest müssen Sie auf diese Weise nicht mehr die Variablen schreiben, die auf die Passwörter verweisen.
quelle
Die obige Lösung von @ toast38coza hat bei mir funktioniert. nur das sudo: ja ist in Ansible jetzt veraltet. Verwenden Sie stattdessen Werden und Werden_Benutzer .
quelle
Wir können EXPECT BLOCK auch in ansible verwenden, um Bash zu erzeugen und es an Ihre Bedürfnisse anzupassen
quelle
Sehr einfach und nur in der Variablendatei hinzufügen:
Beispiel:
Und fügen Sie diese hinzu:
quelle
Nur ein Nachtrag, damit niemand sonst den Ärger durchmacht, den ich kürzlich gemacht habe:
AFAIK, die beste Lösung ist eine nach dem Vorbild von toast38coza. Wenn es sinnvoll ist, Ihre Passwortdateien und Ihr Playbook statisch miteinander zu verknüpfen, folgen Sie seiner Vorlage mit
vars_files
(oderinclude_vars
). Wenn Sie sie getrennt halten möchten, können Sie den Tresorinhalt wie folgt in der Befehlszeile angeben:Das ist im Nachhinein offensichtlich, aber hier sind die Fallstricke:
Das verdammte @ Zeichen. Wenn Sie es weglassen, schlägt das Parsen im Hintergrund fehl und das Ansible-Playbook wird so fortgesetzt, als hätten Sie die Datei überhaupt nicht angegeben.
Sie müssen den Inhalt des Tresors explizit importieren, entweder mit einer Befehlszeile --extra-vars / -e oder innerhalb Ihres YAML-Codes. Das
--ask-vault-pass
Flag macht nichts für sich (außer Sie zur Eingabe eines Werts aufzufordern, der später verwendet werden kann oder nicht).Mögen Sie Ihre "@" einfügen und eine Stunde sparen.
quelle
Das hat bei mir funktioniert ... Erstellt Datei /etc/sudoers.d/90-init-users Datei mit NOPASSWD
Dabei ist "Benutzer" Ihre Benutzer-ID.
quelle