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?

  1. Configurar la máquina de control de Ansible
  2. Definir el usuario y la clave SSH
  3. Crea un archivo de inventario
  4. Crear el Playbook de Ansible
  5. Desplegar el servidor con el Playbook
  6. 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

Configurar la máquina de control de Ansible

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.

Añadir usuario

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.

Definir el usuario y la clave SSH

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’).

se han definido el usuario y la contraseña

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.

Crear un nuevo inventario

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’.

Crear un Playbook de Ansible

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.

Ejecuta el libro de jugadas

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.

Probando Ansible

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’.

Prueba de conexión al servidor

Otra prueba

El despliegue del nuevo usuario y de la clave ssh mediante Ansible se ha completado con éxito.

Referencia

También te podría gustar...