- Estrutura base de um projecto terraform:
main.tf,variables.tf,outputs.tf - Utilização de
variable,data,resourceeoutput. terrafom.tfvarsé usado por defeito se tiver presente na mesma diretória.- Os 4 principais comandos de terraform:
init,plan,applyedestroy. - Gestão de alterações: simples, disruptivas e dependentes.
- Destruição seletiva de recursos.
Tempo estimado: Cerca de 2 horas
Pré requsitos: Antes de começares, é necessário verificares algumas coisas:
Junta-te à Cloud Guild no Teams e segue os tutorias da Wiki do GCP.
Depois pede para te adicionarem ao projeto no GCP.
De seguida vais ter de configurar o GCP. Se já tens o gcloud instalado corre este comando:
gcloud auth application-default loginPodes econtrar mais info sobre a auth aqui.
Certifica-te que tens a google-cloud-shell devidamente autorizada correndo este comando:
gcloud config set project tf-gke-lab-01-np-000001De seguida, clica no botão Start para começares.
Nesta secção iremos executar os 4 principais comandos de terraform: init, plan, apply e destroy.
from docs: The
terraform initcommand is used to initialize a working directory containing Terraform configuration files. This is the first command that should be run after writing a new Terraform configuration or cloning an existing one from version control. It is safe to run this command multiple times.
terraform initfrom docs: The
terraform plancommand creates an execution plan. By default, creating a plan consists of:
- Reading the current state of any already-existing remote objects to make sure that the Terraform state is up-to-date.
- Comparing the current configuration to the prior state and noting any differences.
- Proposing a set of change actions that should, if applied, make the remote objects match the configuration.
terraform plan -out plan.tfplanfrom docs: The
terraform applycommand executes the actions proposed in a Terraform plan.
terraform apply plan.tfplanverificar que o recurso remoto foi criado:
gcloud compute instances list --project tf-gke-lab-01-np-000001from docs: The
terraform destroycommand is a convenient way to destroy all remote objects managed by a particular Terraform configuration.While you will typically not want to destroy long-lived objects in a production environment, Terraform is sometimes used to manage ephemeral infrastructure for development purposes, in which case you can use
terraform destroyto conveniently clean up all of those temporary objects once you are finished with your work.
terraform destroyverificar que o recurso remoto foi destruido:
gcloud compute instances list --project tf-gke-lab-01-np-000001Nesta secção iremos demonstrar a utilização de terraform perante varios tipos de alterações.
Assegurar que os recursos previamente criados foram devidamente destruidos:
terraform destroy.`
terraform plan -out plan.tfplanterraform apply plan.tfplanPodem obter o comando a partir do output do terraform, ou usando o comando gcloud:
gcloud compute ssh $(terraform output -raw vm_name) --project=$(terraform output -raw project_id) --zone $(terraform output -raw vm_zone)não deverá ser possível fazer ssh porque precisamos de introduzir uma firewall-tag vamos então efectuar uma alteração não-disruptiva
As alterações não disruptivas são pequenas alterações que possibilitam a re-configuração do recurso sem que este tenha que ser recriado, não afetando as suas dependências
- Editar o ficheiro
main.tf, localizar o recursogoogle_compute_instance.defaulte descomentar o campotags = [ "allow-iap" ]na definição do recurso - Executar
terraform plan -out plan.tfplane verificar que o Terraform irá efectuar umupdate in-place- isto é uma alteração simples. - Executar
terraform apply plan.tfplan.
Como adicionámos uma tag que permite indicar à firewall o acesso SSH por IAP, podemos então testar novo comando de SSH:
gcloud compute ssh $(terraform output -raw vm_name) --project=$(terraform output -raw project_id) --zone $(terraform output -raw vm_zone)As alterações disruptivas são provocadas por alterações de propriedades que provocam a recriação do recurso e consequentes dependencias
- Localizar o recurso
google_compute_instance.defaulte alterar o camponamepara o seguinte:"${random_pet.this.id}-vm-new" - Executar
terraform plan -out plan.tfplane verificar que o Terraform irá efectuar umreplacement- é uma alteração disruptiva.
Aplicar o plan, verificar e acompanhar observando na execução do terraform que irá acontecer um destroy seguido de um create:
terraform apply plan.tfplanVerificar que o SSH continua a ser possível, mesmo com a nova instância:
gcloud compute ssh $(terraform output -raw vm_name) --project=$(terraform output -raw project_id) --zone $(terraform output -raw vm_zone)As alterações também podem ser derivadas de dependêndencias, e quando isso acontece, todo o grafo de dependendencias é afetado.
- Editar o ficheiro
terraform.tfvarse alterar o valor da variavelprefixdenosparawoo
Executar o plan e verificar todo o grafo de dependencias é afetado:
terraform plan -out plan.tfplanExecutar o apply:
terraform apply plan.tfplanNotem que apenas alterámos uma mera variável...
NOTA: NÃO DESTRUIR OS RECURSOS pois vamos usa-los no próximo passo
Nesta secção iremos abordar um comando particularmente útil: terraform import
from docs:Terraform is able to import existing infrastructure. This allows you take resources you've created by some other means and bring it under Terraform management.
This is a great way to slowly transition infrastructure to Terraform, or to be able to be confident that you can use Terraform in the future if it potentially doesn't support every feature you need today.
Assegurar que não existem alterações pendentes:
terraform plan -out plan.tfplanterraform apply plan.tfplanNesta parte vamos criar recursos recorrendo a uma ferramenta externa ao terraform por forma a criar um use-case de recursos que existem fora do state do terraform.
O objetivo é simular recursos que já existiam para que os possamos terraformar.
Criar uma vpc:
gcloud compute networks create $(terraform output -raw my_identifier)-vpc --project=$(terraform output -raw project_id) --subnet-mode=customCriar uma subnet:
gcloud compute networks subnets create $(terraform output -raw my_identifier)-subnet --project=$(terraform output -raw project_id) --range=10.0.0.0/9 --network=$(terraform output -raw my_identifier)-vpc --region=$(terraform output -raw region)Agora iremos colocar em prática os comandos de import para passar a gerir os recursos pelo terraform.
Ir ao ficheiro import-exercise.tf e descomentar os blocos
resource "google_compute_network" "imported"resource "google_compute_subnetwork" "imported"
- SE tentarem efectuar o
planeapplyirá dar um erro pois o recurso já existe. - Terá que ser importado para o state do terraform
Verificar que o terraform vai tentar criar os recursos porque ainda não estão importados:
Executar o plan seguido pelo apply:
terraform plan -out plan.tfplanterraform apply plan.tfplanO que vai acontecer é que o GCP vai retornar um erro 4xx indicando que estamos a tentar criar um recurso que já existe - é normal e esperado pois precisamos de proceder à importação.
Para proceder à importação, precisamos de obter o self_link do recurso a importar do lado do GCP tal como descrito nas instruções de importação para o recurso google_compute_network e google_compute_subnetwork.
Se precisarem, podem obter o uri do recurso usando os seguinte comandos
Obter o uri para a google_compute_network:
gcloud compute networks list --uri | grep "$(terraform output -raw my_identifier)"Importar o recurso:
terraform import google_compute_network.imported projects/$(terraform output -raw project_id)/global/networks/$(terraform output -raw my_identifier)-vpcAgora temos que fazer o mesmo para o recurso google_compute_subnetwork.
Obter o uri para a google_compute_subnetwork:
gcloud compute networks subnets list --uri | grep "$(terraform output -raw my_identifier)"Importar o recurso:
terraform import google_compute_subnetwork.imported projects/$(terraform output -raw project_id)/regions/$(terraform output -raw region)/subnetworks/$(terraform output -raw my_identifier)-subnetAgora, se tentarmos agora fazer
plan, vamos verificar que o terraform indica que não tem alterações à infraestrutura, confirmando que os recursos foram importados som sucesso.
Testar o plan:
terraform plan -out plan.tfplanNeste passo iremos criar novos recursos (mais uma Virtual Machine) que irão precisar dos recursos que foram previamente importados.
- Descomentar os seguintes blocos no ficheiro
import-exercise.tfresource "google_compute_instance" "vm2"resource "google_compute_firewall" "imported_iap"
Executar o plan e apply e verificar que os novos recursos vão ser criados usando as dependências que foram importadas previamente:
Observar o plan:
terraform plan -out plan.tfplanObservar o apply:
terraform apply plan.tfplanTip: após a criação dos recursos, podem fazer SSH para a nova instância usando a hint dada pelo comando em output.
terraform output vm2Destruir os conteúdos!
terraform destroy🔚🏁 Chegámos ao fim 🏁🔚
