Ahora vamos a aprender algunos comandos básicos que podemos hacer con Ansible.

En Ansible la manera que tenemos de interactuar con nuestro servidor es mediante Tareas -¿Os acordáis de esta palabra?- Una Tarea o Task es una función que Ansible debe de realizar en tu servidor o servidores. Dichas tareas son declarativas, es decir, nosotros no escribimos nunca comandos en bash ni nada por el estilo. Nosotros declaramos que queremos hacer en ese servidor, si queremos instalar un Nginx, un Tomcat, Postfix, etc. Y Ansible se encargará de aprovisionar ese servidor tal y como le hemos pedido.

Estas Tareas las apuntaremos en nuestro Playbook, que no dejarán de ser otros ficheros donde nosotros apuntaremos como debe de aprovisionarse el servidor. Por ejemplo, si nosotros hacemos una tarea que se llama "Instalación de Apache2" Ansible mirará si en ese servidor ya está aprovisionado ese servicio, y en el caso de que no lo esté, hará todo lo necesario para aprovisionarlo. Y si ya está el servicio instalado, pasará a la siguiente tarea.

Aún así, de momento no vamos a ver esos PlayBooks, ya que es algo que hablaremos más adelante, por ahora, hablaremos de los comandos básicos que podemos ejecutar con Ansible y que manera tenemos para enviar una tarea usando Ansible.

Comandos básicos

Ya hemos probado alguna vez algún comando, seguro que os suena la opción -m ping. La sintaxis es la siguiente:

ansible [opciones] services|grupo|all|ungrouped [-m módulo] [-a argumento]

Como hemos visto anteriormente, podemos mirar si un host está activo haciendo ping:

ansible node1.tutos.top -m ping

Con esto le decimos a Ansible que mire si ese nombre de host está activo haciendo un ping y su respuesta es el siguiente:

node1.tutos.top | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

Por ejemplo, le podemos decir que instale un paquete a un host en concreto:

ansible node1.tutos.top --become -m apt -a "name=apache2 state=present"

Y obtenemos este resultado:

node1.tutos.top | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "cache_update_time": 1680601400,
    "cache_updated": false,
    "changed": true,
    "stderr": "",
    "stderr_lines": [],
    "stdout": "[Omitido]"
    "stdout_lines": [omitido]
}

El módulo setup sirve para obtener información del nodo, como puede ser la versión del sistema operativo, las direcciones IP entre otra gran cantidad de información útil.

# ansible -i inventories/inventory.yml all -m setup

node1.tutos.top | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "XXX.XXX.XXX.XXX"
        ],
        "ansible_all_ipv6_addresses": [
            "XXXX::XXXX:XXXX:XXXX:XXXX"
        ],
        "ansible_apparmor": {
            "status": "enabled"
        },
        "ansible_architecture": "x86_64",
        "ansible_bios_date": "04/01/2014",
        "ansible_bios_vendor": "SeaBIOS",
        "ansible_bios_version": "1.13.0-1ubuntu1",
        "ansible_board_asset_tag": "NA",
        "ansible_board_name": "NA",
        "ansible_board_serial": "NA",
        "ansible_board_vendor": "NA",
        "ansible_board_version": "NA",
        "ansible_chassis_asset_tag": "NA",
        "ansible_chassis_serial": "NA",
        "ansible_chassis_vendor": "QEMU",
        "ansible_chassis_version": "pc-i440fx-4.2",
        "ansible_cmdline": {
            "BOOT_IMAGE": "/boot/vmlinuz-5.10.0-21-amd64",
            "biosdevname": "0",
            "consoleblank": "0",
            "net.ifnames": "0",
            "nomodeset": true,
            "ro": true,
            "root": "UUID=cf43cddb-1fb4-4fe5-a4e6-XXXXX"
        },
		[...]
        "ansible_distribution": "Debian",
        "ansible_distribution_file_parsed": true,
        "ansible_distribution_file_path": "/etc/os-release",
        "ansible_distribution_file_variety": "Debian",
        "ansible_distribution_major_version": "11",
        "ansible_distribution_release": "bullseye",
        "ansible_distribution_version": "11",
        "ansible_dns": {
            "nameservers": [
                "8.8.8.8",
                "8.8.4.4"
            ]
        },
        [...]

Sintaxis de los comandos de Ansible

La sintaxis de las respuestas de los comandos en Ansible siempre son al más puro estilo JSON. Si son en color verde significa que todo ha ido bien y si son de color rojo es que algo no ha ido bien. Por un lado tenemos el nombre del host al que hemos preguntado (node1.tuto.top) y luego tenemos un SUCCESS, que significa que la operación ha sido un éxito, en caso contrario tendríamos un FAILED! -y el texto en rojo-.

Luego tendríamos dos parámetros, el primero, changed significa si el comando ejecutado ha realizado algún cambio en el servidor. Como que en este caso era un simple ping, pues no ha realizado ningún cambio y por eso pone false. Y luego tenemos otro que es ping que es el comando que hemos enviado y el servidor nos ha respondido con un pong.

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación