Introducción a heat

Heat es el componente de Openstack encargado de la orquestación. Mediante un template podemos automatizar el despliegue de un escenario formado por distintos recursos (instancias, volúmenes, redes, routers, …) y establecer las relaciones entre ellos.

La sintaxis estándar de los templates llamada HOT usa el lenguaje YAML, aunque también podríamos utilizar la sintaxis en JSON.

Estructura de un template

Pongamos un ejemplo sencillo:

heat_template_version: 2013-05-23		

description: Simple template to deploy a single compute instance
parameters:
  network:
    type: string
description: Nombre de la red a utilizar
default: red_por_defecto		

resources:
  my_instance:
    type: OS::Nova::Server
properties:
  key_name: clave_ssh
  image: Debian Jessie (stable)
  flavor: m1.small
  networks: [{get_param: network}]		

outputs:
  instance_ip:
    description: IP address of the instance
value: { get_attr: [my_instance, first_address] }

En el ejemplo anterior el usuario tiene que indicar como parámetro la red a la que se va a conectar la instancia. Vamos a crear un recurso que es una instancia con unas características indicadas en el template y por último vamos a mostrar al usuario la dirección IP de la instancia.

Sección de parámetros (parameters)

Como hemos dicho antes en esta sección definimos los parámetros de entrada, que serán proporcionados al inicializar el template. Estos parámetros se usan para personalizar cada despliegue, o para utilizar los parámetros en el entorno del despliegue.

Podemos restringir los valores que el usuario puede introducir en los parámetros de entrada utilizando la sección “constraints”, por ejemplo:

parameters:
  image:
  type: string
description: Image ID or image name to use for the server4
default: Debian Jessie (stable)
constraints:
  - allowed_values: 
    - Debian Jessie (stable)
    - Fedora 20

Para más información sobre la sección de parámetros puedes mirar la página http://docs.openstack.org/developer/heat/template_guide/hot_spec.html#parameters-section.

Sección de recursos (resources)

La sección “Resources” define los recursos que componen un stack o “pila” desplegada desde el template. Tenemos distintos tipos de recursos. Los recursos se definen indicando los siguientes datos:

Aquí tenemos un ejemplo en el que vemos las propiedades más usadas como el nombre, la clave ssh, la imagen a utilizar, el sabor, si queremos crear un usuario, redes.

resources:
    Instancia_de_prueba:
        type: OS::Nova::Server
        properties:
            name: Debian
            key_name: {get_param: key_name}
            image: {get_param: image}
            flavor: {get_param: flavor}
            admin_user: {get_param: user_name}
            networks: [{"network":"red1"}]

Aquí podemos ver un ejemplo de dependencia:

resources:
  server1:
    type: OS::Nova::Server
depends_on: [ server2, server3 ]		

  server2:
    type: OS::Nova::Server		

  server3:
    type: OS::Nova::Server

Intrinsic functions

Existen diversas funciones que pueden ser utilizadas para obtener valores de atributos de los recursos del template. Aquí tenemos una lista de algunas de las funciones disponibles:

get_attr

La función get_attr hace referencia a un atributo de un recurso.

La sintaxis de la función es la siguiente:

Un ejemplo del uso de la función get_attr:

resources:
   my_instance:
   type: OS::Nova::Server
 # ...		

outputs:
  instance_ip:
    description: IP address of the deployed compute instance
  	value: { get_attr: [my_instance, first_address] }
  instance_private_ip:
    description: Private IP address of the deployed compute instance
value: { get_attr: [my_instance, networks, private, 0] }

get_file

La función get_file obtiene el contenido de un fichero. Se suele usar como mecanismo de inclusión de ficheros de configuración, scripts, etc. El argumento puede ser representado como ruta estática como absoluta.

Aquí tenemos el ejemplo:

resources:
  my_instance:
    type: OS::Nova::Server
properties:
    # general properties ...
  user_data:
    get_file: my_instance_user_data.sh

get_param

La función get_param nos permite obtener los datos que hemos indicado en la sección parámetros del template. Obtiene el valor y lo asigna en la ejecución del template. Utilizar esta función y la sección “parameters” adecuadamente nos puede facilitar las cosas en diferentes despliegues. Ejemplo:

resources:
    Instancia_de_prueba:
        type: OS::Nova::Server
        properties:
            name: Debian
            key_name: {get_param: key_name}
            image: {get_param: image}
            flavor: {get_param: flavor}
            admin_user: {get_param: user_name}
            networks: [{"network":"red1"}]

Para más información de heat tienes a tu disposición la documentación oficial: http://docs.openstack.org/developer/heat/template_guide/.