使用 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文件分开。
如果进行搜索,会出现一些目录结构的示例,所以需要参考它们来进行设计。

bannerAds