GNU/Linux >> Linux Esercitazione >  >> Linux

Macchine virtuali multipass utilizzando Ansible

Questo post riguarda le macchine virtuali Multipass utilizzando Ansible

Prerequisiti

È necessario creare una macchina virtuale Multipass secondo le istruzioni nell'articolo Macchina virtuale Multipass e autenticarsi tramite chiave privata. Nota dove è archiviato il file contenente la chiave privata.
Il secondo prerequisito è Ansible. Le istruzioni su come installare Ansible sono disponibili nella documentazione ufficiale di Ansible.

Preparativi

I preparativi per l'esempio di questo articolo sono i seguenti:

  • Crea una directory per contenere i file dell'esempio in questo articolo.
    Chiamerò la mia rubrica “AnsibleMultipass”.
  • Copia il file della chiave privata, denominato “user_key”, nella nuova directory.
    Questo file chiave è stato creato nell'ambito della creazione della VM Multipass nell'articolo precedente.
  • Avvia la VM Multipass con autenticazione basata su chiave.
  • Trova l'indirizzo IP della VM Multipass con l'autenticazione basata su chiave.
    Questo può essere ottenuto utilizzando, ad esempio, l'elenco multipass comando in una finestra di terminale. Nel mio caso, l'IP è 192.168.64.20.

Inventario Ansible

Un inventario di Ansible indica ad Ansible come connettersi a uno o più nodi nell'infrastruttura. Quindi, l'esempio di questo articolo ha un'infrastruttura molto piccola che consiste in una sola macchina virtuale.

Nella directory AnsibleMultipass, crea un file denominato "multipass-vm-inventory.yml" con i seguenti contenuti:

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

Nota che:

  • C'è un host in questo file di inventario Ansible:multipassvm1.
  • Il tipo di connessione all'host è specificato dal valore ansible_connection, che è SSH.
  • L'indirizzo IP dell'host, o il nome DNS se presente, è specificato dal valore ansible_host.
  • L'indirizzo IP deve essere sostituito con l'indirizzo IP della VM Multipass locale.
  • Il valore di ansible_user, vmadmin, è il nome dell'utente che verrà utilizzato durante la connessione all'host.
  • Questo valore, in questo esempio vmadmin, deve essere il nome utente utilizzato quando le chiavi sono state generate con il comando ssh-keygen.
  • Gli ansible_ssh_common_args specificano argomenti comuni che vengono aggiunti ai comandi sftp, scp e ssh.
  • Il StrictHostKeyChecking=no disattiva la richiesta se le nuove chiavi sono attendibili o meno. Invece, tutte le nuove chiavi verranno aggiunte silenziosamente al file known_hosts.
  • Le impostazioni di ControlMaster e ControlPath sono una soluzione per un problema sul mio computer causato dal ControlPath predefinito contenente uno spazio che non è stato sottoposto a escape. Questi potrebbero non essere necessari su altri computer e possono essere omessi.
  • Infine, il valore ansible_ssh_private_key_file specifica il nome e, facoltativamente, la posizione del file-chiave privata che verrà utilizzato durante la connessione all'host.
  • Se viene specificato solo un nome file, la posizione del file chiave è relativa al file di inventario. Può essere una posizione assoluta.

Moduli Ansible

Con l'inventario Ansible attivo, ora possiamo eseguire i moduli Ansible contro gli host nell'inventario. Quindi, in questo articolo farò solo un paio di esempi. Nella documentazione è presente un elenco di tutti i moduli Ansible disponibili.

Modulo Ping

Uno dei moduli Ansbile è il modulo ping. Come affermato dalla sua documentazione, il modulo ping tenta di connettersi a un host e verificare un'installazione Python utilizzabile.
In una finestra di terminale, situata nella directory di AnsibleMultipass, emettere il seguente comando:

ansible -i multipass-vm-inventory.yml multipassvm1 -m ping

Il comando precedente ha i seguenti parametri:

  • -i multipass-vm-inventory.yml
    Utilizza un file di inventario personalizzato denominato multipass-vm-inventory.yml
  • multipassvm1
    Nome dell'host su cui eseguire il modulo. Deve essere un host nell'inventario utilizzato.
  • -m ping
    Specifica il nome del modulo da eseguire – ping in questo caso.

L'output risultante dovrebbe essere simile a questo:

multipassvm1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

Come si può vedere, la connessione è stata stabilita con successo con la VM Multipass ed è stato scoperto un interprete Python.

Quindi, se ci sono problemi nell'esecuzione del modulo ping sull'host Multipass VM, aggiungi -vvv al comando Ansible per un output più dettagliato:

ansible -vvv -i multipass-vm-inventory.yml multipassvm1 -m ping

Con l'esecuzione riuscita, quanto sopra genererà un output simile al seguente (alcuni output sono stati omessi):

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

È possibile individuare i dettagli del processo di lettura della configurazione dell'inventario, connessione all'host tramite SSH, verifica di un'installazione Python e ottenimento di informazioni sul sistema operativo dell'host.

Modulo di configurazione

Il secondo e ultimo modulo Ansible che proverò in questo articolo è il modulo di installazione, che raccoglie informazioni sugli host. Per raccogliere informazioni sull'host Multipass VM, emettere il seguente comando nella finestra del terminale:

ansible -i multipass-vm-inventory.yml multipassvm1 -m setup

Ci saranno molte informazioni in uscita sulla console. Fortunatamente è possibile selezionare un sottoinsieme delle informazioni applicando un filtro come in questo esempio:

ansible -i multipass-vm-inventory.yml multipassvm1 -m setup -a "filter=ansible_env*"

Quanto sopra raccoglie informazioni su multipassvm1 e conserva solo le informazioni che hanno chiavi che iniziano con ansible_env. Sul mio sistema, l'output è simile a questo:

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
}

Quanto sopra sono le variabili di ambiente impostate per l'utente vmadmin durante l'accesso alla VM Multipass.

Essere in grado di creare un inventario Ansible che contenga host VM Multipass ci consente di utilizzare Ansible con questo tipo di macchine virtuali. Possiamo quindi creare playbook Ansible per impostare e configurare macchine virtuali Multipass, qualcosa che utilizzerò nei prossimi articoli.


Linux
  1. Guida di Ansible:gestisci i file utilizzando Ansible

  2. Distribuisci Nextcloud su Docker utilizzando Ansible

  3. Come creare un utente Linux usando Ansible

  4. Servi più domini utilizzando host virtuali

  5. Distribuzione di una cartella di file modello utilizzando ansible

Come utilizzare Ansible per inviare un'e-mail utilizzando Gmail

Come installare Ansible su Ubuntu 20.04

Come esportare e importare macchine virtuali VirtualBox

Come creare macchine virtuali in KVM usando Virt-Manager

Come gestire macchine virtuali in KVM usando Virt-Manager

Come creare e gestire macchine virtuali in KVM