Wie stelle ich den Standard-Ansible-Benutzernamen / Passwort für die SSH-Verbindung ein?

60

Ich verwende Ansible und habe diese Konfiguration in meinem Inventar / all:

[master]
192.168.1.10 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant

[slave]
192.168.1.11 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant
192.168.1.12 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant

[app]
192.168.1.13 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant

[all:children]
master
slave

Ich möchte nicht alle Parameter für jede neue Instanz wiederholen. Wie kann ich sie nur an einem Ort konfigurieren? Gibt es eine Datei mit diesen Parametern?

Robert
quelle
3
~/.ssh/config
Ceejayoz
1
@ceejayoz Könnten Sie etwas erklären
Robert
Ich bin kein Ansible-Administrator, und die Dokumente zu diesem Thema sind trübe ( ist dies eine "Variable" oder ein "Parameter" und gibt es einen Unterschied? ), Aber es sieht so aus, als könnten Sie Variablen auf Gruppenebene irgendwie definieren.
DerfK

Antworten:

74

Sie können Ihrer Inventardatei den folgenden Abschnitt hinzufügen:

[all:vars]
ansible_connection=ssh
ansible_user=vagrant
ansible_ssh_pass=vagrant

Hinweis: Vor Ansible 2.0 ansible_userwar ansible_ssh_user.

Alexey Labzov
quelle
2
Oberhalb von Ansible 2.0 sollte es sein: [all:vars] ansible_connection=ssh ansible_port=22 ansible_user=admin
zx1986
2
@ zx1986 wo hast du das gelesen?
030
2
@ 030 hier: docs.ansible.com/ansible/…
zx1986
Beachten Sie, dass Port 22 der Standard für ist ansible_port, sodass Sie ihn nicht explizit angeben müssen, sofern nicht anders angegeben. Interessiert es jemanden, der es versteht, Variablen gleichzeitig auf mehr als eine Gruppe anzuwenden (aber nicht auf 'alle'), scheint die Kommatrennung nicht zu funktionieren.
William Turrell
1
@WilliamTurrell etwas spät, aber .. Sie können eine Gruppe von Gruppen erstellen (mit dem Modifikator: children) und anschließend die Variablen festlegen (mit dem Modifikator: vars).
Lasse Halberg Haarbye
23

Gruppenvariablen

Sie können Variablen festlegen, die für alle Hosts gelten, indem Sie das in Ansibles Best Practices- Dokument angegebene Playbook-Layout verwenden und eine Datei erstellen, in der Sie sie definieren .group_vars/all

---
# file: group_vars/all
ansible_connection: ssh 
ansible_ssh_user: vagrant 
ansible_ssh_pass: vagrant

[edit] Ich bin allerdings verwirrt darüber, was du versuchst zu tun. Sie müssen den Ansible-Benutzer oder das Kennwort nicht im Inventar angeben. Wenn Sie Vagrant verwenden, ist dies definitiv nicht der Fall. Wenn Sie Ansible über die Befehlszeile aufrufen, können Sie den Benutzer mit angeben --user=vagrantund ihn nach dem Kennwort fragen lassen --ask-pass.

Philip Wilson
quelle
1
Ich muss nur meine Infrastruktur besser organisieren. Wenn immer, werde ich vagrant verwenden: vagrant Ich möchte es an einer Stelle konfigurieren, an der Ansible standardmäßig geladen wird, aber ich weiß nicht, wo. Jede Verbindung, die ausgeführt werden soll, muss diese verwenden.
Robert
Muss die Datei benannt werden group_vars/all/main.ymloder einfach group_vars/all?
Realtebo
Dieser funktionierte für mich nach der Installation von sshpass-"you must install the sshpass program"
user9869932
1
@realtebo Die Datei muss benannt werden group_vars/all.
xloto
1
-k for ask pass macht "allen" nicht viel Spaß, wenn jeder Host ein anderes Passwort hat. Ja, Sie brauchen sshpass, und ja, Sie müssen möglicherweise known_hosts setzen, wenn Sie noch nie eine Verbindung hergestellt haben. ~ \ .Ssh \ config ist der richtige Weg.
McKenzm
5

Ich denke, dass es besser ist, die Installation von SSH-Schlüsseln auf allen Servern über den Pull zu verwenden. Sie sollten ssh-copy-id nur pro Knoten ausführen und Ihren SSH-Schlüssel überall installieren, damit Ansible sich mit Ihrem SSH-Schlüssel anmelden kann. Es ist sicherer, Passwörter nicht im Playbook / Inventar zu speichern.

Dazu sollten Sie Ihr ssh-Schlüsselpaar generieren und anschließend ssh-copy-id für alle Server ausführen.

Podarok
quelle
1
Wenn jemand das Passwort aus Ihrer Konfigurationsdatei stehlen kann, kann er wahrscheinlich auch auf Ihre SSH-Schlüssel zugreifen. Und das hat überhaupt nichts mit der Beantwortung der OP-Frage zu tun. Diese Frage wurde nicht nach Meinungen zu Alternativen gefragt.
Muh Fugen
@ MuhFugen> Wie kann ich sie nur an einer Stelle konfigurieren? Gibt es eine Datei mit diesen Parametern? Dies ist eine exakte Phrase, die die Tür für die Meinung verlässt, und die Antwort gibt ein Verständnis für die richtige Richtung. Das Stehlen von Konfigurationen (die irgendwo im Git-Repo leben könnten) ist nicht dasselbe wie das Stehlen von privaten Schlüsseln.
Podarok
4

Fügen Sie unten den Inventar-Hosts hinzu.

Für Ansible <2.0:

[all:vars]
ansible_connection=ssh
ansible_ssh_user=vagrant 
ansible_ssh_pass=vagrant

Für Ansible> = 2.0 :

[all:vars]
ansible_connection=ssh # actually default mode smart is OK
ansible_user=vagrant
ansible_pass=vagrant # or ansible_ssh_pass=vagrant
Mithril
quelle
Der Link erwähnt ansible_ssh_pass, nicht ansible_pass.
Matthias Weiler
2

Haftungsausschluss: Ich habe dies nur unter OSX getestet. Aufgrund der verschiedenen Dokumente erwarte ich, dass es auf anderen Plattformen funktioniert.

"Projektverzeichnis" bezieht sich auf das Basisverzeichnis für das Vagrant-Projekt - das Verzeichnis, das enthält Vagrantfile.

Von Vagrant automatisch generierte Ansible Inventory-Datei:

Vagrant erstellt eine Inventardatei mit den Standard-Ansible-Verbindungsvariablen. Suchen Sie es in <project directory>/.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory.

Diese Datei wird von Vagrant bei Bedarf neu generiert, sodass manuelle Änderungen überschrieben werden. Den Vagrant-Dokumenten zufolge können Sie jedoch mehrere Computer, Gruppenvariablen usw. in angeben Vagrantfile, die dieser Inventardatei hinzugefügt werden.

Konfigurieren Sie Ansible als Standard für diese Inventardatei:

Um diese Datei als Standard für den ansibleBefehl festzulegen, wenn Sie sich im Projektverzeichnis (auf dem Host) befinden, fügen Sie eine ansible.cfgDatei mit dem folgenden Inhalt in Ihr Projektverzeichnis ein, und ändern Sie den Pfad nach Bedarf:

[defaults]
inventory = ./path/to/inventory

Um zu bestätigen, dass diese Inventardatei verwendet wird, suchen Sie sie als Standard, der von ansible gemeldet wird:

(aus dem Projektverzeichnis)

$ ansible | grep inventory ERROR! Missing target hosts -i INVENTORY, --inventory-file=INVENTORY specify inventory host path (default=./.vagrant/provis ioners/ansible/inventory/vagrant_ansible_inventory) or

So bestätigen Sie Ihre Gastgeber:

$ ansible all --list-hosts hosts (2): master slave

Ansible mit diesen Hosts verwenden:

Aus dem Projektverzeichnis heraus sollten Sie dann in der Lage sein, ansibledie von Ihnen definierten Hosts wie gewohnt zu verwenden Vagrantfile.

Zum Beispiel:

ansible slave -a 'hostname'
kentr
quelle