假設A,B都自己從頭寫一份Terraform去雲端平台(假設GCP)新增自己的VM
A先寫完然後Apply上去,現在GCP上有A的VM在上面
後來B寫Apply自己VM,VM名稱不同
A,B兩個人用的credential是同一份
Q1,這樣最後結果會是?
1. A,B的VM都存在在GCP上
2. 只有B的VM在GCP上,A的被B的Terraform蓋掉了
Q2,假設結果是1. 那他是用什麼判斷哪些VM或服務是透過哪份Terraform檔案建置的?
Q3,假設結果是2. 那在B Apply前,是需要執行什麼Terraform指令才能最終結果是A,B的VM都存在?
請大家幫忙解惑,謝謝
雷神大有針對操作上,給予很好的建議,所以就不再贅述。
這邊想要簡單補充一個個人以為的重點:state file
。
用同一組 credential 不是問題,它只代表兩人所建的資源會 一起存在於同一個帳號下
,而最重要的分水嶺在於:
A 與 B 是在 同一台機器
+ 同一目錄下
執行 terraform 嗎?
不是
- 那結果基本上是 A 與 B 所創造的資源會同時存在,並不互相覆蓋,除非該資源有唯一或排他性的限制
。(如您的比方,就會是兩台不同名的 vm 同時存在)
是
- 後者執行 apply 時,會看見 terraform 提示資源的異動,包含新增、刪除、替換。(如您的比方,後者執行時會看見 vm 的名稱將被修改的提示)
所以簡化後的答案為:
1
terrafrom.tfstate
只要兩人在各自的機器上執行即可達成
以上答案供您參考,我推測您的情況應該 不是
在同一台機器下執行 terraform。
如果您計畫要導入 terraform 並做深度使用,這裡有幾篇官方文件是關於 state file,建議抽空研究看看,應該會有點幫助!(已幫您排好順序,可參考依序閱讀)
更詳細的部份,就有勞站上大神們的補充了~
如果你想讓兩組不同的人, 分別部署屬於他們自己的環境, 應該是在雲上開出不同的環境來使用, 例如: GCP 應該給分別開設兩個不同的 Project 給 A/B, 或者 AWS 應該分別開設兩個不同的 VPC 網段給 A/B, 才不會搞不清楚....
把所有部署需求都混在一起, 最後是連維運的人都搞不清楚到底現在是甚麼狀態?
--------- 我是分隔線 ------------
Terraform 在正常部署有以下三個步驟:
Terraform init:
建立他自己的工作環境, 讀取你撰寫的 Config 內容, 這個動作不會影響你正在使用中的生產環境, 可以執行多次也沒關係
Terraform plan:
這個指令會從現有生產環境, 將所有資源全部讀回來, 然後比對你設計的 Config, 看看中間有多少差距要補? 哪些要刪或增? 同時將現有環境跟期望環境的差異, 產出一份執行計畫
Terraform apply:
將 Plan 產生出來的執行計畫, 真實的部署到生產環境中
如果你依序執行以上流程的話, Terraform 預設會先做差異比對之後, 只變更新 config 所期望的差異, 不會碰觸舊環境中與你期望相符的資源, 但是會刪除舊環境中, 你沒有預期存在的資源.
如果這不是你想要的結果, 希望每次部署都全部從頭來過的話, 最前面可以加上:
Terraform destroy:
這個指令會將生產環境內的所有資源全部清空