Cómo usar el inicio de sesión basado en contraseña SSH en Ansible usando sshpass

En este artículo, le mostraré cómo ejecutar los playbooks de Ansible usando un inicio de sesión basado en contraseña SSH con sshpass.

Requisitos previos

Si quieres probar los ejemplos tratados en este artículo,

1) Debes tener Ansible instalado en tu ordenador.
2) Debes tener al menos un host Ubuntu/Debian al que puedas conectarte desde Ansible.

Hay muchos artículos en LinuxHint dedicados a la instalación de Ansible. Puedes consultarlos si es necesario para instalar los programas necesarios en tu sistema.

También necesitarás tener instalado sshpass en tu ordenador, donde deberías tener instalado Ansible. Te mostraré cómo instalar sshpass en Ubuntu/Debian y CentOS/RHEL en este artículo. No te preocupes si no tienes estos programas ya instalados en tu sistema.

Instalación de sshpass en Ubuntu/Debian

El programa sshpass está disponible en el repositorio oficial de paquetes de Ubuntu/Debian. Puedes instalar fácilmente este programa en tu ordenador.

Primero, actualice la caché del repositorio de paquetes APT mediante el siguiente comando:

$ sudo apt update

Ahora, instale sshpass mediante el siguiente comando:

$ sudo apt install sshpass -y

sshpass debería estar ahora instalado.

Instalación de sshpass en CentOS 8/RHEL 8

sshpass está disponible en el repositorio EPEL de CentOS 8/RHEL 8. Debe tener el repositorio EPEL habilitado para instalar sshpass.

Primero, actualice la caché del repositorio de paquetes DNF mediante el siguiente comando:

$ sudo dnf makecache

A continuación, instale el paquete del repositorio EPEL mediante el siguiente comando:

$ sudo dnf install epel-release -y

El paquete del repositorio EPEL debería estar ahora instalado y el repositorio EPEL debería estar habilitado.

Actualice de nuevo la caché del repositorio de paquetes DNF, de la siguiente manera:

$ sudo dnf makecache

Instale sshpass mediante el siguiente comando:

$ sudo dnf install sshpass -y

sshpass debería estar instalado.

Configuración de un directorio de proyecto de Ansible

Antes de seguir adelante, sería una buena idea crear una estructura de directorio de proyecto, sólo para mantener las cosas un poco organizadas.

Para crear un directorio de proyecto sshpass/ y todos los subdirectorios necesarios (en su directorio de trabajo actual), ejecute el siguiente comando:

$ mkdir -pv sshpass/{files,playbooks}

Navegue al directorio del proyecto, como sigue:

$ cd sshpass/

Cree un archivo de inventario de hosts, como sigue:

$ nano hosts

Agrega la IP o el nombre DNS de tu host en el archivo de inventario.

Una vez que haya terminado con este paso, guarde el archivo pulsando <Ctrl> + X, seguido de Y y <Enter>.

Cree un archivo de configuración de Ansible en el directorio del proyecto, como sigue:

$ nano ansible.cfg

Ahora, escriba las siguientes líneas en el archivo ansible.cfg.

Una vez que haya terminado con este paso, guarde el archivo pulsando <Ctrl> + X, seguido de Y y <Enter>.

Probando el inicio de sesión SSH basado en contraseña en Ansible

A continuación, intente hacer un ping a los hosts en el archivo de inventario, de la siguiente manera:

$ ansible all -u shovon -m ping

NOTA: Aquí, la opción -u se utiliza para decirle a ansible con qué usuario debe iniciar sesión. En este caso, será el usuario shovon. Reemplace este nombre de usuario con el suyo a partir de ahora, a lo largo de la demostración.

Como puede ver, no soy capaz de iniciar sesión en el host y ejecutar cualquier comando.

Para forzar a Ansible a pedir la contraseña del usuario, ejecute el comando ansible con el argumento -ask-pass, de la siguiente manera:

$ ansible all -u shovon –ask-pass -m ping

Como puede ver, Ansible pide la contraseña SSH del usuario. Ahora, escriba su contraseña SSH (contraseña de inicio de sesión de usuario) y pulse <Enter>.

Se puede hacer ping al host, de la siguiente manera:

Ansible Password-based SSH Login for Playbooks

Puede utilizar un inicio de sesión SSH basado en contraseña cuando ejecute playbooks de Ansible. Veamos un ejemplo.

Primero, cree un nuevo playbook askpass1.yaml en el directorio playbooks/, como sigue:

$ nano playbooks/askpass1.yaml

Escriba las siguientes líneas en el archivo askpass1.yaml playbook file:

– hosts: all
user: shovon
tasks:
– name: Ping all hosts
ping:
– name: Print a message
debug:
msg: ‘All set’

Una vez que haya terminado con este paso, guarde el archivo pulsando <Ctrl> + X, seguido de Y y <Enter>.

Ejecuta el playbook askpass1.yaml, de la siguiente manera:

$ ansible-playbook playbooks/askpass1.yaml

Como puedes ver, no soy capaz de conectarme al host. Puedes ver que esto se debe a que no he ejecutado el comando ansible-playbook con la opción -ask-pass.

Ejecuta el playbook askpass1.yaml con la opción -ask-pass, de la siguiente manera:

$ ansible-playbook -ask-pass playbooks/askpass1.yaml

Como puede ver, Ansible le pide una contraseña SSH. Escriba su contraseña SSH y pulse <Intro>.

El playbook askpass1.yaml debería ejecutarse ahora con éxito.

Ansible sudo Password Login for Playbooks

La opción -ask-pass pedirá la contraseña de acceso SSH solamente. ¿Qué pasa si también desea escribir la contraseña de sudo? Verás cómo hacerlo en los siguientes pasos.

Primero, crea un nuevo playbook askpass2.yaml en el directorio playbooks/, como sigue:

$ nano playbooks/askpass2.yaml

Escriba las siguientes líneas en el archivo askpass2.yaml.

– hosts: all
user: shovon
become: True
tareas:
– nombre: Instalar el paquete apache2
apt:
nombre: apache2
estado: latest
– nombre: Asegurarse de que el servicio apache2 se está ejecutando
service:
nombre: apache2
estado: iniciado
habilitado: True
– nombre: Copiar el archivo index.html al servidor
copy:
src: ../files/index.html
dest: /var/www/html/index.html
modo: 0644
owner: www-data
group: www-data

Aquí he utilizado el comando become: True para decirle a Ansible que ejecute este playbook con privilegios sudo. Una vez que hayas terminado con este paso, guarda el archivo askpass2.yaml pulsando <Ctrl> + X, seguido de Y y <Enter>.

Crea un archivo index.¡html en el directorio files/, como sigue:

$ nano files/index.html

Escriba los siguientes códigos HTML en el archivo index.html:

<!DOCTYPE html>
<html>
<head>
<title>Homepage</title>
</head>
<body>
<h1>Hello Mundo</h1>
<p>Funciona</p>
</body>
</html>

Una vez que haya terminado con este paso, guarde el archivo pulsando <Ctrl> + X seguido de Y y <Enter>.

Puede ejecutar el playbook askpass2.yaml con la opción -ask-pass, de la siguiente manera:

$ ansible-playbook –ask-pass playbooks/askpass2.yaml

A continuación, se le pedirá la contraseña SSH, como antes.

Pero el libro de jugadas todavía no puede ejecutar incluso si usted proporciona la contraseña SSH. La razón de esto es porque tiene que decirle a Ansible que pida la contraseña de sudo, así como la contraseña de SSH.

Puede decirle a Ansible que pida la contraseña de sudo utilizando la opción -ask-become-pass mientras se ejecuta el libro de jugadas, de la siguiente manera:

$ ansible-playbook –ask-pass –ask-become-pass playbooks/askpass2.yaml

Ahora, Ansible le pedirá la contraseña SSH.

A continuación, Ansible le pedirá la contraseña sudo. Si su contraseña de sudo es la misma que la contraseña de SSH (que es lo más probable), entonces déjela en blanco y presione <Enter>.

Como puede ver, el playbook se ejecutó con éxito.

Configurar el inicio de sesión SSH basado en contraseña y el inicio de sesión con contraseña sudo

Es posible que desee utilizar el inicio de sesión SSH y sudo basado en contraseña, pero no quiere escribir la contraseña SSH y la contraseña sudo cada vez que ejecuta un libro de jugadas. Si ese es el caso, entonces esta sección es para usted.

Para utilizar el inicio de sesión SSH basado en contraseña y el inicio de sesión sudo sin que se le soliciten las contraseñas, todo lo que tiene que hacer es añadir las variables de host ansible_ssh_pass y ansible_become_pass o las variables de grupo en su archivo de inventario.

Primero, abra el archivo de inventario de hosts, como sigue:

$ nano hosts

Si tiene múltiples hosts en su archivo de inventario y cada uno de los hosts tiene diferentes contraseñas, entonces agregue las variables ansible_ssh_pass y ansible_become_pass como variables de host (después de cada host) como sigue.

Asegúrese de reemplazar secret por su contraseña de SSH y sudo.

Si todos o algunos de los hosts tienen la misma contraseña, entonces puede agregar las variables ansible_ssh_pass y ansible_become_pass como variables de grupo, como se muestra en el siguiente ejemplo.

Aquí, sólo tengo un host, así que he añadido las variables ansible_ssh_pass y ansible_become_pass para el grupo all (todos los hosts en el archivo de inventario). Pero, puede agregar estas variables para otros grupos específicos también.

Una vez que haya terminado de agregar las variables ansible_ssh_pass y ansible_become_pass en el archivo de inventario de hosts, guarde el archivo de inventario de hosts presionando <Ctrl> + X, seguido de Y y <Enter>.

Ahora puede ejecutar el askpass2.yaml, de la siguiente manera:

$ ansible-playbook playbooks/askpass2.yaml

Como puede ver, el playbook se ejecutó con éxito, aunque no pidió la contraseña de SSH o la contraseña de sudo.

Así es como se utiliza sshpass para el inicio de sesión de SSH y sudo con contraseña en Ansible. Gracias por leer este artículo!