Tento příspěvek je o Multipass Virtual Machines pomocí Ansible
Předpoklady
Virtuální stroj Multipass by měl být vytvořen podle pokynů v článku Virtuální stroj Multipass a ověřování pomocí soukromého klíče. Všimněte si, kde je uložen soubor obsahující soukromý klíč.
Druhým předpokladem je Ansible. Pokyny k instalaci Ansible naleznete v oficiální dokumentaci Ansible.
Přípravy
Přípravy pro příklad tohoto článku jsou následující:
- Vytvořte adresář pro uložení souborů z příkladu v tomto článku.
Svůj adresář budu nazývat „AnsibleMultipass“. - Zkopírujte soubor soukromého klíče s názvem „user_key“ do nového adresáře.
Tento soubor klíčů byl vytvořen jako součást vytváření virtuálního počítače Multipass v předchozím článku. - Spusťte víceprůchodový virtuální počítač, který má ověřování na základě klíče.
- Zjistěte IP adresu víceprůchodového virtuálního počítače pomocí ověřování na základě klíče.
Toho lze dosáhnout například pomocí seznamu více průchodů příkaz v okně terminálu. V mém případě je IP 192.168.64.20.
Ansible Inventory
Inventář Ansible říká Ansible, jak se připojit k jednomu nebo více uzlům v infrastruktuře. Příklad tohoto článku má tedy velmi malou infrastrukturu, která se skládá pouze z jediného virtuálního stroje.
V adresáři AnsibleMultipass vytvořte soubor s názvem „multipass-vm-inventory.yml“ s následujícím obsahem:
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
Všimněte si, že:
- V tomto souboru inventáře Ansible je jeden hostitel – multipassvm1.
- Typ připojení k hostiteli je určen hodnotou ansible_connection, což je SSH.
- IP adresa hostitele nebo název DNS, pokud existuje, je určena hodnotou ansible_host.
- Adresa IP musí být nahrazena adresou IP místního virtuálního počítače Multipass.
- Hodnota ansible_user, vmadmin, je jméno uživatele, které bude použito při připojování k hostiteli.
- Tato hodnota, v tomto příkladu vmadmin, musí být uživatelské jméno použité při generování klíčů pomocí příkazu ssh-keygen.
- Ansible_ssh_common_args specifikují běžné argumenty, které se připojují k příkazům sftp, scp a ssh.
- Příkaz StrictHostKeyChecking=no vypne dotaz, zda jsou nové klíče důvěryhodné nebo ne. Místo toho budou všechny nové klíče tiše přidány do souboruknown_hosts.
- Nastavení ControlMaster a ControlPath jsou řešením problému na mém počítači způsobeného výchozí cestou ControlPath obsahující mezeru, která nebyla escapována. Na jiných počítačích nemusí být nutné a lze je vynechat.
- Nakonec hodnota ansible_ssh_private_key_file určuje název a volitelně umístění souboru soukromého klíče, který bude použit při připojení k hostiteli.
- Pokud je zadán pouze název souboru, umístění souboru klíčů je relativní vzhledem k souboru inventáře. Může to být absolutní umístění.
Moduly Ansible
S inventářem Ansible nyní můžeme spouštět moduly Ansible proti hostiteli (hostitelům) v inventáři. V tomto článku tedy uvedu pouze několik příkladů. V dokumentaci je seznam všech dostupných modulů Ansible.
Modul Ping
Jedním z modulů Ansbile je modul ping. Jak je uvedeno v dokumentaci, modul ping se pokouší připojit k hostiteli a ověřit použitelnou instalaci Pythonu.
V okně terminálu v adresáři AnsibleMultipass zadejte následující příkaz:
ansible -i multipass-vm-inventory.yml multipassvm1 -m ping
Výše uvedený příkaz má následující parametry:
- -i multipass-vm-inventory.yml
Použijte vlastní soubor inventáře s názvem multipass-vm-inventory.yml - multipassvm1
Název hostitele, na kterém se má modul spustit. V použitém inventáři musí být hostitel. - -m ping
Určuje název modulu, který se má spustit – v tomto případě ping.
Výsledný výstup by měl vypadat takto:
multipassvm1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
Jak je vidět, spojení bylo úspěšně navázáno s Multipass VM a byl objeven interpret Pythonu.
Pokud se tedy vyskytnou nějaké problémy se spuštěním modulu ping proti hostiteli Multipass VM, přidejte -vvv do příkazu Ansible pro podrobnější výstup:
ansible -vvv -i multipass-vm-inventory.yml multipassvm1 -m ping
Po úspěšném provedení bude výše uvedený výstup generovat výstup podobný následujícímu (některý výstup byl vynechán):
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
Lze zjistit podrobnosti o procesu čtení konfigurace inventáře, připojení k hostiteli pomocí SSH, ověření instalace Pythonu a získání informací o operačním systému hostitele.
Modul nastavení
Druhý a poslední modul Ansible, který v tomto článku vyzkouším, je instalační modul, který shromažďuje informace o hostitelích. Chcete-li získat informace o hostiteli Multipass VM, zadejte v okně terminálu následující příkaz:
ansible -i multipass-vm-inventory.yml multipassvm1 -m setup
Do konzole bude vycházet mnoho informací. Naštěstí je možné vybrat podmnožinu informací použitím filtru jako v tomto příkladu:
ansible -i multipass-vm-inventory.yml multipassvm1 -m setup -a "filter=ansible_env*"
Výše uvedené shromažďuje informace o multipassvm1 a uchovává pouze informace, které mají klíče začínající na ansible_env. V mém systému vypadá výstup takto:
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
}
Výše uvedené jsou proměnné prostředí nastavené pro uživatele vmadmin při přihlášení k virtuálnímu počítači Multipass.
Možnost vytvořit inventář Ansible, který obsahuje hostitele Multipass VM, nám umožňuje používat Ansible s tímto druhem virtuálních strojů. Můžeme tak vytvořit Ansible playbooky pro nastavení a konfiguraci virtuálních strojů Multipass, což využiji v budoucích článcích.