使用 Terraform 来使用环境变量
首先
上次我们使用Terraform创建了OCI的VCN,但是我们直接在tf文件中设置了每个变量。
然而,作为IaC的基本原则,我认为环境变量应该在另一个文件中进行管理,所以这次我们将确认这种方法。
我们要创建的资源是和上次相同的VCN。
Terraform的配置
变量声明
创建以下variables.tf,并声明每个值都是变量。
您可以选择设置默认值或添加描述。
在中文中,文件名是自由的,但一般情况下会命名为variables.tf。
## provider
variable "tenancy_ocid" {
type = string
}
variable "user_ocid" {
type = string
}
variable "private_key_path" {
type = string
}
variable "fingerprint" {
type = string
}
variable "region" {
type = string
}
## vcn-module
variable "compartment_id" {
type = string
}
variable "create_internet_gateway" {
type = bool
default = true
}
variable "create_nat_gateway" {
type = bool
default = true
}
variable "create_service_gateway" {
type = bool
default = true
}
variable "vcn_name" {
type = string
}
变量的设定
请在以下的terraform.tfvars文件中设置各个变量。
如果文件名为terraform.tfvars,则在运行Terraform时将读取文件内容。
请注意,例如Internet Gateway等默认为True,因此没有进行设置。
tenancy_ocid = "ocid1.tenancy.oc1..aaaaaaaa3mxxxxxxxxxxxxxxxxxxxca"
user_ocid = "ocid1.user.oc1..aaaaaaaxxxxxxxxxxxxxxxxfa"
private_key_path = "/home/xxx/.oci/xxxxxxxxxxxxxx.pem"
fingerprint = "3d:68:a5:f1:d5:36:xxxxxxxxxxxxxxxxxxxx"
region = "ap-xxxxxxxx-1"
compartment_id = "ocid1.compartment.oc1..aaaaaaaamxxxxxxxxxxxxxxxxxxxxxx5a"
vcn_name = "tf-vcn"
编辑设定文件
将各设定文件中的变量替换为var.<variables.tf中声明的变量名>。
provider "oci" {
tenancy_ocid = var.tenancy_ocid
user_ocid = var.user_ocid
private_key_path = var.private_key_path
fingerprint = var.fingerprint
region = var.region
}
terraform {
required_providers {
oci = {
source = "oracle/oci"
}
}
}
module "vcn" {
source = "oracle-terraform-modules/vcn/oci"
version = "3.5.5"
# insert the 1 required variable here
compartment_id = var.compartment_id
# Optional Inputs
create_internet_gateway = var.create_internet_gateway
create_nat_gateway = var.create_nat_gateway
create_service_gateway = var.create_service_gateway
region = var.region
vcn_name = var.vcn_name
}
这里总共有以下的文件。
$ ls -l
total 40
-rw-rw-r--. 1 opc opc 683 Nov 6 04:47 outputs.tf
-rw-rw-r--. 1 opc opc 265 Nov 6 05:30 provider.tf
-rw-rw-r--. 1 opc opc 450 Nov 6 05:26 terraform.tfvars
-rw-rw-r--. 1 opc opc 530 Nov 6 05:31 variables.tf
-rw-rw-r--. 1 opc opc 387 Nov 6 05:31 vcn-module.tf
执行Terraform
只需要一个选项就行
通过执行terraform init/plan/apply来确认VCN是否已经创建。(与上次相同,不再赘述)
指定变量
我认为结构可能是相同的,但变量可能是不同的。
在这种情况下,您可以在terraform plan/apply时使用-var-file=选项指定tfvars文件。
这次我准备了两个文件,考虑到开发环境和生产环境,只更改了vcn_name。
tenancy_ocid = "ocid1.tenancy.oc1..aaaaaaaa3mxxxxxxxxxxxxxxxxxxxca"
user_ocid = "ocid1.user.oc1..aaaaaaaxxxxxxxxxxxxxxxxfa"
private_key_path = "/home/xxx/.oci/xxxxxxxxxxxxxx.pem"
fingerprint = "3d:68:a5:f1:d5:36:xxxxxxxxxxxxxxxxxxxx"
region = "ap-xxxxxxxx-1"
compartment_id = "ocid1.compartment.oc1..aaaaaaaamxxxxxxxxxxxxxxxxxxxxxx5a"
vcn_name = "tf-vcn-dev"
tenancy_ocid = "ocid1.tenancy.oc1..aaaaaaaa3mxxxxxxxxxxxxxxxxxxxca"
user_ocid = "ocid1.user.oc1..aaaaaaaxxxxxxxxxxxxxxxxfa"
private_key_path = "/home/xxx/.oci/xxxxxxxxxxxxxx.pem"
fingerprint = "3d:68:a5:f1:d5:36:xxxxxxxxxxxxxxxxxxxx"
region = "ap-xxxxxxxx-1"
compartment_id = "ocid1.compartment.oc1..aaaaaaaamxxxxxxxxxxxxxxxxxxxxxx5a"
vcn_name = "tf-vcn-prod"
开始/计划。
$ terraform init
・・・
$ terraform plan -var-file=dev/dev.tfvars
・・・
# module.vcn.oci_core_vcn.vcn will be created
・・・
+ display_name = "tf-vcn-dev"
您可以确认VCN名称已经设置为dev/dev.tfvars文件中指定的值。
接下来,执行apply操作。
$ terraform apply -var-file=dev/dev.tfvars
・・・
+ display_name = "tf-vcn-dev"
・・・
Apply complete! Resources: 8 added, 0 changed, 0 destroyed.
・・・
然而,若要在此状态下创建生产环境的VCN,将会变为修改而非创建。
这是因为Terraform会在与tf文件相同的目录中创建保存状态的State文件。
$ terraform plan -var-file=prod/prod.tfvars
・・・
Terraform will perform the following actions:
# module.vcn.oci_core_vcn.vcn will be updated in-place
~ resource "oci_core_vcn" "vcn" {
~ display_name = "tf-vcn-dev" -> "tf-vcn-prod"
id = "ocid1.vcn.oc1.ap-sydney-1.amaaaaaassl65iqadp2hm26fetqiws7nbhnvmqglcdb6ko7x265rkufhbyqa"
# (16 unchanged attributes hidden)
}
Plan: 0 to add, 1 to change, 0 to destroy.
如果出现这种情况,似乎需要将tf文件分开。
如果进行搜索,会出现一些目录结构的示例,所以需要参考它们来进行设计。