# Terratag Terratag 是個 CLI 工具,可簡化 resource tag 的方式,對於 Terraform 社群來說,他們希望**集中化**來標註 resource 而不是分別寫在每個resource內,以更方便的追蹤和管理。 :::info 補充一下,在 aws & azure ,我們會說標註是 tags 。但 gcp 因為已經有一個名為 network tag 用於連接網路防火牆的配置,故 gcp 中標註稱為 labels 以下文章統稱 tags ::: # 功能測試: ### Terratag 可以統一把要部署的 resources **全部**一次性都加上 tags 不是每個 resource 都能被標註,但 Terratag 可以自動分辨,把可以標注的資源,加上標注。 :::danger 使用 -tags 時,如果是使用 a comma seperated list of key=value.各個kvp間不要留空白,會讀不到。 -tags="flag=vm1,author=henrylee" (O) -tags="flag=vm1, author=henrylee" (X 不會報錯但沒辦法寫入tag) ::: ### Terratag 能不能針對 .tf內的resource進行標注? 可以使用 -filter=<resource-type> 來只讓需要的 resource 加上 tags ``` shell terratag -verbose=true -tags="flag=vm1,author=henrylee" -filter=google_compute_instance ``` :::danger 目前看起來只能針對resource-type 來 filter tag , 無法精細到 resource-name ::: ### Terratag 針對整個 .tf 檔, 使用 Terratag 會不會override? 還是可以繼續加上去? 配合-skipTerratagFiles;-rename 等等參數測試,Terratag 可以重複呼叫,tag部分也會保留原始資料,並持續擴展下去。 #### -skipTerratagFiles ``` shell terratag -verbose=true -tags="flag=vm1,author=henrylee" -filter=google_compute_instance terratag -tags="author=sting,id=ps145" -filter=google_compute_instance -skipTerratagFiles=false terratag -tags="author=paul" -filter=google_compute_instance -skipTerratagFiles=false ``` 會產生main.tf.bak 和 main.terratag.tf.bak,而且.tf內容內有兩個local變數,local部分會用 terraform 的內置函數merge起來。 若 tag 的 key 值一樣,則會覆蓋成新的。 ``` shell terratag -verbose=true -tags="flag=vm1,author=henrylee" terratag -verbose=true -tags="author=sting,id=ps145" -skipTerratagFiles=false terratag -verbose=true -tags="author=paul" -skipTerratagFiles=false ``` #### -rename ``` shell terratag -verbose=true -rename=false -tags="flag=vm1,author=henrylee" -filter=google_compute_instance terratag -verbose=true -rename=false -tags="author=sting,id=ps145" -filter=google_compute_instance ``` 如果是使用-rename,執行多次terratag,只會保存最新和前一次的狀態。 # step ```shell terraform init terratag -tags="flag=vm1,author=henrylee" -filter=google_compute_instance terratag -skipTerratagFiles=false -tags="flag=flag1,author=henrylee" -filter=google_storage_bucket terratag -skipTerratagFiles=false -tags="env=test" -filter="^google_storage_bucket$|^google_compute_instance$" terratag -skipTerratagFiles=false -tags="flag=flag2" -filter=google_compute_instance terratag -skipTerratagFiles=false -tags="reject=reject-flag" -skip=google_compute_instance ``` --- # Reference 28min 開始 https://www.youtube.com/watch?v=dMo11PzhVQI https://www.youtube.com/watch?v=DNp6ZaaGG8w https://github.com/env0/terratag build structure / Resources / 解釋 resource-type & resource-name https://learn.hashicorp.com/tutorials/terraform/aws-build?in=terraform/aws-get-started --- 其他 https://godleon.github.io/blog/DevOps/terraform-develop-production-grade-modules/ https://github.com/terraform-google-modules/terraform-google-bootstrap