Buscar..


Observaciones

ejemplo-2: Esto sirve como ejemplo, así que simplemente no lo copie / pegue. En su lugar, para satisfacer sus necesidades, debe personalizar sus variables; ansible_key, reglas de grupo de seguridad etc.

ejemplo-1: Para deshabilitar la comprobación estricta de la clave de host ssh, un comportamiento que no queremos al automatizar tareas, lo configuramos como no en el archivo ansible.cfg . es decir: StrictHostKeyChecking=no

El archivo ec2.py es un script de Python que ejecuta y devuelve sus recursos de AWS basados ​​en el ec2.ini que es el archivo de configuración que necesita personalizar si desea limitar el alcance de su proyecto a algunas regiones particulares, etiquetas específicas, etc. ...

Cómo iniciar la instancia de EC2 desde las AMI oficiales de Amazon, modificarla y almacenarla como nueva AMI

Este es un flujo de trabajo muy común cuando se utiliza Ansible para aprovisionar una instancia de AWS EC2. Esta publicación supone un conocimiento básico de Ansible y, lo que es más importante, supone que la ha configurado correctamente para conectarse a AWS.

Como insiste la documentación oficial de Ansible , vamos a utilizar cuatro roles:

1- ami_find para obtener el ID de ami en función del cual lanzaremos nuestra instancia de EC2.

2- ec2_ami_creation para lanzar efectivamente la instancia de EC2.

3- code_deploy para modificar la instancia; Esto podría ser cualquier cosa, así que simplemente transferiremos un archivo a la máquina de destino.

4- build_ami para construir nuestra nueva imagen basada en la instancia de ec2 en ejecución. Esta publicación asume que estás en el nivel superior de tu proyecto de Ansible: my_ansible_project

El primer rol: ami_find

cd my_ansible_project/roles && ansible-galaxy init ami_find

En este rol vamos a usar el módulo ec2_ami_find y, como ejemplo, buscaremos una máquina Ubuntu y obtendremos su ami_id (ami-xxxxxxxx). Ahora edite el my_ansible_project/roles/ami_find/tasks/main.yml :

---
- ec2_ami_find:
    name: "ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"
    sort: name
    sort_order: descending
    sort_end: 1
    region: "{{ aws_region }}"
  register: ami_find
- set_fact: ami_ubuntu="{{ ami_find.results[0].ami_id }}"

El segundo rol: ec2_ami_creation

Aquí, usaremos el ami_id que obtuvimos del primer rol y luego ami_id nuestra nueva instancia basada en él:

cd my_ansible_project/roles && ansible-galaxy init ec2_ami_creation

En este rol, vamos a utilizar lo más importante el módulo ec2 para lanzar nuestra instancia. Ahora edite my_ansible_project/roles/ec2_ami_creation/tasks/main.yml file:

---
- ec2_vpc_subnet_facts:
    region: "{{aws_region}}"
  register: vpc
- name: creation of security group of the ec2 instance
  ec2_group:
    name: example
    description: an example EC2 group
    region: "{{ aws_region }}"
    rules:
      - proto: tcp
        from_port: 22
        to_port: 22
        cidr_ip: 0.0.0.0/0
    state: present
  register: ec2_sg

- name: create instance using Ansible
  ec2:
    key_name: "{{ ansible_key }}"
    group: example
    vpc_subnet_id: "{{vpc.subnets[0].id}}"
    instance_type: "{{ instance_type }}"
    ec2_region: "{{ aws_region }}"
    image: "{{ base_image }}"
    assign_public_ip: yes
    wait: yes
  register: ec2

- set_fact: id={{ec2.instances[0].id}}

- name: adding the newly created instance to a temporary group in order to access it later from another play
  add_host: name={{ item.public_ip }} groups=just_created
  with_items: ec2.instances

- name: Wait for SSH to come up
  wait_for: host={{ item.public_dns_name }} port=22 delay=10 timeout=640 state=started
  with_items: ec2.instances

El tercer rol: code_deploy

Aquí, aprovisionaremos esta instancia, que se agregó a un grupo llamado just_created

cd my_ansible_project/roles && ansible-galaxy init code_deploy

En este rol, vamos a utilizar el template_module para transferir un archivo y escribir el nombre de host de la máquina en él. Ahora edite el my_ansible_project/roles/code_deploy/tasks/main.yml :

---
- template: src=my_file.txt.j2 dest=/etc/my_file.txt

Luego, muévase a la carpeta de plantillas dentro de su rol:

cd my_ansible_project/roles/templates y agregue un archivo llamado my_file.txt.j2 contiene:

my name is {{ ansible_hostname }}` 

El cuarto papel: build_ami

Ahora crearemos una imagen de la instancia en ejecución usando el módulo ec2_ami . Mueve a tu carpeta de proyectos y:

 cd my_ansible_project/roles && ansible-galaxy init build_ami

Ahora edite el my_ansible_project/roles/build_ami/tasks/main.yml :

---
- ec2_ami:
    instance_id: "{{ instance_id }}"
    wait: yes
    name: Base_Image

Ahora, creo que te has estado preguntando cómo organizar todos estos roles. Estoy en lo cierto Si es así, sigue leyendo.

Escribiremos un libro de jugadas, compuesto por tres jugadas: la primera jugada aplicable en localhost llamará a nuestras dos primeras funciones, la segunda jugada se aplicará a nuestro grupo just_created . El último rol será aplicable en localhost . ¿Por qué localhost ? Cuando queremos administrar algunos recursos de AWS, usamos nuestra máquina local, tan simple como eso. A continuación, usaremos un archivo vars en el que pondremos nuestras variables: ansible_key , aws_region , etc.

cree una carpeta de infraestructura en la parte superior de su proyecto y agregue un archivo dentro llamado aws.yml :

---
aws_region: ap-southeast-2
ansible_key: ansible
instance_type: t2.small

Así que en la parte superior de tu proyecto crea build_base_image.yml y agrega esto:

---
   - hosts: localhost
     connection: local
     gather_facts: False
     vars_files:
       - infrastructure/aws.yml
     roles:
       - ami_find
       - { role: ec2_creation, base_image: "{{ ami_ubuntu }}"}

   - hosts: just_created
     connection: ssh
     gather_facts: True
     become: yes
     become_method: sudo
     roles:
       - code_deploy

   - hosts: localhost
     connection: local
     gather_facts: False
     vars_files:
       - infrastructure/aws.yml
     roles:
       - { role: new_image, instance_id: "{{ id }}"}

Eso es todo. No olvide eliminar sus recursos después de probar esto, o por qué no crear una función para eliminar la instancia en ejecución :-)

Cómo configurar correctamente Ansible para conectarse a los servicios web de Amazon

La administración de los recursos de AWS que escalan hacia arriba y hacia abajo se encuentra dentro de los límites del archivo host de inventario estático, es por eso que necesitamos algo dinámico. Y para eso están los inventarios dinámicos . Empecemos:

Descargue estos archivos ec2.ini y ec2.py en la carpeta de su proyecto:

cd my_ansible_project 
wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.py    
wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.ini

Una vez hecho esto, haga el archivo ec2.py ejecutable:

chmod +x ec2.py

Ahora, exporte su clave de acceso y secreto de AWS como variables de entorno:

export AWS_ACCESS_KEY_ID='ABCDEFGHIJKLM'
export AWS_SECRET_ACCESS_KEY='NOPQRSTUVWXYZ'

Para usar el script ec2.py necesitamos el SDK de Python AWS, boto , por lo que necesita instalarlo:

sudo pip install boto

Para probar si todo está bien, intente ejecutar el ec2.py enumerando sus recursos:

./ec2.py --list

Deberías ver algo similar a:

{
  "_meta": {
    "hostvars": {}
  }
}

Ahora queremos usar el inventario dinámico junto con nuestro archivo de hosts estáticos. Primero, cree una carpeta llamada inventory , agregue ec2.py , ec2.ini y nuestro archivo de hosts y luego diga a Ansible que use esa carpeta como un archivo de inventario:

mkdir inventory 
mv ec2.py inventory/ec2.py
mv ec2.ini inventory/ec2.ini
mv hosts inventory/hosts

A continuación, debemos definir la configuración a nivel de proyecto para Ansible creando un archivo de configuración de Ansible en su carpeta de proyecto llamada ansible.cfg y agregando esto:

[defaults]
hostfile = inventory
[ssh_connection]
pipelining = False
ssh_args = -o ControlMaster=auto -o ControlPersist=30m -o StrictHostKeyChecking=no

A continuación, debemos configurar Ansible para usar una clave SSH para autenticar el acceso a nuestras instancias de EC2. Usar un agente de SSH es la mejor manera de autenticarse con recursos, ya que esto facilita la administración de claves:

ssh-agent bash 
ssh-add ~/.ssh/keypair.pem  

¡Eso es! Si siguió esto, puede probarlo utilizando el módulo ping y luego verá las instancias en ejecución que se han configurado para usar su clave respondiendo con pong:

ansible -m ping all
11.22.33.44 | success >> {
    "changed": false, 
    "ping": "pong"
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow