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:
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
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:
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.
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.
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:
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:
В нашем 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:
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
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:
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:
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:
Em seguida, siga o link como xxxxxx.selvpc.ruque aparece abaixo do nome do projeto:
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:
É aqui que está localizado o cluster criado via Terraform. Baixar arquivo para kubectl você pode na guia “Acesso”:
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:
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.