
Lançamos o fornecedor oficial Terraform para trabalhar com a Selectel. Este produto permite que os usuários implementem totalmente o gerenciamento de recursos por meio da metodologia Infraestrutura como código.
Atualmente, o provedor oferece suporte ao gerenciamento de recursos do
serviço Virtual Private Cloud (a seguir denominado VPC). No futuro, planejamos adicionar a ele o gerenciamento de recursos de outros serviços fornecidos pela Selectel.
Como você já sabe, o serviço VPC é baseado no OpenStack. No entanto, devido ao fato de o OpenStack não fornecer ferramentas nativas para atender à nuvem pública, implementamos a funcionalidade ausente em um conjunto de APIs adicionais que simplificam o gerenciamento de objetos compostos complexos e tornam o trabalho mais conveniente. Parte da funcionalidade disponível no OpenStack é fechada para uso direto, mas é acessível por meio de
nossa API .
O provedor Selectel Terraform agora oferece a capacidade de gerenciar os seguintes recursos de VPC:
- projetos e suas cotas;
- usuários, suas funções e tokens;
- sub-redes públicas, incluindo VRRP inter-regional;
- licenças de software.
O provedor usa nossa Go-library pública para trabalhar com a API da VPC. A biblioteca e o próprio fornecedor são de código aberto, estão sendo desenvolvidos no Github:
Para gerenciar outros recursos da nuvem, como máquinas virtuais, discos e clusters Kubernetes, você pode usar o provedor OpenStack Terraform. A documentação oficial para ambos os fornecedores está disponível nos seguintes links:
Introdução
Para começar, você precisa instalar o Terraform (instruções e links para pacotes de instalação podem ser encontrados no
site oficial ).
Para funcionar, o provedor exige a chave da API Selectel, criada no
painel de controle da conta .
Os manifestos para trabalhar com o Selectel são criados usando o Terraform ou usando um conjunto de exemplos prontos que estão disponíveis em nosso repositório do Github:
terraform-examples .
O repositório com exemplos é dividido em dois diretórios:
- módulos , contendo pequenos módulos reutilizáveis que recebem um conjunto de parâmetros como entrada e gerenciam um pequeno conjunto de recursos;
- exemplos , contendo exemplos de um conjunto completo de módulos interconectados.
Depois de instalar o Terraform, criar uma chave de API Selectel e familiarizar-se com exemplos, passamos a exemplos práticos.
Exemplo de criação de um servidor com um disco local
Considere o exemplo de criação de um projeto, um usuário com uma função e uma máquina virtual com um disco local:
terraform-examples / examples / vpc / server_local_root_disk .
O arquivo
vars.tf descreve todos os parâmetros que serão usados ao chamar os módulos. Alguns deles têm valores padrão, por exemplo, o servidor será criado na zona
ru-3a com a seguinte configuração:
variable "server_vcpus" { default = 4 } variable "server_ram_mb" { default = 8192 } variable "server_root_disk_gb" { default = 8 } variable "server_image_name" { default = "Ubuntu 18.04 LTS 64-bit" }
No arquivo
main.tf , o provedor Selectel é inicializado:
provider "selectel" { token = "${var.sel_token}" }
Este arquivo também contém o valor padrão para a chave SSH que será instalada no servidor:
module "server_local_root_disk" { ... server_ssh_key = "${file("~/.ssh/id_rsa.pub")}" }
Se necessário, você pode especificar uma chave pública diferente. A chave não precisa ser especificada como um caminho para o arquivo; você também pode adicionar um valor como uma sequência.
Ainda neste arquivo, os módulos
project_with_user e
server_local_root_disk são ativados, que gerenciam os recursos necessários.
Analisaremos esses módulos com mais detalhes.
Criando um projeto e usuário com uma função
O primeiro módulo cria um projeto e um usuário com uma função nesse projeto:
terraform-examples / modules / vpc / project_with_user .
O usuário criado poderá efetuar login no OpenStack e gerenciar seus recursos. O módulo é simples e gerencia apenas três entidades:
- selectel_vpc_project_v2,
- selectel_vpc_user_v2,
- selectel_vpc_role_v2.
Criando um servidor virtual com um disco local
O segundo módulo gerencia os objetos OpenStack necessários para criar um servidor com um disco local.
Você deve prestar atenção a alguns dos argumentos especificados neste módulo para o recurso
openstack_compute_instance_v2 :
resource "openstack_compute_instance_v2" "instance_1" { ... lifecycle { ignore_changes = ["image_id"] } vendor_options { ignore_resize_confirmation = true } }
O argumento
ignore_changes permite ignorar a alteração do atributo
id da imagem usada para criar a máquina virtual. No serviço VPC, a maioria das imagens públicas é atualizada automaticamente uma vez por semana e seu
ID também é alterado. Isso se deve aos recursos do componente OpenStack - Glance, no qual as imagens são consideradas entidades imutáveis.
Se um servidor ou disco existente for criado ou modificado, e usar o
ID da imagem pública como argumento
image_id , depois que essa imagem for atualizada, reiniciar o manifesto Terraform recriará o servidor ou o disco. O uso do argumento
ignore_changes evita essa situação.
Nota: o argumento ignore_changes apareceu no Terraform há muito tempo: pull # 2525 .O argumento
ignore_resize_confirmation é necessário para redimensionar com êxito o disco local, núcleos ou memória do servidor. Essas alterações são feitas através do componente OpenStack Nova usando a solicitação de
redimensionamento . Por padrão, o Nova após uma solicitação de
redimensionamento coloca o servidor no status
confirm_resize e aguarda confirmação adicional do usuário. No entanto, esse comportamento pode ser alterado para que o Nova não aguarde ações adicionais do usuário.
O argumento especificado permite que o Terraform não espere o status
confirm_resize do servidor e esteja preparado para que o servidor esteja no status ativo após alterar seus parâmetros. O argumento está disponível na versão 1.10.0 do provedor OpenStack Terraform:
pull # 422 .
Criação de recursos
Antes de iniciar manifestos, deve-se observar que, em nosso exemplo, dois provedores diferentes são lançados, e o provedor OpenStack depende dos recursos do provedor Selectel, pois é impossível gerenciar objetos pertencentes a ele sem criar um usuário no projeto. Infelizmente, pelo mesmo motivo, não podemos simplesmente executar o
comando terraform apply dentro do nosso exemplo. Primeiro, precisamos
solicitar o módulo
project_with_user e, depois, tudo o mais.
Nota: esse problema ainda não foi resolvido no Terraform, você pode acompanhar a discussão no Github na edição # 2430 e na edição # 4149 .Para criar recursos, iremos para o
diretório terraform-examples / examples / vpc / server_local_root_disk , seu conteúdo deve ser assim:
$ ls README.md main.tf vars.tf
Inicializamos os módulos usando o comando:
$ terraform init
A saída mostra que o Terraform baixa as versões mais recentes dos provedores usados e verifica todos os módulos descritos no exemplo.
Primeiro, aplique o módulo
project_with_user . Nesse caso, você precisa transferir manualmente os valores para variáveis que não foram definidas:
- sel_account com o número da sua conta Selectel;
- sel_token com sua chave para a API Selectel;
- user_password com senha para o usuário do OpenStack.
Os valores para as duas primeiras variáveis devem ser obtidos
no painel de controle .
Para a última variável, você pode pensar em qualquer senha.
Para usar o módulo, é necessário substituir os valores
SEL_ACCOUNT ,
SEL_TOKEN e
USER_PASSWORD executando o comando:
$ env \ TF_VAR_sel_account=SEL_ACCOUNT \ TF_VAR_sel_token=SEL_TOKEN \ TF_VAR_user_password=USER_PASSWORD \ terraform apply -target=module.project_with_user
Depois de executar o comando Terraform, ele mostrará quais recursos ele deseja criar e exigirá confirmação:
Plan: 3 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes
Depois que o projeto, usuário e função são criados, você pode começar a criar os recursos restantes:
$ env \ TF_VAR_sel_account=SEL_ACCOUNT \ TF_VAR_sel_token=SEL_TOKEN \ TF_VAR_user_password=USER_PASSWORD \ terraform apply
Ao criar recursos, preste atenção à saída do Terraform com um endereço IP externo no qual o servidor criado estará acessível:
module.server_local_root_disk.openstack_networking_floatingip_associate_v2.association_1: Creating... floating_ip: "" => "xxxx"
Você pode trabalhar com a máquina virtual criada via SSH no IP especificado.
Edição de recursos
Além de criar recursos através do Terraform, eles também podem ser modificados.
Por exemplo, aumente o número de núcleos e memória para nosso servidor alterando os valores para os
parâmetros server_vcpus e
server_ram_mb nos
exemplos / vpc / server_local_root_disk / main.tf :
- server_vcpus = "${var.server_vcpus}" - server_ram_mb = "${var.server_ram_mb}" + server_vcpus = 8 + server_ram_mb = 10240
Depois disso, verificamos quais alterações isso levará ao uso do seguinte comando:
$ env \ TF_VAR_sel_account=SEL_ACCOUNT \ TF_VAR_sel_token=SEL_TOKEN \ TF_VAR_user_password=USER_PASSWORD \ terraform plan
Como resultado, o Terraform fez alterações nos recursos
openstack_compute_instance_v2 e
openstack_compute_flavor_v2 .
Observe que isso resultará em uma reinicialização da máquina virtual criada.Para aplicar a nova configuração da máquina virtual, use o
comando terraform apply , que já executamos anteriormente.
Todos os objetos criados serão exibidos no
painel de controle da VPC :

Em nosso
repositório de exemplo, você também pode ver manifestos para criar máquinas virtuais com unidades de rede.
Exemplo de cluster Kubernetes
Antes de prosseguir para o próximo exemplo, limparemos os recursos criados anteriormente. Para fazer isso, na raiz do projeto
terraform-examples / examples / vpc / server_local_root_disk, execute o comando para excluir os objetos do OpenStack:
$ env \ TF_VAR_sel_account=SEL_ACCOUNT \ TF_VAR_sel_token=SEL_TOKEN \ TF_VAR_user_password=USER_PASSWORD \ terraform destroy -target=module.server_local_root_disk
Em seguida, execute o comando Limpeza de Objeto da API Selectel VPC:
$ env \ TF_VAR_sel_account=SEL_ACCOUNT \ TF_VAR_sel_token=SEL_TOKEN \ TF_VAR_user_password=USER_PASSWORD \ terraform destroy -target=module.project_with_user
Nos dois casos, você precisará confirmar a exclusão de todos os objetos:
Do you really want to destroy all resources? Terraform will destroy all your managed infrastructure, as shown above. There is no undo. Only 'yes' will be accepted to confirm. Enter a value: yes
O exemplo a seguir está no
diretório terraform-examples / examples / vpc / kubernetes_cluster .
Este exemplo cria um projeto, um usuário com uma função no projeto e gera um cluster Kubernetes. No arquivo
vars.tf ,
você pode ver os valores padrão, como o número de nós, suas características, versão do Kubernetes e mais.
Para criar recursos, da mesma forma que no primeiro exemplo, a primeira coisa que faremos é inicializar os módulos e criar os recursos do módulo
project_with_user e, em seguida, criar o restante:
$ terraform init $ env \ TF_VAR_sel_account=SEL_ACCOUNT \ TF_VAR_sel_token=SEL_TOKEN \ TF_VAR_user_password=USER_PASSWORD \ terraform apply -target=module.project_with_user $ env \ TF_VAR_sel_account=SEL_ACCOUNT \ TF_VAR_sel_token=SEL_TOKEN \ TF_VAR_user_password=USER_PASSWORD \ terraform apply
Passamos a criação e o gerenciamento de clusters Kubernetes por meio do componente OpenStack Magnum. Você pode aprender mais sobre como trabalhar com um cluster em um de nossos
artigos anteriores , bem como na
base de conhecimento .
Durante a preparação do cluster, discos, máquinas virtuais serão criadas e todos os componentes necessários serão instalados. A preparação leva cerca de 4 minutos, momento em que o Terraform exibe mensagens do formulário:
module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Still creating... (3m0s elapsed)
Após a conclusão da instalação, o Terraform informará que o cluster está pronto e exibirá seu identificador:
module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Creation complete after 4m20s (ID: 3c8...) Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
Para gerenciar o cluster Kubernetes criado por meio do utilitário kubectl,
você deve obter o arquivo de acesso ao cluster. Para fazer isso, acesse o projeto criado por meio do Terraform na lista de projetos em sua conta:

Em seguida, siga o link do formulário
xxxxxx.selvpc.ru , exibido abaixo do nome do projeto:

Use o nome de usuário e a senha que foram criados através do Terraform como informações de login. Se você não alterou
vars.tf ou
main.tf no nosso exemplo, o usuário terá o nome
tf_user . Como senha, use o valor da variável
TF_VAR_user_password , especificada quando a
aplicação de terraform foi executada anteriormente.
Dentro do projeto, você precisa ir para a guia
Kubernetes :

Aqui está um cluster criado por meio do Terraform. Você pode fazer o download do arquivo para o
kubectl na aba “Access”:

A mesma guia contém instruções para instalar o
kubectl e usar o
config.yaml baixado.
Após iniciar o
kubectl e definir a variável de ambiente
KUBECONFIG, você pode usar o Kubernetes:
$ kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-9578f5c87-g6bjf 1/1 Running 0 8m kube-system coredns-9578f5c87-rvkgd 1/1 Running 0 6m kube-system heapster-866fcbc879-b6998 1/1 Running 0 8m kube-system kube-dns-autoscaler-689688988f-8cxhf 1/1 Running 0 8m kube-system kubernetes-dashboard-7bdb5d4cd7-jcjq9 1/1 Running 0 8m kube-system monitoring-grafana-84c97bb64d-tc64b 1/1 Running 0 8m kube-system monitoring-influxdb-7c8ccc75c6-dzk5f 1/1 Running 0 8m kube-system node-exporter-tf-cluster-rz6nggvs4va7-minion-0 1/1 Running 0 8m kube-system node-exporter-tf-cluster-rz6nggvs4va7-minion-1 1/1 Running 0 8m kube-system openstack-cloud-controller-manager-8vrmp 1/1 Running 3 8m prometeus-monitoring grafana-76bcb7ffb8-4tm7t 1/1 Running 0 8m prometeus-monitoring prometheus-75cdd77c5c-w29gb 1/1 Running 0 8m
O número de nós do cluster é facilmente alterado via Terraform.
O seguinte valor é especificado no arquivo
main.tf :
cluster_node_count = "${var.cluster_node_count}"
Este valor é substituído por vars.tf :
variable "cluster_node_count" { default = 2 }
Você pode alterar o valor padrão em
vars.tf ou especificar o valor necessário diretamente em
main.tf :
- cluster_node_count = "${var.cluster_node_count}" + cluster_node_count = 3
Para aplicar as alterações, como no caso do primeiro exemplo, use o
comando terraform apply :
$ env \ TF_VAR_sel_account=SEL_ACCOUNT \ TF_VAR_sel_token=SEL_TOKEN \ TF_VAR_user_password=USER_PASSWORD \ terraform apply
Quando o número de nós for alterado, o cluster permanecerá disponível. Depois de adicionar um nó via Terraform, você pode usá-lo sem configuração adicional:
$ kubectl get nodes NAME STATUS ROLES AGE VERSION tf-cluster-rz6nggvs4va7-master-0 Ready,SchedulingDisabled master 8m v1.12.4 tf-cluster-rz6nggvs4va7-minion-0 Ready <none> 8m v1.12.4 tf-cluster-rz6nggvs4va7-minion-1 Ready <none> 8m v1.12.4 tf-cluster-rz6nggvs4va7-minion-2 Ready <none> 3m v1.12.4
Conclusão
Neste artigo, aprendemos sobre as maneiras básicas de trabalhar com a
"Nuvem privada virtual" por meio do Terraform. Teremos o maior prazer em usar o fornecedor oficial Terraform Selectel e fornecer feedback.
Todos os erros encontrados no provedor Terraform Selectel podem ser relatados nos
Problemas do Github .