Terraform Provider Selectel



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 .

Source: https://habr.com/ru/post/pt445162/


All Articles