GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Virtuelle Multipass-Maschinen mithilfe von Ansible

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.


Linux
  1. Ansible Guide:Verwalten Sie Dateien mit Ansible

  2. Stellen Sie Nextcloud auf Docker mit Ansible bereit

  3. So erstellen Sie einen Linux-Benutzer mit Ansible

  4. Bedienen Sie mehrere Domains mithilfe virtueller Hosts

  5. Bereitstellen eines Ordners mit Vorlagendateien mit Ansible

So verwenden Sie Ansible zum Senden einer E-Mail mit Google Mail

So installieren Sie Ansible unter Ubuntu 20.04

So exportieren und importieren Sie virtuelle VirtualBox-Maschinen

So erstellen Sie virtuelle Maschinen in KVM mit Virt-Manager

So verwalten Sie virtuelle Maschinen in KVM mit Virt-Manager

So erstellen und verwalten Sie virtuelle Maschinen in KVM