Introducción
Hoy en día, los servidores deben crearse y destruirse con mucha frecuencia. Esto se debe a que, a veces, los servidores reciben mucha carga de ejecución, mientras que en otras ocasiones la carga disminuye, desperdiciando así los recursos del sistema. Un ejemplo común son los sitios web de comercio electrónico durante las temporadas festivas que atraen mucho tráfico. Cuando la naturaleza de la aplicación es ser escalable, siempre existe la necesidad de contar con herramientas de gestión de configuración para facilitar el proceso general de creación de servidores. Ansible es una excelente herramienta de gestión de configuración que automatiza la creación de servidores mediante procedimientos estándar, reduciendo los errores humanos.
Ansible no requiere la instalación de software especial en los nodos de los servidores. Cuenta con todas las herramientas necesarias para escribir, compilar y facilitar la automatización de scripts. Este tutorial detalla cómo utilizar Ansible para automatizar los pasos contenidos en nuestro Cómo configurar su servidor Ubuntu tutorial.
Requisitos previos
Para completar esta guía utilizaremos Ubuntu 20.04. Además, también necesitará:
-
Un nodo de control de Ansible: Una máquina Ubuntu que ejecute la última versión de Ubuntu. El binario maestro de Ansible debe estar instalado y ejecutándose en esta máquina. Esta máquina debe poder conectarse a los nodos de Ansible. Para estas conexiones, debe utilizar claves SSH. Para evitar problemas al conectarse, asegúrese de que su nodo de control de Ansible tenga un cortafuegos habilitado. Si necesita ayuda, consulte nuestro Instalación y configuración de Ansible en Ubuntu 20.04 blog.
-
Hosts de Ansible: Se necesitan uno o más hosts a los que conectarse. Los hosts son esencialmente los nodos administrados en Ansible. Estos deben ser servidores Ubuntu.
Funciones del Playbook de Ansible
Puede configurar manualmente todos los pasos mencionados a continuación. Sin embargo, automatizaremos esta ejecución. Cuando ejecute este playbook, realizará las siguientes operaciones en su máquina:
-
Instalará aptitude, que es el preferido por Ansible como su gestor de paquetes.
-
Creará un grupo administrativo wheel con permisos sudo sin contraseña.
-
Creará un nuevo usuario sudo.
-
Copiará una clave SSH local en authorized_keys. Esto se utilizará para un nuevo usuario administrativo en un host remoto.
-
Deshabilitará la autenticación basada en contraseña para el usuario root.
-
Instalará los paquetes necesarios.
-
Configurará el cortafuegos UFW para permitir únicamente conexiones SSH. Cualquier otra conexión será bloqueada.
Una vez que el Playbook termine de ejecutarse, habrá un nuevo usuario disponible. Puede utilizar este usuario para iniciar sesión en el sistema.
Uso del Playbook de Ansible
Para configurar el servidor, necesitará el playbook de configuración inicial del servidor y sus dependencias. Si lo está utilizando por primera vez, deberá clonar el repositorio utilizando el siguiente enlace:
|
1 |
cd ~ |
|
1 |
git clone https://github.com/do-community/ansible-playbooks.git |
|
1 |
cd ansible-playbooks |
Si el repositorio ya existe en su sistema, ejecute el siguiente comando para obtener las últimas actualizaciones:
|
1 |
cd ~/ansible-playbooks |
|
1 |
git pull |
Obtendrá la siguiente estructura de archivos en su máquina:
|
1 2 3 4 |
setup |-- playbook.yml |__vars |-- default,yml |
A continuación se presenta la descripción de los archivos:
-
vars/default.yml: Este archivo contiene las variables para configurar el nodo de Ansible.
-
playbook.yml: Este archivo contiene las tareas que se van a ejecutar en el servidor.
El archivo vars/default.yml se ve algo así:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
A continuación se presenta la descripción de estas variables. Si desea editarlas, puede reemplazar sus valores por los suyos propios:
-
create_user: Este es el usuario que se crea. Este usuario tiene privilegios de sudo.
-
copy_local_key: Esto contiene la ruta a la clave pública SSH local. Se copiaría al servidor remoto como authorized_key.
-
sys_packages: Si desea instalar uno o más paquetes en su servidor, menciónelos aquí como un array.
Una vez que haya editado este archivo, guarde el contenido. Después de eso, en nano, presione CTRL+X , Y. Luego, ENTER para guardar el contenido del archivo.
Ahora está listo para ejecutar este playbook en múltiples servidores. Por defecto, los Playbooks están listos para ejecutarse en los servidores de su inventario. Si desea usar el Playbook en algunos servidores específicos, puede usar la opción -l. Ahora suponga que el servidor remoto tiene múltiples usuarios, puede usar la opción -u para mencionar con qué usuario conectarse.
Si el nombre de su servidor es my_server y el nombre de usuario es my_user, luego ejecute el siguiente comando para ejecutar en los nodos de Ansible:
|
1 |
ansible-playbook playbook.yml -l my_server -u my_user |
Obtendrá una salida similar a esta:
|
1 2 3 4 5 6 7 8 9 |
PLAY [all] ***************************************************************************************************************************** TASK [Recopilando Hechos] ***************************************************************************************************************** ok: [my_server] TASK [Instalar Prerrequisitos] *********************************************************************************************************** cambiado: [my_server] TASK [Asegurarse de que tengamos un 'wheel' grupo] *********************************************************************************************** cambiado: [my_server] TASK [Permitir 'wheel' al grupo tener have sin contraseña sudo] *********************************************************************************** cambiado: [my_server] |
Una vez que esta ejecución haya finalizado, puede conectarse usando el siguiente comando:
|
1 |
ssh my_user@server_host_or_IP |
Recuerde que my_user era el nombre que habíamos usado en el archivo vars/default.yml . También deberá cambiar la IP del servidor por la IP de su servidor en el comando anterior. Si había proporcionado la variable copy_local_key para apuntar a alguna clave SSH personalizada, especifique la ubicación con la opción -i :
|
1 |
ssh my_user@server_host_or_IP -i ~/.ssh/ansible_controller_key |
A continuación, inicie sesión en su servidor para verificar las reglas del cortafuegos UFW:
|
1 |
sudo ufw status |
Obtendrá la siguiente salida:
|
1 2 3 4 5 |
Estado: activo Para Acción Desde -- ------ ---- OpenSSH PERMITIR Cualquier lugar OpenSSH (v6) PERMITIR Cualquier lugar (v6) |
La salida anterior confirma que el cortafuegos UFW se ha finalizado correctamente. Este fue el último paso de nuestro playbook. Si esto se realiza correctamente, significa que la ejecución ha sido exitosa.
El contenido del Ansible Playbook
Los archivos del Playbook que utilizamos en este tutorial están alojados en ansible-playbooks/setup_ubuntu1804 en master · do-community/ansible-playbooks · GitHub. Si desea ver el contenido de cada archivo para usarlo o editarlo, haga clic en el botón Raw en la parte superior de cada script.
Para una referencia rápida, compartiremos el contenido completo del Playbook junto con los archivos relevantes:
-
vars/default.yml
Este archivo contiene los valores que serán utilizados por las tareas del playbook. Estos incluyen valores como el nombre del usuario, privilegios, claves SSH, paquetes a instalar como parte de la configuración inicial, etcétera:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
-
playbook.yml
El archivo playbook.yml contiene los trabajos que se van a ejecutar. Primero, el archivo enumera todos los hosts que se van a definir como objetivo. Si desea especificar todos los servidores, establezca el valor de esta clave en all. A continuación, si desea especificar las tareas que se ejecutarán utilizando privilegios de sudo, establezca el valor de la variable become: true. Finalmente, este archivo debe incluir el contenido del anterior vars/default.yml . Incluimos esto a continuación para cargar la configuración de este archivo:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
--- - hosts: all become: true vars_files: - vars/default.yml tasks: - name: Instalar prerrequisitos apt: name=aptitude update_cache=yes state=latest force_apt_get=yes # Configuración del grupo Sudo - name: Asegurarse de que tengamos un 'wheel' grupo group: name: wheel state: present - name: Permitir 'wheel' al grupo to tener sudo sin contraseña lineinfile: path: /etc/sudoers state: present regexp: '^%wheel' line: '%wheel ALL=(ALL) NOPASSWD: ALL' validate: '/usr/sbin/visudo -cf %s' # Configuración de usuario + clave - name: Crear un nuevo usuario regular con privilegios de sudo user: name: "{{ create_user }}" state: present groups: wheel append: true create_home: true shell: /bin/bash - name: Establecer clave autorizada para el usuario remoto authorized_key: user: "{{ create_user }}" state: present key: "{{ copy_local_key }}" - name: Deshabilitar la autenticación por contraseña para root lineinfile: path: /etc/ssh/sshd_config state: present regexp: '^#?PermitRootLogin' line: 'PermitRootLogin prohibit-password' # Instalar paquetes - name: Actualizar apt apt: update_cache=yes - name: Instalar los paquetes de sistema requeridos apt: name={{ sys_packages }} state=latest # Configuración de UFW - name: UFW - - Permitir conexiones SSH ufw: rule: allow name: OpenSSH - name: UFW - - Denegar todo el resto del tráfico entrante por defecto ufw: state: enabled policy: deny direction: incoming |
Conclusión
La automatización es clave en TI, ya que garantiza que todos los procesos estén libres de errores y sigan las prácticas y procedimientos estándar. Dado que la mayoría del software actual se entrega a través de la web y tiene una naturaleza distribuida, se ha convertido en una tarea cotidiana crear nuevos servidores, por ejemplo, para diferentes entornos como pruebas (staging) o producción, o incluso entornos de demostración.
En este tutorial, demostramos cómo lograr la automatización de servidores utilizando Ansible, una herramienta potente y fácil de usar que puede ahorrarle mucho tiempo.
¡Feliz informática!
Comentarios
Aún no hay comentarios. Sea el primero.