Criar uma VM no Azure usando o Terraform com loops for

by Rackspace Technology Staff

Introdução

É possível criar facilmente várias máquinas virtuais (VMs) no Azure® usando o Hashicorp® Terraform® com a ajuda do Visual Studio® Code (VS Code).

Este post do blogue centra-se na criação de VMs em massa no Azure. Também destaco a abordagem de Infraestrutura como Código (IaC). Utilizo o VS Code neste blogue, mas pode utilizar o seu IDE preferido.

iniciar

Analisei os requisitos gerais para criar várias VMs no Azure com alguma nomenclatura específica padrão ou típica. Mesmo quando construímos coisas de improviso, temos de manter um olho de águia em tudo para manter os nossos padrões. E manter o padrão não é nada fácil, principalmente porque temos de seguir os mesmos cânones de nomes para o nome da VM, disco do SO, disco de dados, nome do controlador de interface de rede (NIC), etc.

A IaC permite-nos gerir todos os aspectos da manutenção das normas, incluindo as coisas que construímos no backend na superfície real.

Escrevi um código Terraform simples para criar duas VMs no Azure com nomes semelhantes para cada recurso. Também utilizo etiquetas, que são uma nova forma de separar as coisas. Por isso, vamos passar diretamente à ação e pôr as mãos na massa com o Terraform.

A criação de uma VM do Azure requer um grupo de recursos (RG), uma rede virtual (VNet), uma sub-rede, uma NIC e uma configuração de VM. Tendo tudo isto em mente, vamos separar todos os ficheiros para que seja fácil de compreender.

Criar o ficheiro do grupo de recursos

Primeiro, precisamos de criar um bloco de código RG na linguagem de configuração Hashicorp (HCL). Vamos criar dois RGs (um para a VM e a placa de rede e outro para o material de rede). Como prática recomendada, não recomendo manter tudo junto. Antes de criar os RGs, defina um bloco de provedor para o Terraform, para que ele entenda que estamos implantando recursos do Azure. Armazene estas informações para o Terraform num ficheiro separado chamado providers.tf:

< entidade drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

O código RG, rg.tf:

< entidade drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

Criar os ficheiros VNET e de sub-rede

Agora, a segunda tarefa é criar uma VNet e uma sub-rede para a nossa VM. O bloco VNet,vnet.tf:

< entidade drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

E o código da sub-rede, subnet.tf

< entidade drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

Criar o ficheiro NIC

Estamos quase a terminar o trabalho de rede, exceto a placa de rede da nossa VM. Vamos colocar o código da NIC no RG da VM. Repare que referenciei o RG da aplicação em resource\_group\_name porque manter os detalhes da placa de rede no RG da rede não me convém.

O código NIC: Nic.tf:

< entidade drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

Criar o ficheiro de armazenamento

Agora já terminámos todas as questões de rede, mas a maior parte das pessoas considera que uma VM sem definições de diagnóstico activadas é uma má construção. E não quero que ninguém me chame "novo construtor"! O código da conta de armazenamento é simples e, ao utilizá-lo, podemos considerar-nos bons implementadores do Azure.

O ficheiro da conta de armazenamento, storage_account.tf:

< entidade drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

Criar o ficheiro VM

Está tudo pronto para o código da VM, mas lembre-se de que temos de utilizar os mesmos padrões que utilizámos anteriormente, como o nome da VM, o nome da placa de rede, o nome do disco, etc.

Código final para a nossa VM, vm.tf:

Building GCP  Landing Zones Pic 6
Building GCP Landing Zones Pic 7
  < entidade drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

Criar o ficheiro variável

Por fim, coloquei algumas coisas em variáveis, como os nomes de todas as VMs. Pode colocar outros itens em variáveis, tais como RG, VNet e nomes de sub-rede. A utilização de variáveis ajuda quando se fazem construções gigantes.

O ficheiro variável, Variable.tf:

< entidade drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

Criar as VMs

O meu objetivo é criar duas VMs utilizando um loop for. Assim, a variável vm_name tem dois nomes de VM (pode adicionar vários) e a segunda variável é a localização na qual pretendo implementar os recursos do Azure.

Deixem-me partilhar como mantenho os meus padrões intactos: Utilizei VMName-nic para cada NIC, VMName-Osdisk, e -data1. Todos os recursos, como VM, NIC e DISK, aparecem com a mesma nomenclatura, portanto, podemos entender facilmente quais recursos pertencem a qual VM.

Implantar

Vamos ao que interessa e aprender a implementar as VMs no Azure. Está na altura de cozer os ovos. Para simplificar, utilizo o Azure CLI para esta tarefa em vez de utilizar uma abordagem DevOps adequada e executar isto através de um pipeline e armazenar os ficheiros do site noutro local que não o nosso diretório.

Se você não tem o `az` CLI em sua máquina, você pode [install it](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest).

1. Iniciar sessão no Azure: az login

2. Verificar quantas subscrições temos para este inquilino: az account list --output table

3. Definir a subscrição correta para a nossa implementação:

conjunto de   contas az --subscrição "XXXXXX-XXXXXXX-XXXX-XXX"

4. Navegue até ao diretório onde colocámos todos os nossos ficheiros de código Terraform (utilizei temp para este exemplo, mas não recomendo essa localização):

cd C:\temp

5. Inicializar o Terraform neste diretório:

terraform init

6. Execute o plano do Terraform para verificar o que vamos construir e salve a saída do plano para uso posterior, adicionando o sinalizador `-out` no comando:

plano de terraformação

ou

plano de terraformação

7. Execute o código do Terraform para implantar e digite yes na verificação de confirmação    ou use -auto-approve para ignorar a confirmação manual:

aplicar a terraformação

ou

aplicar a terraformação

8. Verifique a VM que criou:

    az   vm list -o table

Alguns truques secretos para o loop

É possível criar várias VMs executando um loop for do Terraform, conforme mostrado no código a seguir. O ciclo é executado tantas vezes quantas as que definiu a variável (duas vezes, no nosso caso, porque defini dois nomes de VM na variável):

for_each = toset(var.vm_name)

 O `cada` objeto:

O ciclo for no Terraform tem um par de chaves, chave e valor, mas ambos são geralmente semelhantes.Nos blocos de recursos, onde define for_each, pode utilizar reach objectos adicionais nas suas expressões para modificar a configuração de cada instância.

cada objeto tem dois atributos:

- each.key: A chave do mapa (ou membro do conjunto) correspondente a esta instância.

- each.value: O valor do mapa correspondente a esta instância. Se forneceu um conjunto, isto é o mesmo que each.key.

Pode utilizar o comando Terraform fmt para formatar o código, tal como reescrever os ficheiros de configuração do Terraform para que estejam em conformidade com um formato e estilo canónicos. Este comando aplica um subconjunto de convenções de estilo da linguagem do Terraform, juntamente com outros pequenos ajustes para facilitar a leitura.  

Conclusão

Divirta-se a utilizar o Terraform para Azure e mantenha os padrões com algum código simples

Saiba mais sobre as nossas soluções Azure Cloud