Pesquisa de site

Use o Terraform para gerenciar um cluster OpenStack


Terraform é uma linguagem declarativa que pode atuar como um modelo da infraestrutura na qual você está trabalhando.

Depois de ter um laboratório doméstico e de produção do OpenStack por um tempo, posso dizer com certeza que provisionar uma carga de trabalho e gerenciá-la da perspectiva do administrador e do locatário é importante.

Terraform é uma ferramenta de software de infraestrutura como código (IaC) de código aberto usada para provisionar redes, servidores, plataformas em nuvem e muito mais. Terraform é uma linguagem declarativa que pode atuar como um modelo da infraestrutura na qual você está trabalhando. Você pode gerenciá-lo com Git, e ele tem um forte caso de uso de GitOps.

Este artigo aborda os fundamentos do gerenciamento de um cluster OpenStack usando Terraform. Eu recrio o projeto OpenStack Demo usando Terraform.

Instale o Terraform

Eu uso o CentOS como host de salto, onde executo o Terraform. Com base na documentação oficial, o primeiro passo é adicionar o repositório Hashicorp:

$ sudo dnf config-manager \
--add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo

Em seguida, instale o Terraform:

$ sudo dnf install terraform -y

Verifique a instalação:

$ terraform –version

Se você vir um número de versão em troca, você instalou o Terraform.

Crie um script Terraform para o provedor OpenStack

No Terraform, você precisa de um provedor. Um provedor é um conversor que o Terraform chama para converter seu .tf em chamadas de API para a plataforma que você está orquestrando.

Existem três tipos de fornecedores: Oficial, Parceiro e Comunitário:

  • Os fornecedores oficiais são mantidos pela Hashicorp.
  • Os provedores parceiros são mantidos por empresas de tecnologia parceiras da Hashicorp.
  • Os provedores da comunidade são mantidos por membros da comunidade de código aberto.

Há um bom provedor comunitário para OpenStack neste link. Para usar este provedor, crie um arquivo .tf e chame-o de main.tf.

$ vi main.tf

Adicione o seguinte conteúdo a main.tf:

terraform {
  required_version = ">= 0.14.0"
  required_providers {
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "1.49.0"
    }
  }
}

provider "openstack" {
  user_name   = “OS_USERNAME”
  tenant_name = “OS_TENANT”
  password    = “OS_PASSWORD”
  auth_url    = “OS_AUTH_URL”
  region      = “OS_REGION”
}

Você precisa alterar OS_USERNAME, OS_TENANT, OS_PASSWORD, OS_AUTH_URL e OS_REGION variáveis para que funcione.

Crie um arquivo Admin Terraform

Os arquivos OpenStack Admin concentram-se no provisionamento de redes externas, roteadores, usuários, imagens, perfis de locatários e cotas.

Este exemplo provisiona sabores, um roteador conectado a uma rede externa, uma imagem de teste, um perfil de locatário e um usuário.

Primeiro, crie um diretório AdminTF para os recursos de provisionamento:

$ mkdir AdminTF

$ cd AdminTF

No main.tf, adicione o seguinte:

terraform {
  required_version = ">= 0.14.0"
  required_providers {
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "1.49.0"
    }
  }
}

provider "openstack" {
  user_name   = “OS_USERNAME”
  tenant_name = “admin”
  password    = “OS_PASSWORD”
  auth_url    = “OS_AUTH_URL”
  region      = “OS_REGION”
}

resource "openstack_compute_flavor_v2" "small-flavor" {
  name      = "small"
  ram       = "4096"
  vcpus     = "1"
  disk      = "0"
  flavor_id = "1"
  is_public = "true"
}

resource "openstack_compute_flavor_v2" "medium-flavor" {
  name      = "medium"
  ram       = "8192"
  vcpus     = "2"
  disk      = "0"
  flavor_id = "2"
  is_public = "true"
}

resource "openstack_compute_flavor_v2" "large-flavor" {
  name      = "large"
  ram       = "16384"
  vcpus     = "4"
  disk      = "0"
  flavor_id = "3"
  is_public = "true"
}

resource "openstack_compute_flavor_v2" "xlarge-flavor" {
  name      = "xlarge"
  ram       = "32768"
  vcpus     = "8"
  disk      = "0"
  flavor_id = "4"
  is_public = "true"
}

resource "openstack_networking_network_v2" "external-network" {
  name           = "external-network"
  admin_state_up = "true"
  external       = "true"
  segments {
    network_type     = "flat"
    physical_network = "physnet1"
  }
}

resource "openstack_networking_subnet_v2" "external-subnet" {
  name            = "external-subnet"
  network_id      = openstack_networking_network_v2.external-network.id
  cidr            = "10.0.0.0/8"
  gateway_ip      = "10.0.0.1"
  dns_nameservers = ["10.0.0.254", "10.0.0.253"]
  allocation_pool {
    start = "10.0.0.1"
    end   = "10.0.254.254"
  }
}

resource "openstack_networking_router_v2" "external-router" {
  name                = "external-router"
  admin_state_up      = true
  external_network_id = openstack_networking_network_v2.external-network.id
}

resource "openstack_images_image_v2" "cirros" {
  name             = "cirros"
  image_source_url = "https://download.cirros-cloud.net/0.6.1/cirros-0.6.1-x86_64-disk.img"
  container_format = "bare"
  disk_format      = "qcow2"

  properties = {
    key = "value"
  }
}

resource "openstack_identity_project_v3" "demo-project" {
  name = "Demo"
}

resource "openstack_identity_user_v3" "demo-user" {
  name               = "demo-user"
  default_project_id = openstack_identity_project_v3.demo-project.id
  password = "demo"
}

Criar um arquivo Terraform de locatário

Como locatário, você geralmente cria VMs. Você também cria grupos de rede e de segurança para as VMs.

Este exemplo usa o usuário criado acima pelo arquivo Admin.

Primeiro, crie um diretório TenantTF para provisionamento relacionado ao Tenant:

$ mkdir TenantTF
$ cd TenantTF

No main.tf, adicione o seguinte:

terraform {
  required_version = ">= 0.14.0"
  required_providers {
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "1.49.0"
    }
  }
}

provider "openstack" {
  user_name   = “demo-user”
  tenant_name = “demo”
  password    = “demo”
  auth_url    = “OS_AUTH_URL”
  region      = “OS_REGION”
}

resource "openstack_compute_keypair_v2" "demo-keypair" {
  name       = "demo-key"
  public_key = "ssh-rsa ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
}


resource "openstack_networking_network_v2" "demo-network" {
  name           = "demo-network"
  admin_state_up = "true"
}

resource "openstack_networking_subnet_v2" "demo-subnet" {
  network_id = openstack_networking_network_v2.demo-network.id
  name       = "demo-subnet"
  cidr       = "192.168.26.0/24"
}

resource "openstack_networking_router_interface_v2" "demo-router-interface" {
  router_id = “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”
  subnet_id = openstack_networking_subnet_v2.demo-subnet.id
}

resource "openstack_compute_instance_v2" "demo-instance" {
  name            = "demo"
  image_id        = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
  flavor_id       = "3"
  key_pair        = "demo-key"
  security_groups = ["default"]

  metadata = {
    this = "that"
  }

  network {
    name = "demo-network"
  }
}

Inicialize seu Terraform

Depois de criar os arquivos do Terraform, você precisa inicializar o Terraform.

Para administrador:

$ cd AdminTF

$ terraform init

$ terraform fmt

Para inquilinos:

$ cd TenantTF

$ terraform init

$ terraform fmt

Explicação do comando:

  • terraform init baixa o provedor do registro para usar no provisionamento deste projeto.
  • terraform fmt formata os arquivos para uso em repositórios.

Crie um plano Terraform

A seguir, crie um plano para você ver quais recursos serão criados.

Para administrador:

$ cd AdminTF

$ terraform validate

$ terraform plan

Para inquilinos:

$ cd TenantTF

$ terraform validate

$ terraform plan

Explicação do comando:

  • terraform valid valida se a sintaxe .tf está correta.
  • terraform plan cria um arquivo de plano no cache onde todos os recursos gerenciados podem ser rastreados na criação e destruição.

Aplique seu primeiro TF

Para implantar os recursos, use o comando terraform apply. Este comando aplica todos os estados de recursos no arquivo de plano.

Para administrador:

$ cd AdminTF

$ terraform apply

Para inquilinos:

$ cd TenantTF

$ terraform apply

Próximos passos

Anteriormente, escrevi um artigo sobre como implantar um cluster OpenStack mínimo em um Raspberry Pi. Você pode descobrir como ter configurações mais detalhadas do Terraform e Ansible e implementar alguns CI/CD com GitLab.

Artigos relacionados: