Alterando sua infraestrutura de forma incremental
Conforme seu projeto de infraestrutura vai crescendo e seu código sendo alterado em recursos que já existem, é necessário algum tipo de "mecanismo" para que aplique apenas as novas alterações mantendo assim todo o restante. E o Terraform faz isto para nós, detectando quais são estas mudanças que aconteceram no projeto.
O Terraform ao ser executado grava o estado de sua infraestrutura localmente em um arquivo chamado terraform.tfstate em formato JSON
. Este arquivo é gerado sempre no diretório que está sendo executado o Terraform e é por ele que os estados do que já existe em sua infraestrutura são mantidos.
Basicamente o Terraform irá ler o seu arquivo terraform.tfstate e verificar se estas informações ainda permanecem, caso isto não aconteça, o Terraform irá mostrar o que deve ser atualizado.
Então, continuando com a nossa infraestrutura anterior… Vamos realizar pequenos ajustes na máquina virtual que foi provisionada no GCP.
Começando pequeno (sempre), iremos apenas adicionar labels para esta máquina que já existe, então o novo código fonte fica o seguinte:
resource "google_compute_instance" "default" {
name = "linux-vm-1"
machine_type = "f1-micro"
zone = "us-central1-a"
boot_disk {
initialize_params {
image = "debian-cloud/debian-9"
}
}
labels = {
environment = "development"
distro = "debian-9"
}
network_interface {
network = "default"
}
}
Faça o plano de execução para identificar o que irá acontecer com sua infraestrutura:
$ terraform plan
Abaixo está a saída do seu terminal, apenas iremos suprimir o restante do resultado que ficou o mesmo.
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
google_compute_instance.default: Refreshing state... [id=projects/projeto-1/zones/us-central1-a/instances/linux-vm-1]
------------------------------------------------------------------------
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
~ update in-place
Terraform will perform the following actions:
# google_compute_instance.default will be updated in-place
~ resource "google_compute_instance" "default" {
can_ip_forward = false
cpu_platform = "Intel Haswell"
deletion_protection = false
enable_display = false
guest_accelerator = []
id = "projects/projeto-1/zones/us-central1-a/instances/linux-vm-1"
instance_id = "3724819701104257360"
label_fingerprint = "42WmSpB8rSM="
~ labels = {
+ "company" = "4Linux"
+ "environment" = "development"
+ "os-system" = "debian-9"
}
machine_type = "f1-micro"
metadata = {}
metadata_fingerprint = "b20jSyLni-U="
......
......
......
......
Plan: 0 to add, 1 to change, 0 to destroy.
......
......
......
O sumário final nos apresenta o que será criado, neste caso 0 recursos serão adicionados, 1 recurso será alterado e 0 recursos serão destruídos. Perceba que logo no início do output também é mostrado na saída do terminal que já existe esta máquina e em seguida o seguinte trecho de aviso:
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
~ update in-place
Ou seja, o Terraform está informando que todas modificações são mostradas com um ~ (sinal de til) no inicio da linha.
Em nosso caso o recurso da instância está sendo alterado mais precisamente onde adicionamos o novo código (labels).
Para prosseguir com a modificação, execute de fato o Terraform para aplicar o código.
$ terraform apply -auto-approve
Com o seguinte resultado:
google_compute_instance.default: Refreshing state... [id=projects/projeto-1/zones/us-central1-a/instances/linux-vm-1]
google_compute_instance.default: Modifying... [id=projects/projeto-1/zones/us-central1-a/instances/linux-vm-1]
google_compute_instance.default: Modifications complete after 8s [id=projects/projeto-1/zones/us-central1-a/instances/linux-vm-1]
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
O procedimento para qualquer recurso é basicamente o mesmo para alterar de forma incremental.
- Você cria o recurso inicial que precisa;
- Faz o plano de execução;
- Faz aplicação deste recurso;
- Quando for necessário alterar qualquer atributo deste código, faça o plano de execução;
- Verifique se a saída está de acordo;
- Aplique este novo código.