Terraform工作在一個文件夾級別,在所有.tf
文件拉動(和默認爲terraform.tfvars
文件)。
所以我們做了類似於Anton的answer的東西,但是放棄了使用sed模擬東西的一些複雜性。因此,作爲一個基本的例子,你的結構可能是這樣的:
$ tree -a --dirsfirst
.
├── components
│ ├── application.tf
│ ├── common.tf
│ ├── global_component1.tf
│ └── global_component2.tf
├── modules
│ ├── module1
│ ├── module2
│ └── module3
├── production
│ ├── customer1
│ │ ├── application.tf -> ../../components/application.tf
│ │ ├── common.tf -> ../../components/common.tf
│ │ └── terraform.tfvars
│ ├── customer2
│ │ ├── application.tf -> ../../components/application.tf
│ │ ├── common.tf -> ../../components/common.tf
│ │ └── terraform.tfvars
│ └── global
│ ├── common.tf -> ../../components/common.tf
│ ├── global_component1.tf -> ../../components/global_component1.tf
│ ├── global_component2.tf -> ../../components/global_component2.tf
│ └── terraform.tfvars
├── staging
│ ├── customer1
│ │ ├── application.tf -> ../../components/application.tf
│ │ ├── common.tf -> ../../components/common.tf
│ │ └── terraform.tfvars
│ ├── customer2
│ │ ├── application.tf -> ../../components/application.tf
│ │ ├── common.tf -> ../../components/common.tf
│ │ └── terraform.tfvars
│ └── global
│ ├── common.tf -> ../../components/common.tf
│ ├── global_component1.tf -> ../../components/global_component1.tf
│ └── terraform.tfvars
├── apply.sh
├── destroy.sh
├── plan.sh
└── remote.sh
在這裏,你運行你的計劃/應用/從根級破壞,其中包裝shell腳本處理類似cd'ing進入該目錄並運行terraform get -update=true
的東西,但也爲該文件夾運行terraform init
,以便爲S3獲取唯一的狀態文件密鑰,使您可以獨立跟蹤每個文件夾的狀態。
上面的解決方案具有通用模塊,它們打包資源以提供通用接口(例如,我們的EC2實例根據某些輸入變量以特定方式進行標記,並且還給出了私有Route53記錄),然後執行組件」。
這些組件包含一組模塊/資源,這些模塊/資源將由Terraform在同一文件夾中應用。因此,我們可以將一個ELB,一些應用程序服務器和一個數據庫放在application.tf
下,然後將它們鏈接到一個位置,這樣我們就可以使用Terraform來控制一個位置。如果我們可能在某個位置的資源上存在某些差異,那麼它們將被分離出來。在上例中,您可以看到staging/global
的global_component2.tf
不存在於生產中。這可能僅適用於非生產環境,例如某些網絡控制,以防止互聯網訪問環境。
這裏真正的好處是,所有東西都可以直接在開發人員的源代碼控制中直接查看,而不需要使用生成所需Terraform代碼的模板步驟。
它還有助於遵循DRY,其中環境之間的唯一真正區別在於位置中的terraform.tfvars
文件,並且使它們在生效之前更容易測試,因爲每個文件夾幾乎與其他文件夾相同。
使用這種方法,您將在每個文件夾內或從根目錄運行terraform?我問,因爲根據這個,狀態文件可能存儲在根路徑或每個文件夾中。 –
您無法從父文件夾運行Terraform。 Terraform僅適用於當前目錄中的內容。正如它發生的那樣,我們有一些幫助程序腳本,它們位於repo的根目錄,cd'到我們想要執行的位置,然後從那裏運行'terraform' CLI命令。 – ydaetskcoR
是的,你可以,我一直這麼做......'terraform plan path/to/something' –