Como Administrar OpenStack con Ansible y Python: desde lo básico a avanzado

Howto Administrar Openstack con Ansible y/o Python

Nota: Recuerda que los ejemplo debe completarlos y ajustarlo a tus necesidades

OpenStack es una plataforma de computación en la nube de código abierto que permite a las empresas y organizaciones gestionar y aprovisionar recursos de infraestructura. Ansible es una herramienta de automatización de TI que facilita la administración de sistemas y aplicaciones. Python es un lenguaje de programación versátil y potente que se utiliza ampliamente en la industria de la tecnología. En este artículo, exploraremos cómo administrar OpenStack utilizando Ansible y Python, proporcionando ejemplos funcionales de uso diario desde lo básico hasta lo avanzado.

Paso 1: Instalar y configurar Ansible Antes de comenzar, es necesario instalar Ansible en la máquina de control. Puede hacerlo utilizando el gestor de paquetes de su sistema operativo, como apt o apt-get en Ubuntu & yum o dnf en Red Hat:

#Comando para el gestor de paquetes en Debian:

sudo apt-get update
sudo apt-get install ansible

#Comando para el gestor de paquetes derivados de Red Hat:

sudo dnf install ansible
ansible --version
Configuración de Ansible

Una vez instalado, configure un archivo de inventario de Ansible una opcion es (/etc/ansible/hosts) o el directorio de trabajo actual con la información de conexión de su servidor OpenStack. luego hablaremos sobre los inventarios dinámicos

mail.example.com

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com

Paso 2: Instalar y configurar el SDK de OpenStack para Python Para interactuar con la API de OpenStack, necesitamos instalar el SDK de OpenStack para Python. Esto se puede hacer utilizando pip:

pip install openstacksdk

Después de instalar el SDK, cree un archivo de configuración de conexión (clouds.yaml) que contenga sus credenciales de OpenStack:

clouds:
  my_openstack:
    auth:
      username: 'my_username'
      password: 'my_password'
      project_name: 'my_project'
      auth_url: 'https://my_openstack_auth_url/v3'
    region_name: 'my_region'

Paso 3: Crear un playbook de Ansible para administrar OpenStack Con Ansible y el SDK de OpenStack instalados y configurados, podemos crear un playbook de Ansible para administrar OpenStack. A continuación, se muestra un ejemplo básico que crea una instancia de OpenStack:

---
- name: Crear instancia en OpenStack
  hosts: localhost
  tasks:
    - name: Crear instancia
      os_server:
        cloud: my_openstack
        state: present
        name: my_instance
        image: 'my_image_id'
        flavor: 'my_flavor_id'
        key_name: 'my_keypair'

Paso 4: Ejecutar el playbook de Ansible Ejecute el playbook de Ansible utilizando el siguiente comando:

ansible-playbook my_openstack_playbook.yml

Esto creará una instancia en OpenStack utilizando la información proporcionada en el playbook y las credenciales del archivo clouds.yaml.

Paso 5: Automatizar tareas avanzadas de OpenStack Puede extender el playbook para realizar tareas más avanzadas, como agregar redes y volúmenes a las instancias, configurar la seguridad y el equilibrio de carga, y administrar otros servicios de OpenStack. Por ejemplo, para agregar una red a una instancia, puede agregar el siguiente fragmento al playbook:

- name: Añadir red a la instancia
  os_server_interface:
    cloud: my_openstack
    server: my_instance
    network: 'my_network_id'
    state: present

A continuación, se muestra un ejemplo en Python y Ansible para crear una instancia llamada "Instancia de prueba":
from openstack import connection

# Conexión a OpenStack
conn = connection.from_config(cloud="my_openstack")

# Crear instancia
instance_name = "Instancia de prueba"
image_id = "my_image_id"
flavor_id = "my_flavor_id"
keypair_name = "my_keypair"
network_id = "my_network_id"

instance = conn.create_server(name=instance_name, image=image_id, flavor=flavor_id,
key_name=keypair_name, networks=[{"uuid": network_id}])

print(f"Instancia creada: {instance.name}")
Este es su homologo en Ansible (ejemplo de como crear una instancia llamada instancia de prueba)

Ejemplo en Ansible:

---
- name: Crear instancia de prueba en OpenStack
  hosts: localhost
  tasks:
    - name: Crear instancia
      os_server:
        cloud: my_openstack
        state: present
        name: Instancia de prueba
        image: 'my_image_id'
        flavor: 'my_flavor_id'
        key_name: 'my_keypair'
        networks:
          - uuid: 'my_network_id'

Estos ejemplos demuestran cómo crear una instancia llamada "Instancia de prueba" utilizando Python y Ansible. Al utilizar estas herramientas y seguir los pasos descritos en este artículo, podrás administrar OpenStack de manera eficiente y efectiva.

A continuación, se muestra cómo crear un volumen de 10 GB en OpenStack utilizando Python y Ansible. Asumiremos valores específicos para "my_image_id", "my_flavor_id", "my_keypair" y "my_network_id" en ambos ejemplos.

Ejemplo en python:
from openstack import connection

# Conexión a OpenStack
conn = connection.from_config(cloud="my_openstack")

# Crear volumen
volume_name = "Volumen de prueba"
volume_size = 10 # Tamaño en GB

volume = conn.create_volume(size=volume_size, name=volume_name)

print(f"Volumen creado: {volume.name}, tamaño: {volume.size} GB")

Ejemplo en Ansible:

---
- name: Crear volumen de prueba en OpenStack
  hosts: localhost
  tasks:
    - name: Crear volumen
      os_volume:
        cloud: my_openstack
        state: present
        display_name: Volumen de prueba
        size: 10 # Tamaño en GB

Los dos  ejemplos anteriores, demuestran cómo crear un volumen de 10 GB llamado "Volumen de prueba" utilizando Python y Ansible. Puedes adaptar estos ejemplos a tus necesidades específicas ajustando los valores de "volume_name" y "volume_size".

A continuación, muestro ejemplos de cómo listar las instancias, volúmenes y redes existentes en OpenStack utilizando Python y Ansible.

Ejemplo en python:

from openstack import connection

# Conexión a OpenStack
conn = connection.from_config(cloud="my_openstack")

# Listar instancias
print("Instancias:")
for server in conn.list_servers():
    print(f"- {server.name}")

# Listar volúmenes
print("\nVolúmenes:")
for volume in conn.list_volumes():
    print(f"- {volume.name}")

# Listar redes
print("\nRedes:")
for network in conn.list_networks():
    print(f"- {network.name}")

El mismo ejemplo anterior de como listar los volúmenes, redes e instancias pero con ejemplo en Ansible:

---
- name: Listar instancias, volúmenes y redes en OpenStack
  hosts: localhost
  tasks:
    - name: Obtener instancias
      os_server_facts:
        cloud: my_openstack
      register: server_facts

    - name: Imprimir instancias
      debug:
        msg: "{{ server_facts.openstack_servers | map(attribute='name') | list }}"

    - name: Obtener volúmenes
      os_volume_facts:
        cloud: my_openstack
      register: volume_facts

    - name: Imprimir volúmenes
      debug:
        msg: "{{ volume_facts.volumes | map(attribute='display_name') | list }}"

    - name: Obtener redes
      os_networks_facts:
        cloud: my_openstack
      register: network_facts

    - name: Imprimir redes
      debug:
        msg: "{{ network_facts.ansible_facts.openstack_networks | map(attribute='name') | list }}"

Estos ejemplos demuestran cómo listar las instancias, volúmenes y redes existentes en OpenStack utilizando Python y Ansible. Puedes adaptar estos ejemplos para filtrar o mostrar información adicional según tus necesidades específicas.

La combinación de OpenStack, Ansible y Python ofrece una solución potente y flexible para administrar infraestructuras en la nube. Mediante el uso de playbooks de Ansible y el SDK de OpenStack para Python, se pueden automatizar y simplificar tareas complejas de administración de OpenStack, desde la creación y configuración de instancias hasta la gestión de redes, volúmenes y otros servicios.

Cuidado con el indexado de ansible y pyhton, puesto que copiando y pegando puede distorsionarlo y no funcionar los ejemplos, por favor, debes corrígelo en caso que suceda.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *