GNU/Linux >> Tutoriales Linux >  >> Linux

Máquinas virtuales multipaso mediante el uso de Ansible

Esta publicación trata sobre máquinas virtuales multipaso mediante el uso de Ansible

Requisitos

Se debe crear una máquina virtual Multipass de acuerdo con las instrucciones del artículo Máquina virtual Multipass y autenticación mediante una clave privada. Tenga en cuenta dónde se almacena el archivo que contiene la clave privada.
El segundo requisito previo es Ansible. Las instrucciones sobre cómo instalar Ansible se pueden encontrar en la documentación oficial de Ansible.

Preparativos

Los preparativos para el ejemplo de este artículo son los siguientes:

  • Cree un directorio para almacenar los archivos del ejemplo de este artículo.
    Llamaré a mi directorio "AnsibleMultipass".
  • Copie el archivo de clave privada, denominado "user_key", en el nuevo directorio.
    Este archivo de claves se creó como parte de la creación de la VM Multipass en el artículo anterior.
  • Inicie la máquina virtual Multipass que tiene autenticación basada en claves.
  • Encuentre la dirección IP de la máquina virtual Multipass con autenticación basada en claves.
    Esto se puede lograr usando, por ejemplo, la lista de pasos múltiples comando en una ventana de terminal. En mi caso la IP es 192.168.64.20.

Inventario de Ansible

Un inventario de Ansible le dice a Ansible cómo conectarse a uno o más nodos en la infraestructura. Entonces, el ejemplo de este artículo tiene una infraestructura muy pequeña que consta de una sola máquina virtual.

En el directorio AnsibleMultipass, cree un archivo llamado "multipass-vm-inventory.yml" con el siguiente contenido:

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

Tenga en cuenta que:

  • Hay un host en este archivo de inventario de Ansible:multipassvm1.
  • El tipo de conexión al host se especifica mediante el valor de ansible_connection, que es SSH.
  • La dirección IP del host, o el nombre DNS, si lo hay, se especifica mediante el valor ansible_host.
  • La dirección IP debe reemplazarse con la dirección IP de la VM Multipass local.
  • El valor de ansible_user, vmadmin, es el nombre del usuario que se usará cuando se conecte al host.
  • Este valor, vmadmin en este ejemplo, debe ser el nombre de usuario utilizado cuando se generaron las claves con el comando ssh-keygen.
  • Los ansible_ssh_common_args especifican argumentos comunes que se agregan a los comandos sftp, scp y ssh.
  • StrictHostKeyChecking=no desactivará la indicación de si las claves nuevas son confiables o no. En su lugar, cualquier nueva clave se agregará silenciosamente al archivoknown_hosts.
  • La configuración de ControlMaster y ControlPath es una solución para un problema en mi computadora causado por el ControlPath predeterminado que contiene un espacio que no se escapó. Estos pueden no ser necesarios en otras computadoras y pueden omitirse.
  • Finalmente, el valor ansible_ssh_private_key_file especifica el nombre y, opcionalmente, la ubicación del archivo de clave privada que se usará al conectarse al host.
  • Si solo se especifica un nombre de archivo, la ubicación del archivo clave es relativa al archivo de inventario. Puede ser una ubicación absoluta.

Módulos de Ansible

Con el inventario de Ansible en su lugar, ahora podemos ejecutar módulos de Ansible contra los hosts en el inventario. Entonces, en este artículo solo voy a dar un par de ejemplos. Hay una lista de todos los módulos de Ansible disponibles en la documentación.

Módulo de ping

Uno de los módulos Ansbile es el módulo ping. Como se indica en su documentación, el módulo ping intenta conectarse a un host y verificar una instalación de Python utilizable.
En una ventana de terminal, ubicada en el directorio AnsibleMultipass, emita el siguiente comando:

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

El comando anterior tiene los siguientes parámetros:

  • -i multipass-vm-inventario.yml
    Use un archivo de inventario personalizado llamado multipass-vm-inventory.yml
  • multipassvm1
    Nombre del host en el que ejecutar el módulo. Debe ser un host en el inventario utilizado.
  • -m ping
    Especifica el nombre del módulo a ejecutar, ping en este caso.

El resultado resultante debería ser similar a esto:

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

Como puede verse, la conexión se estableció con éxito con la máquina virtual Multipass y se descubrió un intérprete de Python.

Por lo tanto, si hay algún problema al ejecutar el módulo de ping en el host de VM Multipass, agregue -vvv al comando Ansible para obtener una salida más detallada:

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

Con la ejecución exitosa, lo anterior generará un resultado similar al siguiente (se han omitido algunos resultados):

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

Se pueden discernir los detalles del proceso de lectura de la configuración del inventario, conexión al host mediante SSH, verificación de una instalación de Python y obtención de información sobre el sistema operativo del host.

Módulo de configuración

El segundo y último módulo de Ansible que probaré en este artículo es el módulo de configuración, que recopila información sobre los hosts. Para recopilar información sobre el host de VM Multipass, emita el siguiente comando en la ventana del terminal:

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

Habrá mucha salida de información a la consola. Afortunadamente es posible seleccionar un subconjunto de la información aplicando un filtro como en este ejemplo:

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

Lo anterior recopila información sobre multipassvm1 y retiene solo la información que tiene claves que comienzan con ansible_env. En mi sistema, la salida se ve así:

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
}

Las anteriores son las variables de entorno configuradas para el usuario vmadmin cuando inicia sesión en la máquina virtual Multipass.

Poder crear un inventario de Ansible que contenga hosts de VM Multipass nos permite usar Ansible con este tipo de máquinas virtuales. Por lo tanto, podemos crear libros de jugadas de Ansible para instalar y configurar máquinas virtuales Multipass, algo que utilizaré en artículos futuros.


Linux
  1. Guía de Ansible:Administrar archivos usando Ansible

  2. Implemente Nextcloud en Docker usando Ansible

  3. Cómo crear un usuario de Linux usando Ansible

  4. Servir múltiples dominios mediante el uso de hosts virtuales

  5. Máquinas virtuales semanales, con scripts de compilación

Cómo usar Ansible para enviar un correo electrónico usando Gmail

Cómo instalar Ansible en Ubuntu 20.04

Cómo exportar e importar máquinas virtuales VirtualBox

Cómo crear máquinas virtuales en KVM usando Virt-Manager

Cómo administrar máquinas virtuales en KVM usando Virt-Manager

Cómo crear y administrar máquinas virtuales en KVM