Provedor Terraform Selectel

Provedor Terraform Selectel

Lançamos um provedor oficial do Terraform para trabalhar com a Selectel. Este produto permite que os usuários implementem totalmente o gerenciamento de recursos por meio da metodologia de infraestrutura como código.

O provedor atualmente oferece suporte ao gerenciamento de recursos de serviço "Nuvem privada virtual" (doravante denominado VPC). No futuro, pretendemos adicionar gestão de recursos para outros serviços prestados pela Selectel.

Como você já sabe, o serviço VPC é construído em OpenStack. Porém, devido ao fato do OpenStack não fornecer ferramentas nativas para atender a nuvem pública, implementamos a funcionalidade que faltava em um conjunto de APIs adicionais que simplificam o gerenciamento de objetos compostos complexos e tornam o trabalho mais conveniente. Algumas das funcionalidades disponíveis no OpenStack estão fechadas para uso direto, mas estão disponíveis através nossa API.

O provedor Selectel Terraform agora inclui a capacidade de gerenciar os seguintes recursos VPC:

  • projetos e suas cotas;
  • usuários, suas funções e tokens;
  • sub-redes públicas, incluindo inter-regionais e VRRP;
  • licenças de software.

O provedor usa nossa biblioteca Go pública para trabalhar com a API VPC. Tanto a biblioteca quanto o próprio provedor são open source, seu desenvolvimento é realizado no Github:

Para gerenciar outros recursos de nuvem, como máquinas virtuais, discos, clusters Kubernetes, você pode usar o provedor OpenStack Terraform. A documentação oficial de ambos os provedores 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 em o site oficial).

Para operar, o provedor requer uma chave API Selectel, que é criada em painéis de controle de conta.

Os manifestos para trabalhar com Selectel são criados usando Terraform ou usando um conjunto de exemplos prontos que estão disponíveis em nosso repositório Github: exemplos de terraform.

O repositório com exemplos está 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 API Selectel e se familiarizar com os exemplos, vamos passar aos exemplos práticos.

Um exemplo de criação de um servidor com disco local

Vejamos um exemplo de criação de um projeto, um usuário com uma função e uma máquina virtual com disco local: terraform-examples/examples/vpc/server_local_root_disk.

No arquivo vars.tf todos os parâmetros que serão usados ​​ao chamar os módulos são descritos. Alguns deles possuem 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 principal.tf O provedor Selectel é inicializado:

provider "selectel" {
token    = "${var.sel_token}"
}

Este arquivo também contém o valor padrão da 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 de arquivo; você também pode adicionar o valor como uma string.

Mais adiante neste arquivo os módulos são lançados projeto_com_usuário и server_local_root_disk, que gerenciam os recursos necessários.

Vejamos esses módulos com mais detalhes.

Criando um projeto e um usuário com uma função

O primeiro módulo cria um projeto e um usuário com uma função nesse projeto: exemplos de terraform/modules/vpc/project_with_user.

O usuário criado poderá fazer 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 disco local

O segundo módulo trata do gerenciamento de objetos OpenStack, necessários para criar um servidor com 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
  }
}

Argumento ignore_changes permite ignorar alterações de atributos id para a imagem usada para criar a máquina virtual. No serviço VPC, a maioria das imagens públicas são atualizadas automaticamente uma vez por semana e ao mesmo tempo suas id também muda. Isso se deve às peculiaridades do componente OpenStack – Glance, no qual as imagens são consideradas entidades imutáveis.

Se você estiver criando ou modificando um servidor ou disco existente que tenha como argumento ID_imagem usado id imagem pública, depois que essa imagem for atualizada, executar o manifesto do Terraform novamente recriará o servidor ou disco. Usando um argumento ignore_changes permite que você evite tal situação.

Nota: argumento ignore_changes apareceu no Terraform há muito tempo: puxar#2525.

Argumento ignore_resize_confirmation necessário para redimensionar com êxito o disco local, os núcleos ou a memória do servidor. Tais alterações são feitas através do componente OpenStack Nova usando uma solicitação redimensionar. Nova padrão após solicitação redimensionar coloca o servidor em status verificar_resize e aguarda confirmação adicional do usuário. Porém, esse comportamento pode ser alterado para que o Nova não espere por ações adicionais do usuário.

O argumento especificado permite que o Terraform não espere pelo status verificar_resize para o servidor e esteja preparado para que o servidor fique com status ativo após alterar seus parâmetros. O argumento está disponível na versão 1.10.0 do provedor OpenStack Terraform: puxar#422.

Criando Recursos

Antes de executar os manifestos, observe que em nosso exemplo são lançados dois provedores diferentes, e o provedor OpenStack depende dos recursos do provedor Selectel, pois sem criar um usuário no projeto é impossível gerenciar os objetos pertencentes a ele . Infelizmente, pela mesma razão, não podemos simplesmente executar o comando aplicar terraform dentro do nosso exemplo. Primeiro precisamos fazer Aplique para módulo projeto_com_usuário e depois disso para todo o resto.

Nota: Este problema ainda não foi resolvido no Terraform, você pode acompanhar a discussão no Github em edição nº 2430 и edição nº 4149.

Para criar recursos, acesse 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 que utiliza e verifica todos os módulos descritos no exemplo.

Primeiro vamos aplicar o módulo projeto_com_usuário. Isso requer a passagem manual de 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 API Selectel;
  • senha do usuário com uma senha para o usuário do OpenStack.

Os valores das duas primeiras variáveis ​​​​devem ser retirados de painéis de controle.

Para a última variável, você pode criar qualquer senha.

Para usar o módulo você precisa substituir os valores SEL_ACCOUNT, SEL_TOKEN и SENHA DO USUÁRIO 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

Após executar o comando, o Terraform mostrará quais recursos deseja criar e pedirá 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, o usuário e a função forem criados, você poderá 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 na saída do Terraform com o endereço IP externo onde o servidor criado estará acessível:

module.server_local_root_disk.openstack_networking_floatingip_associate_v2.association_1: Creating...
  floating_ip: "" => "x.x.x.x"

Você pode trabalhar com a máquina virtual criada via SSH usando o IP especificado.

Editando recursos

Além de criar recursos através do Terraform, eles também podem ser modificados.

Por exemplo, vamos aumentar o número de núcleos e memória do nosso servidor alterando os valores dos parâmetros servidor_vcpus и servidor_ram_mb no arquivo 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 a quais mudanças isso resultará usando o 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 uma alteração de recurso openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Observe que isso envolverá a reinicialização da máquina virtual criada.

Para aplicar a nova configuração da máquina virtual, use o comando aplicar terraform, que já lançamos anteriormente.

Todos os objetos criados serão exibidos em Painéis de controle VPC:

Provedor Terraform Selectel

В нашем repositórios de exemplo Você também pode ver manifestos para a criação de máquinas virtuais com unidades de rede.

Exemplo de criação de um cluster Kubernetes

Antes de passarmos para o próximo exemplo, limparemos os recursos que criamos anteriormente. Para fazer isso na raiz do projeto terraform-examples/examples/vpc/server_local_root_disk Vamos executar o comando para excluir objetos 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 para limpar os objetos 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

Em ambos os casos, será necessário 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 exemplos de terraform/exemplos/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 valores padrão, como número de nós, suas características, versão do Kubernetes, etc.

Para criar recursos semelhantes ao primeiro exemplo, primeiro começaremos a inicializar módulos e a criar recursos de módulo projeto_com_usuárioe então criando todo o resto:

$ 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

Transferiremos a criação e gerenciamento de clusters Kubernetes por meio do componente OpenStack Magnum. Você pode descobrir mais sobre como trabalhar com um cluster em um de nossos artigos anteriores, bem como em base de conhecimento.

Ao preparar o cluster, serão criados discos e máquinas virtuais e todos os componentes necessários serão instalados. A preparação leva cerca de 4 minutos, durante os quais o Terraform exibirá mensagens como:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Still creating... (3m0s elapsed)

Assim que a instalação for concluída, o Terraform indicará que o cluster está pronto e exibirá seu ID:

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ê precisa obter o arquivo de acesso ao cluster. Para isso, acesse o projeto criado através do Terraform na lista de projetos da sua conta:

Provedor Terraform Selectel

Em seguida, siga o link como xxxxxx.selvpc.ruque aparece abaixo do nome do projeto:

Provedor Terraform Selectel

Para informações de login, use o nome de usuário e a senha que você criou através do Terraform. Se você não trapaceou vars.tf ou principal.tf para nosso exemplo, o usuário terá o nome tf_user. Você deve usar o valor da variável como senha TF_VAR_user_password, que foi especificado na inicialização aplicar terraform mais cedo.

Dentro do projeto você precisa ir até a aba Kubernetes:

Provedor Terraform Selectel

É aqui que está localizado o cluster criado via Terraform. Baixar arquivo para kubectl você pode na guia “Acesso”:

Provedor Terraform Selectel

As instruções de instalação estão localizadas na mesma guia. kubectl e uso do baixado config.yaml.

Depois de iniciar o kubectl e definindo 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 pode ser facilmente alterado via Terraform.
No arquivo principal.tf o seguinte valor é especificado:

cluster_node_count = "${var.cluster_node_count}"

Este valor é substituído de vars.tf:

variable "cluster_node_count" {
default = 2
}

Você pode alterar o valor padrão em vars.tfou especifique o valor necessário diretamente em principal.tf:

-  cluster_node_count = "${var.cluster_node_count}"
+  cluster_node_count = 3

Para aplicar as alterações, como no caso do primeiro exemplo, utilize o comando aplicar terraform:

$ 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 conhecemos as principais formas de trabalhar com "Nuvem privada virtual" através do Terraform. Ficaremos felizes se você usar o fornecedor oficial Selectel Terraform e fornecer feedback.

Quaisquer bugs encontrados no provedor Selectel Terraform podem ser relatados via Problemas do Github.

Fonte: habr.com

Adicionar um comentário