Cet article concerne les machines virtuelles multipasses en utilisant Ansible
Prérequis
Une machine virtuelle Multipass doit être créée en suivant les instructions de l'article Machine virtuelle Multipass et s'authentifier à l'aide d'une clé privée. Notez où le fichier contenant la clé privée est stocké.
Le deuxième prérequis est Ansible. Les instructions d'installation d'Ansible se trouvent dans la documentation officielle d'Ansible.
Préparatifs
Les préparations pour l'exemple de cet article sont les suivantes :
- Créez un répertoire pour contenir les fichiers de l'exemple de cet article.
J'appellerai mon répertoire "AnsibleMultipass". - Copiez le fichier de clé privée, nommé "user_key", dans le nouveau répertoire.
Ce fichier clé a été créé dans le cadre de la création de la machine virtuelle multipasse dans l'article précédent. - Démarrez la VM multipasse dotée d'une authentification basée sur une clé.
- Trouvez l'adresse IP de la VM multipasse avec l'authentification par clé.
Cela peut être accompli en utilisant, par exemple, la liste multipasse commande dans une fenêtre de terminal. Dans mon cas, l'IP est 192.168.64.20.
Inventaire Ansible
Un inventaire Ansible indique à Ansible comment se connecter à un ou plusieurs nœuds de l'infrastructure. Ainsi, l'exemple de cet article a une très petite infrastructure qui se compose d'une seule machine virtuelle.
Dans le répertoire AnsibleMultipass, créez un fichier nommé "multipass-vm-inventory.yml" avec le contenu suivant :
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
Notez que :
- Il y a un hôte dans ce fichier d'inventaire Ansible :multipassvm1.
- Le type de connexion à l'hôte est spécifié par la valeur ansible_connection, qui est SSH.
- L'adresse IP de l'hôte, ou le nom DNS s'il y en a un, est spécifié par la valeur ansible_host.
- L'adresse IP doit être remplacée par l'adresse IP de la VM Multipass locale.
- La valeur de ansible_user, vmadmin, est le nom de l'utilisateur qui sera utilisé lors de la connexion à l'hôte.
- Cette valeur, vmadmin dans cet exemple, doit être le nom d'utilisateur utilisé lorsque les clés ont été générées avec la commande ssh-keygen.
- Les ansible_ssh_common_args spécifient les arguments communs qui sont ajoutés aux commandes sftp, scp et ssh.
- Le StrictHostKeyChecking=no désactivera la demande si les nouvelles clés sont approuvées ou non. Au lieu de cela, toutes les nouvelles clés seront ajoutées silencieusement au fichier known_hosts.
- Les paramètres ControlMaster et ControlPath sont une solution de contournement pour un problème sur mon ordinateur causé par le ControlPath par défaut contenant un espace qui n'a pas été échappé. Ceux-ci peuvent ne pas être nécessaires sur d'autres ordinateurs et peuvent être omis.
- Enfin, la valeur ansible_ssh_private_key_file spécifie le nom, et éventuellement l'emplacement, du fichier de clé privée qui sera utilisé lors de la connexion à l'hôte.
- Si un seul nom de fichier est spécifié, l'emplacement du fichier clé est relatif au fichier d'inventaire. Peut être un emplacement absolu.
Modules Ansibles
Avec l'inventaire Ansible en place, nous pouvons désormais exécuter des modules Ansible sur le ou les hôtes de l'inventaire. Ainsi, dans cet article, je ne donnerai que quelques exemples. Vous trouverez une liste de tous les modules Ansible disponibles dans la documentation.
Module de ping
L'un des modules Ansbile est le module ping. Comme indiqué par sa documentation, le module ping essaie de se connecter à un hôte et de vérifier une installation Python utilisable.
Dans une fenêtre de terminal, située dans le répertoire AnsibleMultipass, lancez la commande suivante :
ansible -i multipass-vm-inventory.yml multipassvm1 -m ping
La commande ci-dessus a les paramètres suivants :
- -i multipass-vm-inventory.yml
Utilisez un fichier d'inventaire personnalisé nommé multipass-vm-inventory.yml - multipassvm1
Nom de l'hôte sur lequel exécuter le module. Doit être un hôte dans l'inventaire utilisé. - -m ping
Spécifie le nom du module à exécuter – ping dans ce cas.
La sortie résultante devrait ressembler à ceci :
multipassvm1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
Comme on peut le voir, la connexion a été établie avec succès avec la VM Multipass et un interpréteur Python a été découvert.
Donc, s'il y a des problèmes lors de l'exécution du module ping sur l'hôte de la machine virtuelle multipasse, ajoutez -vvv à la commande Ansible pour une sortie plus détaillée :
ansible -vvv -i multipass-vm-inventory.yml multipassvm1 -m ping
Avec l'exécution réussie, ce qui précède générera une sortie similaire à la suivante (certaines sorties ont été omises) :
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
Les détails du processus de lecture de la configuration de l'inventaire, de connexion à l'hôte à l'aide de SSH, de vérification d'une installation Python et d'obtention d'informations sur le système d'exploitation de l'hôte peuvent être discernés.
Module de configuration
Le deuxième et dernier module Ansible que je vais essayer dans cet article est le module de configuration, qui rassemble des informations sur les hôtes. Pour recueillir des informations sur l'hôte de la machine virtuelle multipasse, exécutez la commande suivante dans la fenêtre du terminal :
ansible -i multipass-vm-inventory.yml multipassvm1 -m setup
Il y aura beaucoup d'informations sur la console. Heureusement, il est possible de sélectionner un sous-ensemble des informations en appliquant un filtre comme dans cet exemple :
ansible -i multipass-vm-inventory.yml multipassvm1 -m setup -a "filter=ansible_env*"
Ce qui précède rassemble des informations sur le multipassvm1 et ne conserve que les informations dont les clés commencent par ansible_env. Sur mon système, la sortie ressemble à ceci :
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
}
Les variables d'environnement ci-dessus sont définies pour l'utilisateur vmadmin lorsqu'il est connecté à la machine virtuelle multipasse.
La possibilité de créer un inventaire Ansible contenant des hôtes de machines virtuelles multipasses nous permet d'utiliser Ansible avec ce type de machines virtuelles. Nous pouvons ainsi créer des playbooks Ansible pour mettre en place et configurer des machines virtuelles Multipass, ce dont je me servirai dans de prochains articles.