Ansible es simplemente genial y PostgreSQL es sin duda increíble, ¡veamos cómo funcionan juntos de manera increíble!
====================¡Anuncio en hora de máxima audiencia! ====================
La PGConf Europa 2015 tendrá lugar del 27 al 30 de octubre en Viena este año.
Supongo que posiblemente esté interesado en la administración de la configuración, la orquestación del servidor, la implementación automatizada (es por eso que está leyendo esta publicación de blog, ¿verdad?) y le gusta trabajar con PostgreSQL (seguro) en AWS (opcionalmente), entonces quizás desee unirse a mi charla "Administración de PostgreSQL con Ansible" el 28 de octubre, 15-15:50.
¡Consulte el increíble calendario y no pierda la oportunidad de asistir al mayor evento de PostgreSQL de Europa!
Espero verte allí, sí, me gusta tomar café después de las charlas 🙂
====================¡Anuncio en hora de máxima audiencia! ====================
¿Qué es Ansible y cómo funciona?
El lema de Ansible es "automatización de TI de código abierto simple, sin agentes y potente". ” citando documentos de Ansible.
Como se puede ver en la figura a continuación, la página de inicio de Ansible establece que las principales áreas de uso de Ansible son:aprovisionamiento, administración de configuración, implementación de aplicaciones, entrega continua, seguridad y cumplimiento, orquestación. El menú de descripción general también muestra en qué plataformas podemos integrar Ansible, es decir, AWS, Docker, OpenStack, Red Hat, Windows.
Revisemos los principales casos de uso de Ansible para comprender cómo funciona y qué tan útil es para los entornos de TI.
Aprovisionamiento
Ansible es su fiel amigo cuando desea automatizar todo en su sistema. No tiene agente y simplemente puede administrar sus cosas (es decir, servidores, balanceadores de carga, conmutadores, firewalls) a través de SSH. Ya sea que sus sistemas se ejecuten en servidores bare-metal o en la nube, Ansible estará allí y lo ayudará a aprovisionar sus instancias. Sus características idempotentes aseguran que siempre estarás en el estado que deseabas (y esperabas).
Gestión de la configuración
Una de las cosas más difíciles es no repetirse en tareas operativas repetitivas y aquí Ansible vuelve a la mente como salvador. En los viejos tiempos, cuando los tiempos eran malos, los administradores de sistemas escribían muchos scripts y se conectaban a muchos servidores para aplicarlos y obviamente no era lo mejor en sus vidas. Como todos sabemos, las tareas manuales son propensas a errores y generan un entorno heterogéneo en lugar de uno homogéneo y más manejable, lo que definitivamente hace que nuestra vida sea más estresante.
Con Ansible puede escribir playbooks simples (con la ayuda de documentación muy informativa y el apoyo de su gran comunidad) y una vez que escribe sus tareas puede llamar a una amplia gama de módulos (es decir, AWS, Nagios, PostgreSQL, SSH, APT, File módulos). Como resultado, puede concentrarse en actividades más creativas que en la administración manual de configuraciones.
Implementación de aplicaciones
Teniendo los artefactos listos, es muy fácil implementarlos en varios servidores. Dado que Ansible se comunica a través de SSH, no es necesario extraer datos de un repositorio en cada servidor ni preocuparse por métodos antiguos como copiar archivos a través de FTP. Ansible puede sincronizar artefactos y garantizar que solo se transfieran archivos nuevos o actualizados y que se eliminen los archivos obsoletos. Esto también acelera las transferencias de archivos y ahorra mucho ancho de banda.
Además de transferir archivos, Ansible también ayuda a preparar los servidores para su uso en producción. Antes de la transferencia, puede pausar el monitoreo, eliminar servidores de los balanceadores de carga y detener servicios. Después de la implementación, puede iniciar servicios, agregar servidores a balanceadores de carga y reanudar el monitoreo.
Todo esto no tiene que suceder a la vez para todos los servidores. Ansible puede funcionar en un subconjunto de servidores a la vez para proporcionar implementaciones sin tiempo de inactividad. Por ejemplo, al mismo tiempo puede implementar 5 servidores a la vez y luego puede implementarse en los siguientes 5 servidores cuando hayan terminado.
Después de implementar este escenario, se puede ejecutar en cualquier lugar. Los desarrolladores o miembros del equipo de control de calidad pueden realizar implementaciones en sus propias máquinas con fines de prueba. Además, para revertir una implementación por cualquier motivo, todo lo que Ansible necesita es la ubicación de los últimos artefactos de trabajo conocidos. Luego puede volver a implementarlos fácilmente en servidores de producción para volver a poner el sistema en un estado estable.
Entrega continua
La entrega continua significa adoptar un enfoque rápido y simple para los lanzamientos. Para lograr ese objetivo, es crucial utilizar las mejores herramientas que permitan lanzamientos frecuentes sin tiempos de inactividad y requieran la menor intervención humana posible. Dado que hemos aprendido sobre las capacidades de implementación de aplicaciones de Ansible anteriormente, es bastante fácil realizar implementaciones sin tiempo de inactividad. El otro requisito para la entrega continua son menos procesos manuales y eso significa automatización. Ansible puede automatizar cualquier tarea, desde el aprovisionamiento de servidores hasta la configuración de servicios para estar listos para la producción. Después de crear y probar escenarios en Ansible, se vuelve trivial ponerlos frente a un sistema de integración continua y dejar que Ansible haga su trabajo.
Seguridad y Cumplimiento
La seguridad siempre se considera lo más importante, pero mantener los sistemas seguros es una de las cosas más difíciles de lograr. Debe estar seguro de la seguridad de sus datos, así como de la seguridad de los datos de sus clientes. Para estar seguro de la seguridad de sus sistemas, definir la seguridad no es suficiente, debe poder aplicar esa seguridad y monitorear constantemente sus sistemas para garantizar que sigan cumpliendo con esa seguridad.
Ansible es fácil de usar, ya sea para configurar reglas de firewall, bloquear usuarios y grupos o aplicar políticas de seguridad personalizadas. Es seguro por su naturaleza, ya que puede aplicar repetidamente la misma configuración y solo realizará los cambios necesarios para que el sistema vuelva a cumplir.
Orquestación
Ansible se asegura de que todas las tareas asignadas estén en el orden correcto y establece una armonía entre todos los recursos que administra. Orquestar implementaciones complejas de varios niveles es más fácil con las capacidades de implementación y administración de configuración de Ansible. Por ejemplo, considerando la implementación de una pila de software, preocupaciones como asegurarse de que todos los servidores de bases de datos estén listos antes de activar los servidores de aplicaciones o configurar la red antes de agregar servidores al balanceador de carga ya no son problemas complicados.
Ansible también ayuda a la orquestación de otras herramientas de orquestación como CloudFormation de Amazon, Heat de OpenStack, Swarm de Docker, etc. De esta manera, en lugar de aprender diferentes plataformas, idiomas y reglas; los usuarios solo pueden concentrarse en la sintaxis YAML de Ansible y en los potentes módulos.
¿Qué es un módulo Ansible?
Los módulos o bibliotecas de módulos proporcionan a Ansible medios para controlar o administrar recursos en servidores locales o remotos. Realizan una variedad de funciones. Por ejemplo, un módulo puede ser responsable de reiniciar una máquina o simplemente puede mostrar un mensaje en la pantalla.
Ansible permite a los usuarios escribir sus propios módulos y también proporciona módulos básicos o extras listos para usar.
¿Qué pasa con los libros de jugadas de Ansible?
Ansible nos permite organizar nuestro trabajo de varias maneras. En su forma más directa, podemos trabajar con los módulos de Ansible usando el “ansible ” herramienta de línea de comandos y el archivo de inventario.
Inventario
Uno de los conceptos más importantes es el inventario . Necesitamos un archivo de inventario para que Ansible sepa qué servidores necesita conectarse mediante SSH, qué información de conexión requiere y, opcionalmente, qué variables están asociadas con esos servidores.
El archivo de inventario está en un formato similar a INI. En el archivo de inventario, podemos especificar más de un host y agruparlos en más de un grupo de host.
Nuestro ejemplo de archivo de inventario hosts.ini es como el siguiente:
[dbservers]
db.example.com
Aquí tenemos un solo host llamado "db.example.com" en un grupo de hosts llamado "dbservers". En el archivo de inventario, también podemos incluir puertos SSH personalizados, nombres de usuario SSH, claves SSH, información de proxy, variables, etc.
Dado que tenemos un archivo de inventario listo, para ver los tiempos de actividad de nuestros servidores de bases de datos, podemos invocar el "comando de Ansible ” y ejecute el módulo “uptime Comando en esos servidores:
ansible dbservers -i hosts.ini -m command -a "uptime"
Aquí le indicamos a Ansible que lea los hosts del archivo hosts.ini, los conecte usando SSH, ejecute el "tiempo de actividad ” comando en cada uno de ellos, y luego imprima su salida en la pantalla. Este tipo de ejecución de módulo se denomina comando ad-hoc .
La salida del comando será como:
[email protected] ~/blog/ansible-loves-postgresql # ansible dbservers -i hosts.ini -m command -a "uptime"
db.example.com | success | rc=0 >>
21:16:24 up 93 days, 9:17, 4 users, load average: 0.08, 0.03, 0.05
Sin embargo, si nuestra solución contiene más de un solo paso, se vuelve difícil administrarlos solo mediante el uso de comandos ad-hoc.
Aquí vienen los libros de jugadas de Ansible. Nos permite organizar nuestra solución en un archivo de playbook al integrar todos los pasos por medio de tareas, variables, roles, plantillas, controladores y un inventario.
Echemos un breve vistazo a algunos de estos términos para entender cómo nos pueden ayudar.
Tareas
Otro concepto importante son las tareas. Cada tarea de Ansible contiene un nombre, un módulo al que llamar, parámetros del módulo y, opcionalmente, condiciones previas y posteriores. Nos permiten llamar a módulos de Ansible y pasar información a tareas consecutivas.
Variables
También hay variables. Son muy útiles para reutilizar la información que proporcionamos o recopilamos. Podemos definirlos en el inventario, en archivos YAML externos o en libros de jugadas.
Libro de jugadas
Los playbooks de Ansible se escriben con la sintaxis YAML. Puede contener más de una jugada. Cada juego contiene el nombre de los grupos anfitriones a los que conectarse y las tareas que debe realizar. También puede contener variables/roles/controladores, si están definidos.
Ahora podemos mirar un libro de jugadas muy simple para ver cómo se puede estructurar:
---
- hosts: dbservers
gather_facts: no
vars:
who: World
tasks:
- name: say hello
debug: msg="Hello {{ who }}"
- name: retrieve the uptime
command: uptime
En este libro de jugadas muy simple, le dijimos a Ansible que debería operar en servidores definidos en el grupo de host "dbservers". Creamos una variable llamada “quién” y luego definimos nuestras tareas. Observe que en la primera tarea en la que imprimimos un mensaje de depuración, usamos la variable "quién" e hicimos que Ansible imprimiera "Hello World" en la pantalla. En la segunda tarea, le dijimos a Ansible que se conectara a cada host y luego ejecutara el comando "tiempo de actividad" allí.
Módulos PostgreSQL de Ansible
Ansible proporciona una serie de módulos para PostgreSQL. Algunos de ellos se encuentran en los módulos principales, mientras que otros se pueden encontrar en los módulos adicionales.
Todos los módulos PostgreSQL requieren que el paquete Python psycopg2 esté instalado en la misma máquina con el servidor PostgreSQL. Psycopg2 es un adaptador de base de datos PostgreSQL en el lenguaje de programación Python.
En los sistemas Debian/Ubuntu, el paquete psycopg2 se puede instalar usando el siguiente comando:
apt-get install python-psycopg2
Ahora vamos a examinar estos módulos en detalle. A modo de ejemplo, trabajaremos en un servidor PostgreSQL en el host db.example.com en el puerto 5432 con postgres usuario y una contraseña vacía.
postgresql_db
Este módulo central crea o elimina una base de datos PostgreSQL determinada. En la terminología de Ansible, asegura que una base de datos PostgreSQL dada esté presente o ausente.
La opción más importante es el parámetro requerido “nombre ”. Representa el nombre de la base de datos en un servidor PostgreSQL. Otro parámetro significativo es “estado ”. Requiere uno de dos valores:presente o ausente . Esto nos permite crear o eliminar una base de datos que se identifica por el valor dado en el nombre parámetro.
Algunos flujos de trabajo también pueden requerir la especificación de parámetros de conexión como login_host , puerto , usuario_usuario y contraseña_de_inicio de sesión .
Vamos a crear una base de datos llamada “module_test ” en nuestro servidor PostgreSQL agregando las siguientes líneas a nuestro archivo de libro de jugadas:
- postgresql_db: name=module_test
state=present
login_host=db.example.com
port=5432
login_user=postgres
Aquí, nos conectamos a nuestro servidor de base de datos de prueba en db.example.com con el usuario; postgres . Sin embargo, no tiene que ser el postgres user como nombre de usuario puede ser cualquier cosa.
Eliminar la base de datos es tan fácil como crearla:
- postgresql_db: name=module_test
state=absent
login_host=db.example.com
port=5432
login_user=postgres
Tenga en cuenta el valor "ausente" en el parámetro "estado".
postgresql_ext
Se sabe que PostgreSQL tiene extensiones muy útiles y poderosas. Por ejemplo, una extensión reciente es tsm_system_rows lo que ayuda a obtener el número exacto de filas en el muestreo de tablas. (Para obtener más información, puede consultar mi publicación anterior sobre métodos de muestreo de tablas).
Este módulo de extras agrega o elimina extensiones de PostgreSQL de una base de datos. Requiere dos parámetros obligatorios:db y nombre . La base de datos el parámetro se refiere al nombre de la base de datos y al nombre El parámetro hace referencia al nombre de la extensión. También tenemos el estado parámetro que necesita presente o ausente valores y los mismos parámetros de conexión que en el módulo postgresql_db.
Comencemos por crear la extensión de la que hablamos:
- postgresql_ext: db=module_test
name=tsm_system_rows
state=present
login_host=db.example.com
port=5432
login_user=postgres
usuario_postgresql
Este módulo central permite agregar o eliminar usuarios y roles de una base de datos PostgreSQL.
Es un módulo muy poderoso porque mientras asegura que un usuario esté presente en la base de datos, también permite la modificación de privilegios o roles al mismo tiempo.
Comencemos mirando los parámetros. El único parámetro obligatorio aquí es "nombre ”, que hace referencia a un usuario o un nombre de rol. Además, como en la mayoría de los módulos de Ansible, el "estado El parámetro ” es importante. Puede tener uno de presente o ausente valores y su valor predeterminado es presente .
Además de los parámetros de conexión como en los módulos anteriores, algunos otros parámetros opcionales importantes son:
- bd :Nombre de la base de datos donde se otorgarán los permisos
- contraseña :Contraseña del usuario
- privado :Privilegios en "priv1/priv2" o privilegios de tabla en formato "table:priv1,priv2,..."
- role_attr_flags :Atributos de rol. Los valores posibles son:
- [NO]SUPERUSUARIO
- [NO]CREATEROLA
- [NO]CREAR USUARIO
- [NO]CREADOB
- [NO]HEREDAR
- [NO]INICIAR SESIÓN
- [SIN]REPLICACIÓN
Para crear un nuevo usuario llamado ada con contraseña lovelace y un privilegio de conexión a la base de datos module_test , podemos agregar lo siguiente a nuestro libro de jugadas:
- postgresql_user: db=module_test
name=ada
password=lovelace
state=present
priv=CONNECT
login_host=db.example.com
port=5432
login_user=postgres
Ahora que tenemos al usuario listo, podemos asignarle algunos roles. Para permitir que “ada” inicie sesión y cree bases de datos:
- postgresql_user: name=ada
role_attr_flags=LOGIN,CREATEDB
login_host=db.example.com
port=5432
login_user=postgres
También podemos otorgar privilegios globales o basados en tablas como “INSERT ”, “ACTUALIZAR ”, “SELECCIONAR ”, y “ELIMINAR ” usando el priv parámetro. Un punto importante a considerar es que un usuario no puede ser eliminado hasta que todos los privilegios otorgados sean revocados primero.
postgresql_privs
Este módulo central otorga o revoca privilegios sobre los objetos de la base de datos de PostgreSQL. Los objetos admitidos son:tabla , secuencia , función , base de datos , esquema , idioma , espacio de tabla y grupo .
Los parámetros requeridos son "base de datos"; nombre de la base de datos para otorgar/revocar privilegios y “roles”; una lista de nombres de roles separados por comas.
Los parámetros opcionales más importantes son:
- tipo :Tipo de objeto sobre el que establecer privilegios. Puede ser uno de:tabla, secuencia, función, base de datos, esquema, idioma, tablespace, grupo . El valor predeterminado es tabla .
- objetos :Objetos de base de datos para establecer privilegios. Puede tener varios valores. En ese caso, los objetos se separan mediante una coma.
- privilegios :Lista separada por comas de privilegios para otorgar o revocar. Los valores posibles incluyen:TODOS , SELECCIONAR , ACTUALIZAR , INSERTAR .
Veamos cómo funciona esto otorgando todos los privilegios en el "público ” esquema a “ada ”:
- postgresql_privs: db=module_test
privs=ALL
type=schema
objs=public
role=ada
login_host=db.example.com
port=5432
login_user=postgres
postgresql_lang
Una de las características más poderosas de PostgreSQL es su compatibilidad con prácticamente cualquier lenguaje para ser utilizado como lenguaje de procedimiento. Este módulo de extras agrega, elimina o cambia lenguajes de procedimiento con una base de datos PostgreSQL.
El único parámetro obligatorio es “lang ”; nombre del lenguaje de procedimiento para agregar o quitar. Otras opciones importantes son “db ”; el nombre de la base de datos donde se agrega o elimina el idioma, y "confiar ”; opción para hacer que el idioma sea confiable o no confiable para la base de datos seleccionada.
Habilitemos el lenguaje PL/Python para nuestra base de datos:
- postgresql_lang: db=module_test
lang=plpython2u
state=present
login_host=db.example.com
port=5432
login_user=postgres
Poniéndolo todo junto
Ahora que sabemos cómo está estructurado un libro de jugadas de Ansible y qué módulos de PostgreSQL están disponibles para que los usemos, ahora podemos combinar nuestros conocimientos en un libro de jugadas de Ansible.
La forma final de nuestro playbook main.yml es como la siguiente:
---
- hosts: dbservers
sudo: yes
sudo_user: postgres
gather_facts: yes
vars:
dbname: module_test
dbuser: postgres
tasks:
- name: ensure the database is present
postgresql_db: >
state=present
db={{ dbname }}
login_user={{ dbuser }}
- name: ensure the tsm_system_rows extension is present
postgresql_ext: >
name=tsm_system_rows
state=present
db={{ dbname }}
login_user={{ dbuser }}
- name: ensure the user has access to database
postgresql_user: >
name=ada
password=lovelace
state=present
priv=CONNECT
db={{ dbname }}
login_user={{ dbuser }}
- name: ensure the user has necessary privileges
postgresql_user: >
name=ada
role_attr_flags=LOGIN,CREATEDB
login_user={{ dbuser }}
- name: ensure the user has schema privileges
postgresql_privs: >
privs=ALL
type=schema
objs=public
role=ada
db={{ dbname }}
login_user={{ dbuser }}
- name: ensure the postgresql-plpython-9.4 package is installed
apt: name=postgresql-plpython-9.4 state=latest
sudo_user: root
- name: ensure the PL/Python language is available
postgresql_lang: >
lang=plpython2u
state=present
db={{ dbname }}
login_user={{ dbuser }}
Ahora podemos ejecutar nuestro libro de jugadas usando el comando "ansible-playbook":
[email protected] ~/blog/ansible-loves-postgresql # ansible-playbook -i hosts.ini main.yml
PLAY [dbservers] **************************************************************
GATHERING FACTS ***************************************************************
ok: [db.example.com]
TASK: [ensure the database is present] ****************************************
changed: [db.example.com]
TASK: [ensure the tsm_system_rows extension is present] ***********************
changed: [db.example.com]
TASK: [ensure the user has access to database] ********************************
changed: [db.example.com]
TASK: [ensure the user has necessary privileges] ******************************
changed: [db.example.com]
TASK: [ensure the user has schema privileges] *********************************
changed: [db.example.com]
TASK: [ensure the postgresql-plpython-9.4 package is installed] ***************
changed: [db.example.com]
TASK: [ensure the PL/Python language is available] ****************************
changed: [db.example.com]
PLAY RECAP ********************************************************************
db.example.com : ok=8 changed=7 unreachable=0 failed=0
Puede encontrar el inventario y el archivo del libro de estrategias en mi repositorio de GitHub creado para esta publicación de blog. También hay otro libro de jugadas llamado "remove.yml" que deshace todo lo que hicimos en el libro de jugadas principal.
Para obtener más información sobre Ansible:
- Echa un vistazo a sus documentos bien escritos.
- Mire el video de inicio rápido de Ansible, que es un tutorial muy útil.
- Siga su calendario de seminarios web, hay algunos próximos seminarios web interesantes en la lista.