Cómo utilizar Ansible para administrar sus recursos de AWS

¿No le encantaría poder simplemente mover una varita y capas de recursos en su cuenta de AWS repentinamente, y mágicamente, cobrarían una vida perfectamente configurada, lista para satisfacer sus complejas necesidades de infraestructura?

Si ya tiene experiencia con AWS, entonces sabrá lo complicado que puede ser trabajar a través de una página web tras otra en la consola de administración de Amazon mientras provee los servicios manualmente. E incluso la AWS CLI, que es un gran paso adelante, puede agregar su propia complejidad y esfuerzo a la combinación.

Eso no quiere decir que AWS en sí no aborde el problema con su propia clase de poderosas herramientas de orquestación, incluido CloudFormation y su Elastic Kubernetes Service (algo que abordo en detalle en mi curso "Uso de Docker en AWS" en Pluralsight). Pero ninguna de esas opciones vive tan cerca de su infraestructura existente, o utiliza una forma de funcionamiento tan familiar, como Ansible.

Si ya está utilizando Ansible para sus operaciones locales, conectarlo a su cuenta de AWS a veces puede ser la forma más rápida y sencilla de migrar las operaciones a la nube.

Comprensión de las ventajas de Ansible / AWS

Mi libro "Administrar recursos de AWS con Ansible", del cual se extrajo este artículo, está diseñado para presentarle rápidamente la aplicación del enfoque declarativo de Ansible para trabajar con recursos de AWS. Poder "declarar" los resultados de configuración precisos que desea y luego producirlos haciendo que Ansible lea un libro de jugadas es la varita mágica de Ansible. Cuando se planifica correctamente, es sorprendente lo simple que puede ser ejecutar implementaciones de AWS complejas y en capas.

Antes de lanzar un sencillo manual de estrategias de Ansible "Hola mundo", primero asegurémonos de que tiene un entorno de trabajo configurado correctamente a través del cual Ansible puede comunicarse con todos sus nuevos amigos en su cuenta de AWS.

Preparando un entorno local

Como probablemente ya sepa, Ansible es una herramienta de orquestación que le permite escribir archivos de libro de jugadas de texto sin formato que declaran el perfil de software y el estado ideal que le gustaría aplicar a un servidor de destino. Esos servidores, conocidos como hosts, se pueden aprovisionar para casi cualquier carga de trabajo digital que pueda imaginar, utilizando casi cualquier combinación de software de aplicación y ejecutándose en casi cualquier plataforma.

En los buenos tiempos, cuando se ejecutaba un libro de jugadas contra un servidor físico, Ansible empleaba una conexión SSH existente para iniciar sesión de forma segura en el host remoto y comenzar a construir su aplicación. Pero eso no funcionará para las cargas de trabajo de AWS. Verá, debido a que las instancias EC2 y otra infraestructura que desea lanzar aún no existen, no puede haber conexiones SSH "existentes". En su lugar, Ansible utilizará Boto 3, el kit de desarrollo de software (o SDK) utilizado por AWS que permite que el código Python se comunique con la API de AWS.

Uso de la AWS CLI para conectar Ansible

Usted no tiene que saber todo lo que funciona, pero tiene que estar allí por lo que se puede trabajar. Por esa razón, instalará la interfaz de línea de comandos (CLI) de AWS. No usaremos la CLI en sí para nada importante, pero instalarla nos dará todas las dependencias que necesitaremos. Puede averiguar cómo hacer que esto funcione en la última versión de cualquier sistema operativo que esté utilizando en la página de documentación de AWS.

Trabajar con el administrador de paquetes de Python, PIP, es una forma popular de hacer todo esto. Así es como instalaría PIP y luego la AWS CLI en una máquina Ubuntu:

sudo apt update sudo apt install python3-pip pip3 install awscli

Debo señalar que, mientras escribo esto, Python 2 todavía está vivo ... pero solo. Por lo tanto, es posible que a veces todavía haya versiones separadas de Python 2 y Python 3 instaladas en su sistema. Dado que Python 2 pronto quedará completamente obsoleto, probablemente no tendrá que preocuparse por especificar python3 o pip3 con sus comandos: eso debería ser automático.

Una vez que la CLI esté instalada, ejecute aws configuree ingrese su ID de clave de acceso de AWS y su clave de acceso secreta.

aws configure cat .aws/credentials

Puede obtener claves en la página Sus credenciales de seguridad en la Consola de administración de AWS. Así es como se verán esas teclas (no obtengas ideas traviesas, estas no son válidas):

AccessKeyId: AKIALNZTQW6H3EFBRLHQ SecretAccessKey: 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

Solo recuerde que un par de claves emitidas al usuario raíz de su cuenta de AWS brindan acceso completo a toda su cuenta de AWS. Cualquier persona en posesión de esas credenciales podría rápidamente ejecutar cargos por servicios de seis e incluso siete cifras, así que tenga mucho cuidado con cómo los usa y almacena. Idealmente, sería mejor limitar su exposición al riesgo creando un usuario administrador en el servicio AWS Identify and Access Management (IAM) con poderes limitados y utilizando una clave emitida para ese usuario.

En cualquier caso, ¿por qué estoy haciendo esto? El valor de completar mi archivo de credenciales de AWS es que Ansible es lo suficientemente inteligente como para buscarlo y, si no hay otras claves de autenticación disponibles en el entorno del sistema, las usará. Pronto verás lo muy conveniente que será. Sin embargo, debe conocer otras formas de administrar la autenticación para los libros de jugadas de Ansible, como usar ansible-vault o crear y luego invocar un archivo aws_keys.yml. Pero una cosa que definitivamente NO debe hacer es codificar las claves en los archivos de su libro de jugadas, especialmente si planea enviarlas a un repositorio en línea como GitHub. Probaré rápidamente la CLI para asegurarme de que podamos conectarnos correctamente a AWS. Este simple comando enumerará todos los depósitos de S3 que tenga dentro de esta cuenta.

aws s3 ls

Ahora estamos listos para instalar ansible. Iré con pip3 para eso. Podría usar el repositorio apt regular de Ubuntu con la misma facilidad, pero lo más probable es que instale una versión un poco más antigua. Dependiendo de su conexión de red, tomará uno o dos minutos, pero me saltearé la mayor parte.

$ pip3 install ansible 

Confirmaré que está instalado correctamente ejecutando ansible --version. Esto nos muestra la versión que se construyó, que los módulos Ansible configurados se guardarán, de forma predeterminada, en una de estas dos ubicaciones en el sistema de archivos, que otros módulos estarían disponibles aquí y, lo más importante, que el ejecutable Ansible está ubicado. dentro del directorio / local / bin / debajo del directorio de inicio de mi usuario. Mi usuario aquí, por cierto, se llama ubuntu. También puede ver que estamos usando una versión agradable y actualizada de Python 3.

$ ansible --version ansible 2.8.5 config file = None configured module search path = ['/home/ubuntu/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /home/ubuntu/.local/lib/python3.6/site-packages/ansible executable location = /home/ubuntu/.local/bin/ansible python version = 3.6.8 (default, Aug 20 2019, 17:12:48) [GCC 8.3.0] 

Un paso más. Como mencioné anteriormente, Ansible se conectará a AWS usando el boto SDK. Por lo tanto, necesitaremos instalar los paquetes boto y boto 3. Iré con PIP para este también.

$ pip3 install boto boto3 

Una vez que se haya incorporado, estaremos listos para hacer algunas cosas reales. Eso comenzará en la siguiente sección.

Probar Ansible con un sencillo manual

Esta será una demostración de prueba de concepto muy simple. Crearé un par de archivos, lo guiaré a través de la sintaxis y luego lo iniciaré. En primer lugar, usaré cualquier editor de texto sin formato para crear un archivo de hosts . Normalmente, el archivo de hosts le dice a Ansible dónde puede encontrar los servidores remotos que desea aprovisionar. Pero dado que, en el caso de AWS, los recursos que serán nuestros hosts aún no existen, simplemente apuntaremos Ansible a localhost y boto manejará las conexiones detrás de escena. Así es como se verá el contenido de ese archivo:

[local] localhost 

A continuación, crearé un archivo de libro de jugadas que llamaré test-ansible.yml. La extensión yml, por supuesto, indica que este archivo debe formatearse utilizando la sintaxis del lenguaje de marcado YAML. Como puede ver en el texto del archivo que he pegado justo debajo, comenzará con tres guiones que marcan el inicio del archivo y luego un guión con sangría que presenta un conjunto de definiciones. El valor de "hosts" podría ser una o más computadoras remotas pero, como dije, dejaremos que el sistema local lo averigüe. Lo mismo ocurre con nuestra conexión.

La siguiente sección incluye las tareas que queremos que realice Ansible. Este utilizará el módulo aws_s3 para crear un nuevo depósito en el servicio de almacenamiento simple S3 de Amazon en la región us-east-1. Tengo que darle este nombre feo porque los depósitos de S3 requieren nombres únicos a nivel mundial: si un nombre que elige choca con cualquiera de los innumerables millones de nombres que ya existen, la operación fallará.

--- - name: Test s3 hosts: local connection: local tasks: - name: Create new bucket aws_s3: bucket: testme817275b mode: create region: us-east-1 

Ejecuto el libro de jugadas llamando al comando ansible-playbook usando -i para especificar el archivo de hosts y luego apuntando al archivo test.yml. Ansible debería darnos su opinión en un momento o dos. Si tenemos éxito, verá "0" como el valor de "fallido" y al menos "1" como el valor de "ok".

$ ansible-playbook -i hosts test-ansible.yml PLAY [Test s3] ****************************************************** TASK [Create new bucket] ******************************************** changed: [localhost] PLAY RECAP ********************************************************** localhost: ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

Si reviso mi lista de depósitos una vez más, debería, y lo hago, ver el nuevo:

$ aws s3 ls 2018-12-30 15:19:24 elasticbeanstalk-us-east-1-297972716276 2018-10-12 04:09:37 mysite548.com 2019-09-24 15:53:26 testme817275b 

Ésa es una introducción muy breve para configurar un entorno Ansible. Vimos cómo el uso de Ansible con los recursos aprovisionados automáticamente de Amazon funcionará de manera diferente a como lo haría con los hosts tradicionales de Ansible. Necesitará un conjunto diferente de herramientas de autenticación y control de inventario. Recorrimos el proceso de configuración de un entorno Ansible y conectarlo a AWS, y luego ejecutamos un manual de estrategias simple. Corto y dulce.

Este artículo proviene de mi libro "Administrar recursos de AWS con Ansible". Hay más bondad de la tecnología, en forma de libros, cursos y artículos, disponibles en mi sitio web, bootstrap-it.com.