Configurar un nuevo usuario y una clave SSH con Ansible en Ubuntu 18.04
Ansible es una sencilla herramienta de automatización que automatiza el despliegue de aplicaciones de software, el aprovisionamiento de la nube y la gestión de la configuración. Es una herramienta de orquestación de servidores que te ayuda a gestionar y controlar un gran número de nodos de servidor desde lugares únicos llamados «Máquinas de Control». Ansible fue creado por Michael DeHaan en 2012 y está escrito en Python y Powershell.
En este tutorial, aprenderemos a desplegar un nuevo usuario y a habilitar la autenticación basada en clave SSH mediante la herramienta de automatización Ansible. También aprenderemos a configurar la «Máquina de Control» de Ansible, así como a escribir un sencillo playbook de Ansible.
Requisitos previos
- 2 o más servidores Ubuntu 18.04
- 10.0.15.10 control-machine
- 10.0.15.21 ansi01
- 10.0.15.22 ansi02
- Privilegios de root
¿Qué vamos a hacer?
- Configurar la máquina de control de Ansible
- Definir el usuario y la clave SSH
- Crea un archivo de inventario
- Crear el Playbook de Ansible
- Desplegar el servidor con el Playbook
- Prueba de
Paso 1 – Configurar la máquina de control de Ansible
En este tutorial, utilizaremos los servidores Ubuntu 16.04 como ‘máquina de control’ de Ansible y hosts de Ansible. El primer paso que tenemos que hacer es configurar la ‘máquina de control’.
Instalaremos python y ansible en la ‘máquina de control’ de ansible ejecutando el siguiente comando.
sudo apt install python ansible -y
Una vez completada la instalación, añadiremos un nuevo usuario del sistema.
Añadiremos un nuevo usuario llamado ‘provision’ para realizar el aprovisionamiento del servidor mediante Ansible.
Añade el nuevo usuario ‘provision’ y dale una contraseña.
useradd -m -s /bin/bash provision
passwd provision
Ahora añade el usuario ‘provision’ para sudo sin la contraseña creando un nuevo archivo de configuración en el ‘/etc/sudoers.d/’ utilizando el siguiente comando.
echo -e 'provision\tALL=(ALL)\tNOPASSWD:\tALL' > /etc/sudoers.d/provision
Se ha creado un nuevo usuario, y ahora puede utilizar sudo sin contraseña.
Paso 2 – Definir el usuario y la clave SSH
En este paso, definiremos el usuario para los hosts de ansible. Este usuario será creado automáticamente por ansible, así que sólo tenemos que definir el nombre de usuario, la contraseña y la clave pública ssh.
Para cada servidor (‘ansi01’ y ‘ansi02’), crearemos un nuevo usuario llamado ‘provision’ con la contraseña ‘secret01’. Y tenemos que cifrar la contraseña ‘secret01’ con el comando mkpasswd.
Encripta la contraseña ‘secret01’ con el siguiente comando.
mkpasswd --method=SHA-512
TYPE THE PASSWORD 'secret01'
Nota:
Asegúrate de que el paquete ‘whois’ está instalado en el sistema, o puedes instalarlo utilizando el siguiente comando.
sudo apt install whois -y
Y obtendrás la contraseña cifrada SHA-512.
A continuación, generaremos una nueva clave ssh.
Entra con el usuario ‘provision’ y genera la clave ssh con el comando ssh-keygen.
su - provision
ssh-keygen -t rsa
Ahora se han definido el usuario y la contraseña, y se ha creado la clave ssh l(ocada en el directorio ‘.ssh’).
Paso 3 – Crear un nuevo inventario
En este paso, definiremos los archivos de inventario para todos los hosts del servidor.
Accede como usuario ‘provision’ y crea un nuevo directorio para el proyecto.
su - provision
mkdir -p ansible01/
Ve al directorio ‘ansible01’ y crea un nuevo archivo de inventario ‘inventory.ini’ utilizando vim.
cd ansible01/
vim inventory.ini
Pega allí la siguiente configuración.
[webserver]
ansi01 ansible_host=10.0.15.21
ansi02 ansible_host=10.0.15.22
Guarda y sal.
Ahora crea un nuevo archivo de configuración de ansible ‘ansible.cfg’.
vim ansible.cfg
Pega allí la siguiente configuración.
[defaults]
inventory = /home/provision/ansible01/inventory.ini
Guarda y sal.
El archivo de inventario de ansible ha sido creado, y nuestros scripts ansible estarán ubicados bajo el usuario ‘provision’, dentro del directorio ‘ansible01’.
Paso 4 – Crear el Playbook de Ansible
El Playbook de Ansible es un conjunto de instrucciones que envías para que se ejecuten en un solo servidor o en un grupo de ellos. Representa el aprovisionamiento de ansible, donde la automatización se define como tareas, y todos los trabajos como la instalación de paquetes, la edición de archivos, serán realizados por módulos ansible.
En este paso, crearemos un nuevo playbook ansible para desplegar un nuevo usuario, desplegar la clave ssh y configurar el servicio ssh.
Antes de crear un nuevo playbook de ansible, escanearemos la huella digital de todos los servidores utilizando el comando ssh-keyscan como se indica a continuación.
ssh-keyscan 10.0.15.21 >> ~/.ssh/known_hosts
ssh-keyscan 10.0.15.22 >> ~/.ssh/known_hosts
Esas huellas digitales de los servidores se almacenarán en el archivo ‘.ssh/known_hosts’.
Nota:
Si tienes muchos nodos de servidor, puedes guardar la lista de hosts y luego escanear manualmente la huella digital de la clave ssh utilizando el script bash como se muestra a continuación.
for i in $(cat list-hosts.txt)
do
ssh-keyscan $i >> ~/.ssh/known_hosts
done
A continuación, crea el ansible playbook llamado ‘deploy-ssh.yml’ utilizando vim.
vim deploy-ssh.yml
Pega allí el siguiente playbook de ansible.
---
- hosts: all
vars:
- provision_password: '$6$w9S3t7x1kRtmG0u$6nVU9KZsC12Q8DYI4FtgKPy.e/cq/jseB/.DViTO1SpUnoCy.dxcOf8hyfitGq5V0yhgXccxzlqm2o.I3SlDJ0'
gather_facts: no
remote_user: root
tasks:
- name: Add a new user named provision
user:
name=provision
password={{ provision_password }}
- name: Add provision user to the sudoers
copy:
dest: "/etc/sudoers.d/provision"
content: "provision ALL=(ALL) NOPASSWD: ALL"
- name: Deploy SSH Key
authorized_key: user=provision
key="{{ lookup('file', '/home/provision/.ssh/id_rsa.pub') }}"
state=present
- name: Disable Password Authentication
lineinfile:
dest=/etc/ssh/sshd_config
regexp='^PasswordAuthentication'
line="PasswordAuthentication no"
state=present
backup=yes
notify:
- restart ssh
- name: Disable Root Login
lineinfile:
dest=/etc/ssh/sshd_config
regexp='^PermitRootLogin'
line="PermitRootLogin no"
state=present
backup=yes
notify:
- restart ssh
handlers:
- name: restart ssh
service:
name=sshd
state=restarted
Guarda y sal.
En el script del playbook
- creamos el script playbook ‘deploy-ssh.yml’ para aplicarlo en todos los servidores definidos en el archivo ‘inventory.ini’.
- creamos la variable ansible ‘provision_password’, que contiene la contraseña cifrada del nuevo usuario.
- Establece los hechos de Ansible como ‘no’.
- Definimos el usuario ‘root’ como usuario remoto para realizar la automatización de tareas.
- Creamos nuevas tareas para añadir un nuevo usuario, añadir el usuario a los sudoers y subir la clave ssh.
- Creamos nuevas tareas para configurar los servicios ssh, desactivar el inicio de sesión de root y desactivar la autenticación de la contraseña. Las tareas para configurar el ssh activarán los manejadores «reiniciar ssh».
- Creamos un manejador para reiniciar el servicio ssh.
Paso 5 – Ejecuta el Playbook
Accede con el usuario ‘provision’ y ve al directorio ‘ansible01’.
su - provision
cd ansible01/
Ahora ejecuta el libro de jugadas ‘deploy-ssh.yml’ utilizando el comando que se muestra a continuación.
ansible-playbook deploy-ssh.yml --ask-pass
Escribe tu contraseña de root y obtendrás el resultado que se muestra a continuación.
Todas las tareas para desplegar un nuevo usuario y una clave ssh se han completado con éxito.
Paso 6 – Prueba
Prueba utilizando el comando ansible.
ansible webserver -m ping
ansible webserver -m shell -a id
Ahora obtendrás los mensajes verdes de abajo.
Ahora podemos gestionar los servidores ‘ansi01’ y ‘ansi02’ mediante Ansible, y el usuario ‘provision’ será el usuario por defecto para Ansible.
Probando la conexión a los servidores
ssh 10.0.15.21
ssh 10.0.15.22
Y te conectarás a cada servidor utilizando el archivo de clave por defecto ‘.ssh/id_rsa’, y utilizando el usuario ‘provision’.
El despliegue del nuevo usuario y de la clave ssh mediante Ansible se ha completado con éxito.