Curso OpenStack en Emergya. Enero 2016
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.
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.
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.
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
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:
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] }
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
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/.