
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 .