7 minute read

Originally published at Churrops on DevOps on November 26, 2017.

Olá pessoal, vamos começar uma uma série de artigos sobre OpenStack dando continuidade aos artigos sobre Terraform (parte 1 e parte 2) do Rodrigo Floriano, pois é uma ferramenta que vários assíduos do blog já conhecem e usam a diário!

Hoje vamos mostrar um exemplo prático de uso da ferramenta sobre OpenStack.

OpenStack é um software de código aberto para a instalação, configuração e gerenciamento de nuvens, tanto públicas como privadas. Rackspace e Dreamhost são alguns exemplos de nuvens públicas que funcionam sobre OpenStack, e PayPal e eBay são exemplos de empresas que usam OpenStack nas suas nuvens privadas.

OpenStack apresenta seus serviços através de APIs compatíveis com os serviços EC2, S3 e CloudFormation da Amazon AWS e, portanto, aplicações escritas para estes serviços do AWS podem ser usados com OpenStack também. Além disso, podemos interagir com OpenStack via CLI, usando o comando openstack, ou pelo dashboard da plataforma, o Horizon.

Sem mais, vamos la!

Pré requisitos

Clonando o repósitorio

$ git clone https://github.com/josecastillolema/churrops.git

Segue uma breve descrição dos arquivos:

  • live.tf Arquivo principal, é um template com as informações do provider (neste caso OpenStack) e a topologia dos recursos que vão ser criados. No primeiro bloco definimos as credencias de acesso a nossa nuvem OpenStack:
    provider "openstack" {
       user_name   = "jose.castillo"
       tenant_name = "churrops"
       tenant_id   = "ddc494sdfc8bc6ba7caf6d3615b"
       password    = "password"
       auth_url    = "https://keystone.openstack.com.br:5000/v2.0"
    }
    

    Para conseguir o tenant_id do projeto churrops (o id do nosso projeto) basta executar openstack project show churrops ou openstack project list | grep churrops (ou pegar os dados via o dashboard de OpenStack, Horizon).

    No segundo bloco definimos alguns valores que vamos usar no projeto, como a imagem (neste caso Ubuntu), a chave (caso precisemos acessar por ssh a instância), o flavor, as redes, etc. Este bloco não é obrigatório, mas pode facilitar a nossa vida quando trabalhemos com um número maior de instâncias. Neste exemplo estamos usando o security group padrão do OpenStack (a porta 80 precisa estar aberta), mas de forma muito direta poderíamos criar um recurso de tipo security group personalizado para o nosso servidor web. O site da Terraform mostra todos os recursos que temos disponíveis para OpenStack.

    variable "defaults" {
       description = "Variaveis do projeto"
       type = "map"
       default {
          image_name = "linux-ubuntu-16-64b-base"
          az_name = "nova"
          region = "SP"
          tenant_name = "churrops"
          key_pair = "chave"
          flavor_name = "g1.micro"
          security_group = "default"
          network_name = "rede-interna"
       }
    }
    

    No terceiro bloco definimos o nosso servidor web. Na variável user_data apontamos para outro arquivo do exemplo, que vai ser executado via cloud-init no primeiro boot para configurar o servidor web.

    resource "openstack_compute_instance_v2" "web" {
       name = "web"
       image_name = "${var.defaults["image_name"]}"
       flavor_name = "${var.defaults["flavor_name"]}"
       availability_zone = "${var.defaults["az_name"]}"
       key_pair = "${var.defaults["key_pair"]}"
       security_groups = ["${var.defaults["security_group"]}"]
       network {
          name = "${var.defaults["network_name"]}"
       }
       user_data = "${file("bootstrapweb.sh")}"
       lifecycle {
          create_before_destroy = true
       }
    }
    

    Por último, os restantes blocos associam uma IP pública ao nosso servidor web:

    resource "openstack_networking_floatingip_v2" "ip-publica" {
       pool = "rede-publica"
    }
    
    resource "openstack_compute_floatingip_associate_v2" "asoc-ip-publica" {
       floating_ip = "${openstack_networking_floatingip_v2.ip-publica.address}"
       instance_id = "${openstack_compute_instance_v2.web.id}"
    }
    
  • output.tf Retorna o IP público da instância do nosso servidor web.

  • bootstrapweb.sh

Arquivo de shell que vai ser executado via cloud-init no primeiro boot para configurar o servidor web. Esta versão é para SOs de tipo Debian, mas pode ser fácilmente modificada para funcionar em CentOS e derivados.

Fazendo o deploy

$ terraform init

$ terraform plan
$ terraform apply

Se tudo der certo, veremos a nova VM com a sua IP pública correspondente:

E conseguimos acessar ao nosso site:

Outros comandos

O resto dos comandos que foram explicados no caso da AWS, terraform graph, terraform show e terraform destroy funcionam de forma idêntica em OpenStack.

Conclusão

Terraform se integra muito bem com vários provedores de nuvem, incluíndo OpenStack! Neste artigo vimos como é simples integrar OpenStack com a ferramenta, e como a mesma funciona de forma coerente entre várias nuvens.

Nos próximos artigos de OpenStack falaremos sobre heat, o “terraform” nativo da plataforma, e veremos como é simples também gerenciar o ciclo de vida de hardware e software usando o orquestrador nativo da nuvem.

Obrigado a todos e um abraço!

Comments