Ansible: usuario de conexión SSH y ejecución de Playbooks

por | abril 8, 2019

A la hora de lanzar un playbook o simplemente utilizar un módulo de Ansible por línea de comandos debemos tener en cuenta que por una parte tenemos el usuario con el que conectamos por SSH con los nodos remotos y por otra el usuario que ejecuta las órdenes de Ansible en dichos nodos.

En primer lugar, si no especificamos el usuario de conexión, Ansible utilizará el usuario de la shell con el que estamos logados para realizar la conexión y ejecutar las órdenes indicadas. En el siguiente ejemplo el usuario que conecta por SSH y ejecuta la orden es jota. La opción -k nos pregunta por la contraseña para conectar por SSH con dicho usuario:

[jota@jota-n1-london]$ ansible -m ping -i hosts all -k
dev | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Podemos especificar un usuario de conexión distinto con el parámetro -u. En el siguiente ejemplo el usuario que conecta y ejecuta el comando es dev1, distinto al que estamos utilizando en la shell:

[jota@jota-n1-london]$ ansible -m ping -i hosts all -u dev1 -k
dev | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

En este ejemplo, el usuario que conecta por SSH es dev1, pero el que lo ejecuta en el nodo remoto es jota. Para ello realizamos una escalada de privilegios para cambiar al usuario deseado con --become-user=jota. También necesitamos que nos pregunte por la contraseña para cambiar a dicho usuario con -K (--ask-become-pass)

[jota@jota-n1-london]$ ansible -m ping -i hosts all -u dev1 --become-user=jota -k -K
SSH password: 
SUDO password[defaults to SSH password]: 
dev | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Puede que queramos realizar una tarea que requiere permisos de administración. Por ejemplo, instalar/actualizar un paquete, crear o modificar ficheros en /etc… En estos casos aunque conectemos con el usuario jota necesitaremos ejecutar las acciones como root. Para ello utilizamos las opciones -u jota (usuario de conexión SSH) -b (become, por defecto root) --ask-become-pass (pregunta la contraseña para cambiar a usuario root)

[jota@jota-n1-london]$ ansible -i hosts all -m apt -a "upgrade=yes update_cache=yes" -u jota -k --become --become-user=root --ask-become-pass
SSH password:
SUDO password: 
dev | SUCCESS => {
    "changed": false, 
    "msg": "Reading package lists...\nBuilding dependency tree...\nReading state information...\nReading extended state information...\nInitializing package states...\nReading task descriptions...\nBuilding tag database...\nNo packages will be installed, upgraded, or removed.\n0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\nNeed to get 0 B of archives. After unpacking 0 B will be used.\nReading package lists...\nBuilding dependency tree...\nReading state information...\nReading extended state information...\nInitializing package states...\nReading task descriptions...\nBuilding tag database...\n", 
    "stderr": "", 
    "stderr_lines": [], 
    "stdout": "Reading package lists...\nBuilding dependency tree...\nReading state information...\nReading extended state information...\nInitializing package states...\nReading task descriptions...\nBuilding tag database...\nNo packages will be installed, upgraded, or removed.\n0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\nNeed to get 0 B of archives. After unpacking 0 B will be used.\nReading package lists...\nBuilding dependency tree...\nReading state information...\nReading extended state information...\nInitializing package states...\nReading task descriptions...\nBuilding tag database...\n", 
    "stdout_lines": [
        "Reading package lists...", 
        "Building dependency tree...", 
        "Reading state information...", 
        "Reading extended state information...", 
        "Initializing package states...", 
        "Reading task descriptions...", 
        "Building tag database...", 
        "No packages will be installed, upgraded, or removed.", 
        "0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.", 
        "Need to get 0 B of archives. After unpacking 0 B will be used.", 
        "Reading package lists...", 
        "Building dependency tree...", 
        "Reading state information...", 
        "Reading extended state information...", 
        "Initializing package states...", 
        "Reading task descriptions...", 
        "Building tag database..."
    ]
}

Todas estas variables también las soporta de la misma manera el comando ansible-playbook, lo que nos da gran flexibilidad a la hora de especificar con qué usuario queremos conectar y ejecutar los playbooks de Ansible en los nodos target.