Configuración Integrada de Sistemas Heterogéneos¶
Justificación¶
En escenarios con un numero elevado de máquinas, por ejemplo los servidores y clientes en un IES, los cuales se cuentan como decenas de equipos, la tarea de configuración de servicios en dichos equipos se convierte en tediosa. Para solucionar este inconveniente existen herramientas de la gestión de la configuración (configuration management systems) como puppet
, chef
o ansible
.
El campo de las herramientas de la gestión de la configuración es muy amplio y su explicación detallada sale del ámbito de este módulo, por lo que simplemente se realiza una breve introducción al respecto. En el caso de vagrant la solución que se ha encontrado es muy razonable, ya que en lugar de desarrollar una nueva herramienta Hashicorp
ha optado por una solución más adecuada y razonable: integrarlas todas con vagrant.
En este caso se va a trabajar el "aprovisionamiento" con scripts y ansible
.
Introducción Ansible¶
¿Qué es Ansible?¶
- Tecnología de software libre que nos permite aprovisionar sistemas.
- Mejoras significativas respecto a utilizar Shell scripts.
- Amplia gama de módulos para aprovisionar servidores.
- Herramienta declarativa. (NGINX installed)
- Sin necesidad de configurar agentes. SSH
NOTA
- Con la arquitectura basada en agentes, los nodos deben instalar localmente un proceso de comunicaciones con la máquina de control.
- Con la arquitectura sin agentes los nodos no necesitan instalar ni ejecutar en segundo plano ningún proceso que se comunique con la máquina de control.
- Este tipo de arquitectura reduce la sobrecarga de la red y previene el uso de estrategias de control más agresivas por parte del servidor (como puede ser la realización de sondeos, con sus constantes operaciones de consulta).
Características¶
-
Aprovisionamiento -> Con Ansible se pueden aprovisionar las últimas plataformas en la nube, host virtualizados e hipervisores, dispositivos de red y servidores físicos.
-
Gestión de la configuración -> Establece y mantiene el rendimiento de los paquetes de software instalados y las ubicaciones y direcciones de red de los dispositivos de hardware.
-
Despliegue de aplicaciones -> Cuando se define la aplicación con Ansible y se maneja su despliegue con Ansible Tower es posible llevar un control de todo el ciclo de vida de una aplicación. Desde desarrollo hasta producción.
-
Seguridad y Cumplimiento -> Ansible permite definir las seguridad en los sistemas de forma sencilla. Utilizando la sintaxis de un Playbook es posible definir reglas de firewall, gestión de usuarios y grupos y políticas de seguridad personalizadas en los sistemas que se estén gestionando y además posees un gran número de módulos que ayudan en la labor.
-
Orquestación -> Ansible se usa para orquestar los despliegues de OpenStack por ejemplo. Compañías como Rackspace, CSC, HP, Cisco e IBM confían en Ansible para mantener sus nubes OpenStack disponibles de manera simple y segura.
Nota
- OpenStack: es un proyecto de computación en la nube para proporcionar una infraestructura como servicio (IaaS). Es un software libre y de código abierto. Es decir, Cloud Computing Open Source.
Instalación¶
- Para tener conexión a los servidores, es recomendable generar claves (pública y privada) y copiar la pública a los servidores que queremos configurar.
- Pasos instalación -> INSTALACIÓN
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible -y
Arquitectura Ansible¶
Hay dos tipos de máquinas necesarias en la arquitectura Ansible:
- Nodo del controlador
- Hosts gestionados.
En la siguiente imagen se puede apreciar un esquema de la arquitectura de Ansible
:
- Los elementos principales de la arquitectura de Ansible son:
Controlador¶
- El nodo del controlador es la máquina principal en la que se instala ansible. Todos los
Playbooks
se ejecutan desde un nodo de controlador. - El nodo del controlador es el jefe de la arquitectura
ansible
.
Inventory¶
- Todos los hosts administrados que estamos utilizando en el entorno ansible deben aparecer en un solo archivo simple, junto con las direcciones IP, ssh_password, ssh_user_name y muchos otros atributos de los hosts administrados.
- Ese archivo simple se conoce como Inventario en Ansible.
- La dirección del archivo de inventario debe darse en el archivo de configuración ansible.
- El inventario puede ser dinámico y estático.
Ejemplo
---
[webservers]
www1.example.com
www2.example.com
[dbservers]
db0.example.com
db1.example.com
Playbooks¶
- Los "manuales técnicos" son archivos de texto simples escritos en el lenguaje
YAML
que consisten en una serie de ordenes de reproducción. - Los Playbooks permiten realizar una serie de tareas en el orden en que se han escrito.
- Además en ellos se almacenan el conjunto de instrucciones que se le dan al ansible para realizar una funcionalidad en particular.
- Un
Playbook
define el flujo de trabajo en una arquitectura ansible.
Nota
YAML
significa "YAML Ain't Markup Language" es un lenguaje de serialización de datos que es un lenguaje fácil de usar y se utiliza en la escritura de archivos JSON y playbooks.
Ejemplo
---
- hosts: webservers
serial: 5 # update 5 machines at a time
roles:
- common
- webapp
- hosts: content_servers
roles:
- common
- content
Module¶
Ansible
funciona conectándose a sus nodos y enviando scripts llamados "Módulos Ansibles" a ellos.Ansible
ejecuta estos módulos (a través de SSH por defecto) y los elimina cuando termina.- La biblioteca de módulos puede residir en cualquier máquina, y no se requieren servidores, demonios o bases de datos.
Nota
En ansible, hay cientos de módulos que se utilizan para realizar una amplia gama de tareas de automatización. También podemos escribir nuestros propios módulos.
Ejemplo
Cómo conectarse a dispositivos RouterOS con la API de RouterOS
---
- name: RouterOS test with API
hosts: localhost
gather_facts: false
vars:
hostname: 192.168.1.1
username: admin
password: test1234
tasks:
- name: Get "ip address print"
community.routeros.api:
hostname: "{{ hostname }}"
password: "{{ password }}"
username: "{{ username }}"
path: "ip address"
# The following options configure TLS/SSL.
# Depending on your setup, these options need different values:
tls: true
validate_certs: true
validate_cert_hostname: true
# If you are using your own PKI, specify the path to your CA certificate here:
# ca_path: /path/to/ca-certificate.pem
register: print_path
- name: Show IP address of first interface
ansible.builtin.debug:
msg: "{{ print_path.msg[0].address }}"
Plugins¶
- Los complementos aumentan la funcionalidad principal de Ansible.
- Mientras que los módulos se ejecutan en el sistema de destino en procesos separados (generalmente eso significa en un sistema remoto), los complementos se ejecutan en el nodo de control dentro del proceso
/usr/bin/ansible
. - Los complementos ofrecen opciones y extensiones para las características principales de Ansible: transformación de datos, registro de la salida, conexión al inventario y más.
Aprovisionamiento¶
A continuación se muestran unos breves ejemplos de aprovisionamiento de MVs con Scripts y Ansible
.
Vagrant con Scripts¶
El objetivo es realizar un entorno de Vagrant
sencillo en el que tras arrancar una máquina se realiza una actualización de la lista de paquetes y se efectúan las actualizaciones de aquellos paquetes necesarios mediante apt-get.
- Se crea el fichero
actualizar.sh
ubicado en el mismo directorio que el Vagrantfile y con el siguiente contenido:
#!/bin/bash
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get -y upgrade
- Se crea el siguiente Vagrant file.
Vagrant.configure("2") do |config|
config.vm.box = "Ecodev/ubuntu-server-2204"
config.vm.provision "shell", path: "actualizar.sh"
end
Vagrant con Ansible¶
Partiendo del mismo escenario que el anterior caso, pero ahora utilizando ansible, que debe estar instalado en la máquina anfitriona.
- Se crea un fichero
site.yml
de configuración de ansible para que se realice la actualización de paquetes:
---
- name: actualizar
hosts: all
become: true
tasks:
- name: Ensure system is updated
apt: update_cache=yes upgrade=yes
- El Vagrant file para aplicar la configuración sería:
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "Ecodev/ubuntu-server-2204"
config.vm.provision "ansible" do |ansible|
ansible.playbook = "site.yml"
end
end
Actividades de profundización (AP)¶
PR62. Automatización de servicios de recursos compartidos¶
Realiza un proyecto por grupos de 3 para realizar una exposición en clase del siguiente punto:
- Despliega un sistema homogéneo con Vagrant, al menos de 3 máquinas de distribuciones diferentes, para a continuación aprovisionar, el sistema generado, un servicio Samba-DC. Se podrá elegir entre aprovisionamiento con "scripts" o con Ansible. En la exposición se deben adjuntar las comprobaciones necesarias del correcto funcionamiento del servicio.