Mostrando entradas con la etiqueta Playbook. Mostrar todas las entradas
Mostrando entradas con la etiqueta Playbook. Mostrar todas las entradas

viernes, 19 de junio de 2020

Instalar Saltstack en Ubuntu

¿Que es SaltStack?

SaltStack es un software de código abierto basado en Python que sirve para automatizar la ejecución remota de tareas y configuraciones.
Es de la familia de Chef, Puppet y Ansible, sobre este ultimo hablamos en el blog.
A través de la "Infraestructura como código", SaltStack nos permite realizar la implementación y administración de sistemas, automatización de la configuración, orquestación, corrección de vulnerabilidades, etc.

La arquitectura de SaltStack:

Utiliza una arquitectura maestro-esclavo y sus componentes mas importantes son:

Master: Servidor que se comunica con los agentes instalados en los dispositivos finales llamados Minions.

Minions : Son los nodos en los cuales se instala un agente que le permite al Master administrarlos y ejecutar comandos de forma remota.

Grains: Es una interfaz que proporciona información del sistema, como el sistema operativo, la memoria, el nombre de dominio, el núcleo, la dirección IP, etc.

States: Los estados son archivos YAML (.SLS) para almacenar la configuración de los Minions.

El Master y los Minions se comunican a través de Keys. Una vez que se forma una red segura entre ellos, el cliente puede comunicarse sin problemas con el Master para recibir instrucciones.

Instalar SaltStack:

Agregamos la llave del repo:

wget -O - https://repo.saltstack.com/py3/ubuntu/20.04/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -

Agregamos el repo en /etc/apt/sources.list.d/saltstack.list:

deb http://repo.saltstack.com/py3/ubuntu/20.04/amd64/latest focal main

Actualizamos el sistema:

sudo apt-get update

Instalación del Master:

sudo apt-get install salt-master

Verificamos la versión:

salt --versions-report


Ahora editamos el archivo del Master:

sudo nano /etc/salt/master

Y cambiamos las siguientes lineas:

interface: 192.168.2.116
gather_job_timeout: 120
timeout: 120

Verificamos el estado del Master:

systemctl status salt-master


Verificamos las llaves:

sudo salt-key -L


Vemos que no hay ninguna Aceptada, ni Denegada ni Rechazada.

Instalación del Minion:

Agregamos la llave del repo:

wget -O - https://repo.saltstack.com/py3/ubuntu/20.04/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -

Agregamos el repo en /etc/apt/sources.list.d/saltstack.list:

deb http://repo.saltstack.com/py3/ubuntu/20.04/amd64/latest focal main

Actualizamos el sistema:

sudo apt-get update

Ahora instalamos el Minion:

sudo apt-get install salt-minion

Editamos el archivo del Minion:

sudo nano /etc/salt/minion

Y agregamos las siguientes lineas:

master: 192.168.2.116
id: primer-minion

Verificamos el estado del Minion:

systemctl status salt-minion


En la parte del archivo minion donde decía master podríamos haber dejado la palabra salt y editar el archivo /etc/hosts asignándole a salt la IP del servidor, pero para los fines de este ejemplo directamente usamos la IP y no el nombre DNS.

Reiniciamos el servicio para que el Minion intente conectarse al Master:

systemctl restart salt-minion

Chequeamos las llaves en el Master:

sudo salt-key -L

Y vemos que ya nos aparece el primer-minion (que es el ID con el que definimos nuestro Minion) pero en las keys no aceptadas:



lunes, 1 de junio de 2020

Instalar Kubernetes en Azure

Bueno vamos a probar Kubernetes en Azure, así de una, sin vueltas, sin caretearla (?).
Para empezar ingresamos al Portal de Azure con nuestras credenciales y en "Inicio" a la izquierda vamos a ver los servicios que nos ofrece Azure para desplegar.
Uno de ellos es "Servicios de Kubernetes", clickeamos ahí:


Luego vamos a crear nuestro primer cluster haciendo click en "Agregar" o "Crear Servicio de Kubernetes":


Elegimos nuestra suscripción, creamos un nuevo grupo de recursos o resource group, elegimos el nombre del cluster y la región. Y mas abajo elegimos el tamaño del nodo y la cantidad, este paso es muy importante, porque al definir el tamaño del nodo básicamente estamos eligiendo las especificaciones técnicas (cpu, memoria, disco) que van a tener las maquinas virtuales que van a formar los nodos del cluster y esto no se podrá cambiar después de crearlo. El numero de nodos si se puede cambiar.
En mi caso elijo la maquina virtual mas barata que es la DS2 v2, que tiene un 2 CPU y 7GB de RAM.



Fijense que a la derecha aparecen los precios de las virtuales (Costo Mensual Estimado):



sábado, 30 de mayo de 2020

Rollback de Deployments y Namespace en Kubernetes

Hola Ardillas, para estos posts largos prefiero ir directamente al asunto y evitar chistes como el del hacker, así que arranquemos.

Para los que no quieren leer todo (aunque lo recomiendo) podríamos dividir el post en 3 grandes títulos que voy a marcarlos en mayúscula, azul y subrayado así TITULO
Los títulos son:
CREAR NAMESPACE
CREAR DEPLOYMENT
ROLLBACK DE UN DEPLOYMENT

Antes de avanzar con el post de rollback de un deployment en si vamos a ver que tengo corriendo actualmente en mi cluster de Kubernetes:

Para ver un listado de lo que tenemos corriendo en el cluster:

kubectl get all


Fijense que diferencia los PODs, de los servicios, de los deployments y las replicas.

Ver detalle de todos los PODs en el namespaces actual:

kubectl get pods -o wide


Ver detalle de todos los PODs en todos los namespaces:

kubectl get pods --all-namespaces  


En este caso vemos los mismos ya que tengo solo un namespace (los otros que aparecen son del sistema).

Ver cantidad de replicas:

kubectl get rs


Ver historial de cambios de un deployment:

kubectl rollout history deployment/nombredeldeploy



lunes, 25 de mayo de 2020

Kubernetes para principiantes

Bueno, ya vimos Ansible, ya vimos Docker y ahora vamos con Kubernetes.
No, hoy no te voy a hacer el chiste del hacker, aunque si, me sigue causando gracia.
Hoy vamos al grano, porque es un post largo que creo que les va a resultar útil.

Kubernetes (K8s) es un proyecto open source que nació en Google y sirve para orquestar contenedores (Docker), aunque no nos permite crear imágenes, ni subirlas al registry, solo sirve para gestionarlos. Es un buen complemento, sino el ideal, de Docker (motor de contenedores) para los entornos de producción grandes en donde Docker solo, no puede escalar.
Distribuye de la mejor forma posible la carga de todos los NODOS.

POD: La unidad mas chica en Kubernetes es un POD, que agrupa dentro suyo diferentes contenedores (en general uno solo) que tienen un componente (kubelet) "que le avisa" al NODO MASTER si la aplicación se encuentra o no corriendo. Y si no esta corriendo entonces Kubernetes levanta una nueva para mantener la cantidad de replicas que configuramos para que se encuentren corriendo. Estas instancias se levantan en base a una imagen, como los containers de Docker.
Los PODs por definición son stateless, y Kubernetes los crea o destruye de manera constante en función de las necesidades. Si los PODs deben tener datos persistentes, deben utilizarse volúmenes.
Los containers levantados en el mismo POD comparten el stack de red y pueden hablar entre si, así como también pueden compartir un volumen y acceder a la misma información. Cada POD tiene su propia direccion IP.
La desventaja de que los containers dentro del POD compartan el stack de red es que no podes tener 2 containers adentro del mismo POD escuchando en el mismo puerto, porque al tener la misma red hay colisión de puertos, pero esto se resuelve poniendo esos 2 containers en PODs diferentes.

NODO: Un NODO conjunto de PODs.

NODO MASTER: Se encargan de coordinar el clúster. Tiene que haber mínimo uno por cluster. Generalmente no ejecutan contenedores, sino que deciden en qué nodo se ejecuta cada contenedor. Usualmente son 3 nodos para alta disponibilidad. Esto es debido a etcd, que guarda el estado global del clúster y su información es crítica. Si hay 3 nodos de etcd y se pierde uno, el sistema puede seguir funcionando, ya que los dos nodos restantes pueden seguir verificándose el uno al otro. Pero ya no se puede perder ningún otro. Por eso, los nodos de etcd se escalan siempre de dos en dos, si hay 3 se puede perder 1, si hay 5 se pueden perder 2 y así sucesivamente.

El NODO MASTER ejecuta los siguientes procesos:
- kube-apiserver que es la forma en la que interactuamos con los otros NODOS del cluster.
- Kubernetes Controller (kube-controller) que compara el estado actual del cluster con el estado que debería tener (chequea por ejemplo si la cantidad de PODs que hay en un NODO es la que debería haber, y sino los levanta).
- Kubernetes Scheduler (kube-scheduler) que es el que se encarga de escuchar al controller y cuando el controller le avisa que le faltan PODs, el scheduler se fija en que NODO pueden estar mejor ubicados y los levanta ahí.
- etcd que es una base de datos que se utiliza para mantener la configuración global del clúster. La información contenida en etcd es crítica y debe tenerse siempre un plan de copias de seguridad.

NODO MINION (WORKERS): Se encargan de la ejecución de los contenedores desplegados en el clúster. Tienen instalado el agente de Kubernetes llamado kubelet (que se encarga de monitorizar que un contenedor se inicie, funcione correctamente y en caso de error, reiniciarlo inmediatamente) y un kube-proxy, que gestiona la red virtual y las IPs virtuales que de cada contenedor.

CLUSTER: Es un conjunto de NODOS.
Entre sus principales funciones se encuentran:
. Permite Escalar
. Permite balanceo de carga
. Reparación automática del contenedor (si falla o muere, el cluster automáticamente levanta uno nuevo)
. Distribución inteligente de la carga de trabajo
. Permite almacenamiento persistente en la nube
. Optimiza nuestros recursos
Para entornos de Workstation se puede usar Minikube .

SERVICES: Los PODs no son visibles más allá de su propio contenedor. Para solucionar esto, existen los services, que son objetos que permiten reenviar tráfico de red a un conjunto de PODs, lo cual nos permite acceder a nuestras aplicaciones. Los services utilizan servidores DNS instalados en la red para registrarse en esta y permitir el acceso por nombres de servicio a sus PODs, facilitando el descubrimiento de los mismos.

VOLUMENES PERSISTENTES: Es una pieza de almacenamiento en el cluster que sirve para guardar los datos de nuestros PODs. Su ciclo de vida es independiente de los PODs individuales.

LABELS/SELECTORS: Los selectors son filtros de las etiquetas. Las labels son muy útiles cuando por ejemplo manejamos 500 contenedores que hacen de webserver y cuya etiqueta es webserver, entonces, si queremos eliminarlos a todos ponemos que borre todo lo que tenga esa etiqueta en lugar de borrar uno por uno.

En Kubernetes, podemos exponer nuestras aplicaciones de varias maneras:
ClusterIP, es el servicio que se genera de forma predeterminada y nos permite acceder a los servicios dentro del clúster. Este servicio no es accesible desde Internet, para que lo sea necesitaríamos habilitar el acceso a través del proxy de Kubernetes.
- Usando un servicio de tipo Kubernetes NodePort, que expone la aplicación en un puerto a través de cada uno de sus nodos. Sólo un servicio por puerto. No es para ambientes en Producción.
- Usando un servicio de tipo Kubernetes LoadBalancer, que crea un balanceador de carga externo que apunta a un servicio Kubernetes en su clúster.
- Usando un Kubernetes Ingress Controller, que permite un enrutamiento HTTP basado en host o URL. Ingress no es un tipo de servicio como el resto, se trata más de un enrutador que permite la entrada al clúster y gestionar el acceso a múltiples servicios. Hay que tener en cuenta que un Ingress Controller generalmente no elimina la necesidad de un LoadBalancer externo: el Ingress Controller solo agrega una capa adicional de enrutamiento y control detrás del balanceador de carga.
Estos son los patrones básicos para enrutar el tráfico externo a su clúster Kubernetes.

MINIKUBE: Es un proyecto que nos permite probar Kubernetes en una maquina local y utiliza maquinas virtuales de Virtual Box (por defecto). Kubernetes necesita al menos 3 nodos para funcionar, lo cual no siempre es posible en una maquina local. Para eso se creó Minikube, que es una versión reducida de Kubernetes, que corre en una única máquina virtual que hace de maestro y esclavo a la vez.
Ademas de Minikube también necesitara instalar kubectl para poder comunicarse con el servidor Kubernetes.

Kubernetes tiene también una parte Web, con un dashboard que permite monitorizar y gestionar el clúster. Minikube viene instalado con uno por defecto.

DEPLOYMENT: Para mantener los PODs prestando servicio sin interrupción utilizamos los deployments, acá definimos cuantas replicas queremos, como queremos desplegarlos, como queremos escalar y Kubernetes se encarga de mantener el clúster funcionando. Los deployments crean replication controllers que por defecto mantienen el número de réplicas que especificamos en el despliegue, pero nos permitirán cambiar este numero a futuro si así lo deseamos.

Bueno, hasta acá toda la teoría, pero estas aburrido, ¿no?
Queres tocar, queres poner manos a la obra, queres revolcarte en este chiquero (?).
Empecemos:


sábado, 16 de mayo de 2020

Instalar Ansible y crear Playbook

Hola mis queridas ardillas! ¿como van después de tanto tiempo?
Como nadie lee esta parte vamos a lo nuestro ¬¬.
En el post de hoy vamos a ver como instalar Ansible y crear un Playbook que nos permita instalar Apache, y en caso de estar ya instalado, iniciar el servicio si no lo está.

Supongo que si estas acá ya sabes lo que es Ansible, pero si no lo sabes, según Wikipedia Ansible es una plataforma de software libre para configurar y administrar ordenadores. Ansible es categorizado como una herramienta de orquestación. Gestiona nodos a través de SSH y no requiere ningún software remoto adicional (excepto Python 2.4 o posterior​).

Para instalar Ansible:

sudo apt-get install ansible

Creamos el archivo con el Playbook:

nano InstalarIniciarApache.yml

Y pegamos lo siguiente:

---
- name: Instalar Apache
  hosts: Webserver
  user: root
  become: true

  tasks:

  - name: Instalar Apache
    apt:
      name: apache2
      state: present

  - name: Encender Apache
    service:
      name: apache2
      state: started

Ctrl + O para guardar.
ENTER para mantener el nombre.
Ctrl + X para salir.

Que manejo del teclado impresionante que tenes.
Presten atención a los espacios y a cada mínimo detalle de la sintaxis porque sino básicamente no funciona y podes estar horas para resolverlo... si lo resolves ¬¬

Ahora vamos a definir hosts que en nuestro Playbook llamamos Webserver y que van a ser aquellos a los que le vamos a aplicar nuestro Playbook y en consecuencia, le vamos a instalar Apache o vamos a levantar el servicio si es que se encuentra detenido.

Editamos el archivo /etc/ansible/hosts y agregamos los nodos sobre los cuales vamos a realizar las tareas automáticas:

sudo nano /etc/ansible/hosts 

Buscamos la linea que dice [webservers] y agregamos, en mi caso, las 2 IPs de los nodos de mi red:


Una aclaración importante, todo en Linux es casesensitive, o sea si en el Playbook pusieron Webserver con la "W" en el host también va con "W", porque si lo ponen con "w" (minúscula) no va a funcionar.
Para saber la ip de la maquina podes ejecutar ifconfig o ip addr.
Ctrl + O para guardar.
ENTER para mantener el nombre.
Ctrl + X para salir.

Muy bien con ese teclado, hacker.

Bueno, ahora tenemos que configurar la parte de la autenticación con los nodos, que lo vamos a hacer con llave SSH.
En la maquina central/principal/donde instalamos Ansible ejecutamos:

ssh-keygen -t rsa

Presionamos ENTER ambas veces:


Una vez realizado este paso tenemos 2 archivos en nuestro home, mas precisamente en /home/tusuario/.ssh a saber:

id_rsa y id_rsa.pub



Una es la publica (si, la que dice .pub, muy bien, estas aprendiendo demasiado rápido). La publica la copiamos en cada nodo remoto con el siguiente comando:

ssh-copy-id -i id_rsa.pub root@192.168.2.111

Deben reemplazar la ip por la de sus nodos. Ponemos "yes" y ya queda copiada:


Fijense que nos dice que probemos loguearnos de esta forma en la maquina remota:

ssh 'root@192.168.2.111'

Y no debería pedirnos password. Si les pasa esto:


Es porque no tienen permisos para loguearse con root por SSH.
Lo que tienen que hacer es editar el archivo /etc/ssh/sshd_config.
Buscar la linea "PermitRootLogin" y ponerle yes.
Por las dudas verifiquen que la siguiente linea también se encuentre en yes:
PubkeyAuthentication yes


Reinician el servicio y prueban de nuevo:

service ssh restart 

Ya con esto tenemos conectividad desde la maquina principal hacia los nodos.
Para verificar ejecutamos:

ansible all -m ping -u root

Y vemos que ambos nodos responden (ignoren mi Warning de Python ¬¬)


Bueno, ahora viene la hora de la verdad, probar nuestro Playbook para ver si nos instala Apache. Primero verifico que ninguno de los 2 nodos lo tiene instalado:

service apache2 status

Luego ejecutamos nuestro Playbook:


Como vemos en uno de los nodos se instalo bien y en el otro nos dio error.
Vamos a verificar que este el servicio iniciado en el que se instalo bien:

service apache2 status


Y en el otro sigue sin levantar:


Para evitar el error de Python con Ansible lo que hice fue configurar manualmente para que use el interprete de Python3:

ansible-playbook InstalarIniciarApache.yml -e 'ansible_python_interpreter=/usr/bin/python3'

Y ahí se instalo correctamente:


Verificamos que quedo instalado:


Por ultimo, probamos bajar el servicio de Apache en el host remoto para luego ejecutar el Playbook a ver si lo levanta. Nos conectamos al host remoto:

ssh 'root@192.168.2.111'

Para bajar el servicio ejecutamos:

service apache2 stop 

Para verificar el estado:

service apache2 status

Luego salimos del host remoto con exit y ejecutamos el Playbook:

ansible-playbook InstalarIniciarApache.yml -e 'ansible_python_interpreter=/usr/bin/python3'

Por ultimo nos logueamos en el remoto de nuevo y vemos el estado de apache:

ssh 'root@192.168.2.111'

service apache2 status




Funciono :)

¿Increíble no? Esto de las computadoras es una verdadera locura.

Para seguirme en Facebook: PINCHA ACA
Para seguirme en Twitter: PINCHA ACA o ACA
Podes suscribirte a los mails también (a la derecha, donde dice ingresa tu mail), tremendo, este blog tiene todo.
Menos Youtube, muy pronto, próximamente, coming soon!

Si te sirvió compartí, no seas egoísta.
Hasta la próxima!