- Estrutura base de um projecto terraform:
main.tf
,variables.tf
,outputs.tf
- Utilização de
variable
,data
,resource
eoutput
. terrafom.tfvars
é usado por defeito se tiver presente na mesma diretória.- Os 4 principais comandos de terraform:
init
,plan
,apply
edestroy
. - 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 login
Podes 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-000001
De 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 init
command 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 init
from docs: The
terraform plan
command 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.tfplan
from docs: The
terraform apply
command executes the actions proposed in a Terraform plan.
terraform apply plan.tfplan
verificar que o recurso remoto foi criado:
gcloud compute instances list --project tf-gke-lab-01-np-000001
from docs: The
terraform destroy
command 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 destroy
to conveniently clean up all of those temporary objects once you are finished with your work.
terraform destroy
verificar que o recurso remoto foi destruido:
gcloud compute instances list --project tf-gke-lab-01-np-000001
Nesta 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.tfplan
terraform apply plan.tfplan
Podem 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.default
e descomentar o campotags = [ "allow-iap" ]
na definição do recurso - Executar
terraform plan -out plan.tfplan
e 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.default
e alterar o camponame
para o seguinte:"${random_pet.this.id}-vm-new"
- Executar
terraform plan -out plan.tfplan
e 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.tfplan
Verificar 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.tfvars
e alterar o valor da variavelprefix
denos
parawoo
Executar o plan
e verificar todo o grafo de dependencias é afetado:
terraform plan -out plan.tfplan
Executar o apply
:
terraform apply plan.tfplan
Notem 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.tfplan
terraform apply plan.tfplan
Nesta 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=custom
Criar 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
plan
eapply
irá 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.tfplan
terraform apply plan.tfplan
O 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)-vpc
Agora 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)-subnet
Agora, 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.tfplan
Neste 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.tf
resource "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.tfplan
Observar o apply
:
terraform apply plan.tfplan
Tip: 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 vm2
Destruir os conteúdos!
terraform destroy
🔚🏁 Chegámos ao fim 🏁🔚