In diesem Beitrag geht es um virtuelle Multipass-Maschinen mit Ansible
Voraussetzungen
Eine virtuelle Multipass-Maschine sollte gemäß den Anweisungen im Artikel Virtuelle Multipass-Maschine erstellt und mit einem privaten Schlüssel authentifiziert werden. Beachten Sie, wo die Datei mit dem privaten Schlüssel gespeichert ist.
Die zweite Voraussetzung ist Ansible. Anweisungen zur Installation von Ansible finden Sie in der offiziellen Ansible-Dokumentation.
Vorbereitungen
Vorbereitungen für das Beispiel dieses Artikels sind wie folgt:
- Erstellen Sie ein Verzeichnis für die Dateien des Beispiels in diesem Artikel.
Ich nenne mein Verzeichnis "AnsibleMultipass". - Kopieren Sie die private Schlüsseldatei namens „user_key“ in das neue Verzeichnis.
Diese Schlüsseldatei wurde im Rahmen der Erstellung der Multipass-VM im vorherigen Artikel erstellt. - Starten Sie die Multipass-VM mit schlüsselbasierter Authentifizierung.
- Suchen Sie die IP-Adresse der Multipass-VM mit schlüsselbasierter Authentifizierung.
Dies kann zum Beispiel mit der Multipass-Liste erreicht werden Befehl in einem Terminalfenster. In meinem Fall ist die IP 192.168.64.20.
Ansible-Inventar
Ein Ansible-Inventar teilt Ansible mit, wie eine Verbindung zu einem oder mehreren Knoten in der Infrastruktur hergestellt werden soll. Das Beispiel dieses Artikels hat also eine sehr kleine Infrastruktur, die nur aus einer einzigen virtuellen Maschine besteht.
Erstellen Sie im AnsibleMultipass-Verzeichnis eine Datei namens „multipass-vm-inventory.yml“ mit folgendem Inhalt:
all:
hosts:
multipassvm1:
ansible_connection: ssh
ansible_host: "192.168.64.20"
ansible_user: vmadmin
ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o ControlMaster=no -o ControlPath=none"
ansible_ssh_private_key_file: user_key
Beachten Sie Folgendes:
- Es gibt einen Host in dieser Ansible-Inventardatei – multipassvm1.
- Der Verbindungstyp zum Host wird durch den Wert ansible_connection angegeben, der SSH ist.
- Die IP-Adresse des Hosts oder der DNS-Name, falls vorhanden, wird durch den Wert ansible_host angegeben.
- Die IP-Adresse muss durch die IP-Adresse der lokalen Multipass-VM ersetzt werden.
- Der Wert von ansible_user, vmadmin, ist der Name des Benutzers, der beim Verbinden mit dem Host verwendet wird.
- Dieser Wert, in diesem Beispiel vmadmin, muss der Benutzername sein, der verwendet wurde, als die Schlüssel mit dem Befehl ssh-keygen generiert wurden.
- Die ansible_ssh_common_args geben gemeinsame Argumente an, die an sftp-, scp- und ssh-Befehle angehängt werden.
- StrictHostKeyChecking=no schaltet die Abfrage aus, ob neue Schlüssel vertrauenswürdig sind oder nicht. Stattdessen werden alle neuen Schlüssel stillschweigend zur Datei known_hosts hinzugefügt.
- Die ControlMaster- und ControlPath-Einstellungen sind eine Problemumgehung für ein Problem auf meinem Computer, das dadurch verursacht wurde, dass der Standard-ControlPath ein Leerzeichen enthielt, das nicht maskiert wurde. Diese sind auf anderen Computern möglicherweise nicht erforderlich und können weggelassen werden.
- Schließlich gibt der Wert ansible_ssh_private_key_file den Namen und optional den Ort der privaten Schlüsseldatei an, die verwendet wird, wenn eine Verbindung zum Host hergestellt wird.
- Wenn nur ein Dateiname angegeben wird, ist der Speicherort der Schlüsseldatei relativ zur Inventardatei. Kann ein absoluter Ort sein.
Ansible-Module
Wenn das Ansible-Inventar vorhanden ist, können wir jetzt Ansible-Module für die Hosts im Inventar ausführen. Daher werde ich in diesem Artikel nur einige Beispiele nennen. Eine Liste aller verfügbaren Ansible-Module finden Sie in der Dokumentation.
Ping-Modul
Eines der Ansbile-Module ist das Ping-Modul. Wie in der Dokumentation angegeben, versucht das Ping-Modul, eine Verbindung zu einem Host herzustellen und eine verwendbare Python-Installation zu überprüfen.
Geben Sie in einem Terminalfenster im Verzeichnis AnsibleMultipass den folgenden Befehl ein:
ansible -i multipass-vm-inventory.yml multipassvm1 -m ping
Der obige Befehl hat die folgenden Parameter:
- -i multipass-vm-inventory.yml
Verwenden Sie eine benutzerdefinierte Inventardatei namens multipass-vm-inventory.yml - multipassvm1
Name des Hosts, auf dem das Modul ausgeführt werden soll. Muss ein Host im verwendeten Inventar sein. - -m ping
Gibt den Namen des auszuführenden Moduls an – in diesem Fall ping.
Die resultierende Ausgabe sollte etwa so aussehen:
multipassvm1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
Wie zu sehen ist, wurde die Verbindung mit der Multipass-VM erfolgreich hergestellt und ein Python-Interpreter entdeckt.
Wenn also Probleme beim Ausführen des Ping-Moduls für den Multipass-VM-Host auftreten, fügen Sie -vvv zum Ansible-Befehl hinzu, um eine ausführlichere Ausgabe zu erhalten:
ansible -vvv -i multipass-vm-inventory.yml multipassvm1 -m ping
Bei erfolgreicher Ausführung wird oben eine Ausgabe ähnlich der folgenden generiert (einige Ausgaben wurden weggelassen):
ansible 2.10.3
...
Parsed /Users/ivan/AnsibleMultipass/multipass-vm-inventory.yml inventory source with yaml plugin
...
<192.168.64.20> ESTABLISH SSH CONNECTION FOR USER: vmadmin
<192.168.64.20> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o 'IdentityFile="user_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="vmadmin"' -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ControlMaster=no -o ControlPath=none 192.168.64.20 '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo /home/vmadmin/.ansible/tmp `"&& mkdir "` echo /home/vmadmin/.ansible/tmp/ansible-tmp-1621106467.2205691-7451-138900743300503 `" && echo ansible-tmp-1621106467.2205691-7451-138900743300503="` echo /home/vmadmin/.ansible/tmp/ansible-tmp-1621106467.2205691-7451-138900743300503 `" ) && sleep 0'"'"''
<192.168.64.20> (0, b'ansible-tmp-1621106467.2205691-7451-138900743300503=/home/vmadmin/.ansible/tmp/ansible-tmp-1621106467.2205691-7451-138900743300503\n', b'')
<multipassvm1> Attempting python interpreter discovery
<192.168.64.20> ESTABLISH SSH CONNECTION FOR USER: vmadmin
<192.168.64.20> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o 'IdentityFile="user_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="vmadmin"' -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ControlMaster=no -o ControlPath=none 192.168.64.20 '/bin/sh -c '"'"'echo PLATFORM; uname; echo FOUND; command -v '"'"'"'"'"'"'"'"'/usr/bin/python'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'python3.7'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'python3.6'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'python3.5'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'python2.7'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'python2.6'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'/usr/libexec/platform-python'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'/usr/bin/python3'"'"'"'"'"'"'"'"'; command -v '"'"'"'"'"'"'"'"'python'"'"'"'"'"'"'"'"'; echo ENDFOUND && sleep 0'"'"''
<192.168.64.20> (0, b'PLATFORM\nLinux\nFOUND\n/usr/bin/python3\nENDFOUND\n', b'')
<192.168.64.20> ESTABLISH SSH CONNECTION FOR USER: vmadmin
<192.168.64.20> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o 'IdentityFile="user_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="vmadmin"' -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ControlMaster=no -o ControlPath=none 192.168.64.20 '/bin/sh -c '"'"'/usr/bin/python3 && sleep 0'"'"''
<192.168.64.20> (0, b'{"platform_dist_result": [], "osrelease_content": "NAME=\\"Ubuntu\\"\\nVERSION=\\"20.04.2 LTS (Focal Fossa)\\"\\nID=ubuntu\\nID_LIKE=debian\\nPRETTY_NAME=\\"Ubuntu 20.04.2 LTS\\"\\nVERSION_ID=\\"20.04\\"\\nHOME_URL=\\"https://www.ubuntu.com/\\"\\nSUPPORT_URL=\\"https://help.ubuntu.com/\\"\\nBUG_REPORT_URL=\\"https://bugs.launchpad.net/ubuntu/\\"\\nPRIVACY_POLICY_URL=\\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\\"\\nVERSION_CODENAME=focal\\nUBUNTU_CODENAME=focal\\n"}\n', b'')
...
multipassvm1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"invocation": {
"module_args": {
"data": "pong"
}
},
"ping": "pong"
}
META: ran handlers
Die Details des Prozesses zum Lesen der Bestandskonfiguration, zum Herstellen einer Verbindung zum Host über SSH, zum Überprüfen einer Python-Installation und zum Abrufen von Informationen zum Betriebssystem des Hosts können erkannt werden.
Setup-Modul
Das zweite und letzte Ansible-Modul, das ich in diesem Artikel ausprobieren werde, ist das Setup-Modul, das Informationen über Hosts sammelt. Um Informationen über den Multipass-VM-Host zu sammeln, geben Sie den folgenden Befehl im Terminalfenster ein:
ansible -i multipass-vm-inventory.yml multipassvm1 -m setup
Es werden viele Informationen an die Konsole ausgegeben. Glücklicherweise ist es möglich, eine Teilmenge der Informationen auszuwählen, indem Sie einen Filter anwenden, wie in diesem Beispiel:
ansible -i multipass-vm-inventory.yml multipassvm1 -m setup -a "filter=ansible_env*"
Das Obige sammelt Informationen über multipassvm1 und behält nur die Informationen bei, deren Schlüssel mit ansible_env beginnen. Auf meinem System sieht die Ausgabe so aus:
multipassvm1 | SUCCESS => {
"ansible_facts": {
"ansible_env": {
"DBUS_SESSION_BUS_ADDRESS": "unix:path=/run/user/1000/bus",
"HOME": "/home/vmadmin",
"LANG": "C.UTF-8",
"LC_CTYPE": "C.UTF-8",
"LOGNAME": "vmadmin",
"MOTD_SHOWN": "pam",
"PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin",
"PWD": "/home/vmadmin",
"SHELL": "/bin/sh",
"SSH_CLIENT": "192.168.64.1 49301 22",
"SSH_CONNECTION": "192.168.64.1 49301 192.168.64.20 22",
"SSH_TTY": "/dev/pts/0",
"TERM": "xterm-256color",
"USER": "vmadmin",
"XDG_RUNTIME_DIR": "/run/user/1000",
"XDG_SESSION_CLASS": "user",
"XDG_SESSION_ID": "8",
"XDG_SESSION_TYPE": "tty"
},
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false
}
Die obigen Umgebungsvariablen werden für den vmadmin-Benutzer festgelegt, wenn er bei der Multipass-VM angemeldet ist.
Die Möglichkeit, ein Ansible-Inventar zu erstellen, das Multipass-VM-Hosts enthält, ermöglicht es uns, Ansible mit dieser Art von virtuellen Maschinen zu verwenden. Wir können somit Ansible-Playbooks erstellen, um virtuelle Multipass-Maschinen einzurichten und zu konfigurieren, etwas, das ich in zukünftigen Artikeln verwenden werde.