Olá pessoal, vamos começar uma série de artigos sobre Heat, o “terraform” nativo do OpenStack, ou para quem vem do mundo da AWS, o CloudFormation do OpenStack (inclusive parcialmente compatível). Neste primeiro artigo introdutório vamos aprender a criar as nossas próprias pilhas (ou stacks) e recriar a instância do servidor web que criamos no post passado usando o Terraform.
O objetivo principal de Heat é criar um serviço para gerenciar todo o ciclo de vida de infra e aplicativos dentro do OpenStack. Ele implementa um mecanismo de orquestração com base em templates na forma de arquivos de texto (em formato .yaml) que podem ser tratados como código. O formato dos templates está evoluindo a cada versão do OpenStack, mas o Heat se esforça para fornecer compatibilidade com o formato do modelo AWS CloudFormation, de modo que muitos modelos CloudFormation existentes podem ser iniciados no OpenStack (inclusive permitindo, por exemplo, escalar do OpenStack para dentro da AWS). Para quem tiver interesse, existe também um esforço da comunidade para suportar templates TOSCA (https://wiki.openstack.org/wiki/Heat-Translator).
O Heat fornece uma API REST nativa do OpenStack e uma API de consulta compatível com o CloudFormation, além de interface gráfica via Horizon (o dashboard de OpenStack) e um cliente para a linha de comandos (antigamente heat
, nas versões mais novas de OpenStack foi integrado no próprio comando openstack
).
Uma característica importante do Heat é que ele gerencia todo o ciclo de vida do aplicativo, e não só a criação. Quando precisar alterar a infra, simplesmente modifique o modelo e use o Heat para atualizar sua pilha existente. Heat sabe como fazer as mudanças necessárias. Ele irá excluir todos os recursos quando você terminar o aplicativo também (tipo terraform destroy
).
Os recursos de infra que podem ser descritos incluem: servidores, ips públicos, volumes, grupos de segurança, usuários, roteadores, etc. Os modelos também podem especificar as relações entre recursos (por exemplo, este volume está conectado a este servidor). Isso permite que o Heat invoque as APIs do OpenStack para criar toda sua infra virtual na ordem correta para iniciar completamente sua aplicação.
O Heat também se integra com o Ceilometer, o módulo de telemetria do OpenStack, permitindo definir políticas de uso de autoscaling em função do uso dos recursos (chegaremos lá nos próximos artigos!).
O Heat gerencia principalmente a infra virtual, mas os modelos se integram bem com ferramentas de gerenciamento de configuração de software, como Puppet e Chef, e a equipe do Heat está trabalhando para fornecer uma integração ainda melhor entre infraestrutura e software. Existem várias opções para configurar o software que é executado nos servidores do stack:
- Criar uma imagem personalizada (de preferência usando diskimager-builder)
- Via cloud-init, um script que é executado durante o primeiro boot. Esta será a forma que usaremos ao longo dos artigos.
- Um recurso do heat, de tipo software deployment
Sem mais, vamos criar o nosso primeiro stack e recriar o nosso servidor web.
>> Pré requisitos
- Uma conta em alguma nuvem OpenStack, não necessariamente admin
- Quota suficiente na nossa conta para instanciar os recursos solicitados
No repositório https://github.com/josecastillolema/churrops.git podem fazer download do arquivo heat.yaml, o template que usaremos durante este artigo.
>> Descrição do template
As duas primeras linhas mostram a versão em uso do formato do template e uma descrição do conteúdo do mesmo:
heat_template_version: 2016-04-08 description: Servidor web para churrops!
A seguir, o primeiro bloco do template, parameters
, define uma série de parâmetros que serão usados durante o deployment da infra (de forma análoga ao bloco variable
no caso do Terraform). Podemos definir neste bloco imagem, flavor, redes, chaves para acessar aos nossos servidores, etc. Para cada parâmetro definido podemos adicionar uma descrição e um valor padrão.
parameters: flavor: type: string description: Flavor para o servidor web constraints: - custom_constraint: nova.flavor default: g1.micro image: type: string description: Imagem para o servidor web constraints: - custom_constraint: glance.image default: linux-ubuntu-16-64b-base private_network: type: string description: Rede interna constraints: - custom_constraint: neutron.network default: net-int1 private_ip: type: string description: IP interna do servidor default: 10.0.0.200 key_name: type: string description: A chave ssh para acessar a nossa vm constraints: - custom_constraint: nova.keypair default: devel public_network: type: string description: Rede publica constraints: - custom_constraint: neutron.network texto: type: string description: Texto exibido no site default: "Churrops rules"
No segundo bloco, resources
, é a onde vamos definir os recursos da nossa infra. Neste caso vamos definir o nosso servidor web. Podem consultar uma lista de todos os recursos disponíveis aqui. O servidor web é configurado via cloud-init no primeiro boot. Vejam que é possível passar parâmetros para os recursos, como neste caso o parâmetro texto
.
resources: sec_group: type: OS::Neutron::SecurityGroup properties: rules: - remote_ip_prefix: 0.0.0.0/0 protocol: icmp - remote_ip_prefix: 0.0.0.0/0 protocol: tcp port_range_min: 80 port_range_max: 80 - remote_ip_prefix: 0.0.0.0/0 protocol: tcp port_range_min: 22 port_range_max: 22 serverweb_port: type: OS::Neutron::Port properties: network_id: { get_param: private_network } security_groups: [{ get_resource: sec_group }] serverweb: type: OS::Nova::Server properties: image: { get_param: image } flavor: { get_param: flavor } networks: - port: { get_resource: serverweb_port } user_data_format: RAW key_name: { get_param: key_name } user_data: str_replace: template: | #!/bin/bash sudo -i apt-get update apt-get install -y apache2 cat < /var/www/html/index.html Churrops!!! o/ hostname: $(hostname) parametro: TEXTO EOF params: TEXTO: { get_param: texto } floating_ip: type: OS::Neutron::FloatingIP properties: floating_network: { get_param: public_network } port_id: { get_resource: serverweb_port }
O terceiro e ultimo bloco, outputs
, tem uma função análoga ao arquivo output.tf
do Terraform. Ele define uma saída que será mostrada ao usuário ao terminar a criação da infra.
outputs: lburl: description: URL do servidor web value: str_replace: template: http://IP_ADDRESS params: IP_ADDRESS: { get_attr: [ floating_ip, floating_ip_address ] } description: > Esta URL e a URL "externa" que pode ser usada para acessar o servidor WEB.
>> Execução do template
- Via Horizon
Primeiro, na aba Orquestration - Stacks
criamos o nosso stack e setamos os parâmetros opcionais que foram definidos no template.
A continuação podemos ver a topologia diversos recursos sendo criados (os recursos em verde já estão disponíveis).
Um overview da nossa pilha, com o output que definimos no template.
Os recursos que estão sendo criados.
E por último todos os eventos relacionados com esses recursos (criação, atualização, modificação, deleção, etc.).
- Usando o comando openstack
Criação:
openstack stack create churrops-stack -t heat.yaml
Para acompanhar a criação:
watch openstack stack event list churrops-stack
- Via API REST
Como falamos na introdução, o Heat fornece uma API REST nativa do OpenStack e uma API de consulta compatível com o CloudFormation. Neste caso usaremos a API REST nativa.
>> Resultado da execução
Independentemente do método escolhido (Horizon, CLI ou API REST), uma vez que o stack transicione ao estado created (não deveria demorar muito mais de 2 minutos) poderemos ver a infra instanciada.
Em alguns minutos (enquanto cloud-init instala e configura o apache), poderemos acessar ao nosso servidor pela IP pública.
>> Conclusão
Neste artigo introduzimos o Heat, o orquestrador do OpenStack. Vimos como mantém todas as funcionalidades de outros IaCs, como Terraform, mas é integrado de uma forma mais nativa no OpenStack e podemos accesá-lo via dashboard, linha de comandos ou API REST (compatível com a AWS CloudFormation).
Nos próximos artigos veremos como criar via Heat um balanceador de carga em alta disponibilidade usando haproxy e VRRP.
Um abraço!
07/08/2018 at 3:50 pm
Sensacional muito bom.
CurtirCurtir