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.