這幾天看了一些鐵人賽的文章,看到一些很不錯的文章,當然也看到很多不知所云的內容
觀察整體趨勢是劣幣驅逐良幣,心中五味雜陳
大家盡量維持品質,內容有所依據,不要錯得離譜就好
不要害讀者不看還好,看了文章反而被雷,技術開倒車
本章會特別短,將介紹 state 最後常用的功能 taint / untaint / apply -replace="resource address"
課程內容與代碼會放在 Github 上: https://github.com/chechiachang/terraform-30-days
賽後文章會整理放到個人的部落格上 http://chechia.net/
Terraform 官方文件 已經依照 state manipulation 的使用情境做了分類,有以下幾個類別
在 terraform 正常工作流程中,在不需要 destroy + create 的情形下,terraform 會盡量 update 計有的 resource。
然而,有時我們管理 infrastructrue 的時候,就是會需要強制 recreate 的動作,terraform 提供了 state taint / state untaint 來滿足需求
使用 taint 可以標記一個已經存在的 state address,在下次 plan / apply 時,terraform 會強制 replace 這個 state 相關的 resource
相同的 resource address 下,會刪除原先的 remote resource,並 create 一個全新的 remote resource,並把 state 放在原本的 resource address 下
一樣使用用到爛的 azure/foundation/compute_network
示範
cd azure/foundation/compute_network
terragrunt state list
module.network.data.azurerm_resource_group.network
module.network.azurerm_subnet.subnet[0]
module.network.azurerm_subnet.subnet[1]
module.network.azurerm_subnet.subnet[2]
module.network.azurerm_virtual_network.vnet
terragrunt taint "module.network.azurerm_subnet.subnet[0]"
Resource instance module.network.azurerm_subnet.subnet[0] has been marked as tainted.
terragrunt state list
module.network.data.azurerm_resource_group.network
module.network.azurerm_subnet.subnet[0]
module.network.azurerm_subnet.subnet[1]
module.network.azurerm_subnet.subnet[2]
module.network.azurerm_virtual_network.vnet
terragrunt plan
-/+ destroy and then create replacement
Terraform will perform the following actions:
# module.network.azurerm_subnet.subnet[0] is tainted, so must be replaced
-/+ resource "azurerm_subnet" "subnet" {
~ address_prefix = "10.2.1.0/24" -> (known after apply)
~ id = "/subscriptions/6fce7237-7e8e-4053-8e7d-ecf8a7c392ce/resourceGroups/terraform-30-days/providers/Microsoft.Network/virtualNetworks/acctvnet/subnets/dev-1" -> (known after apply)
name = "dev-1"
- service_endpoint_policy_ids = [] -> null
# (6 unchanged attributes hidden)
- timeouts {}
}
Plan: 1 to add, 0 to change, 1 to destroy.
Changes to Outputs:
~ vnet_subnets = [
- "/subscriptions/6fce7237-7e8e-4053-8e7d-ecf8a7c392ce/resourceGroups/terraform-30-days/providers/Microsoft.Network/virtualNetworks/acctvnet/subnets/dev-1",
+ (known after apply),
"/subscriptions/6fce7237-7e8e-4053-8e7d-ecf8a7c392ce/resourceGroups/terraform-30-days/providers/Microsoft.Network/virtualNetworks/acctvnet/subnets/dev-2",
# (1 unchanged element hidden)
]
─────────────────────────────────────────────────────────────────────────────
module.network.azurerm_subnet.subnet[0]
如果 apply,terraform 就會執行 destroy + create
tained
的機制tainted
標記如果此時想要人為介入,便可以使用 untaint 來移除 tainted 標記
ignore_change
},使用 taint 可以強制 resource update在 Terraform v0.15.2 之後,terraform 提供了新的方法來操作 taint
terraform apply -replace="aws_instance.example[0]"