使用 Terraform 自动化获取 Oracle Cloud上支持的 MySQL 版本

Terraform 可以自动化的创建云端的资源,但是要想实现更高的灵活度,则需要更为灵活的使用Terraform的“Data Sources”能力。例如,在自动化的创建数据库时,云厂商允许创建的版本号是在动态变化的,例如,当前最新的允许的创建的MySQL版本通常是 8.0.40,但通常过了一个季度之后,就变成了 8.0.41。这时,对应的 Terraform 的脚本就需要调整或者传递参数就需要发生变化。而 Terraform 提供的 “Data Sources” 能力则可以很好的解决这个问题。

在 Oracle 的 Terraform 中可以使用 “Data Source: oci_mysql_mysql_versions” 实现该能力。

示例

首先使用 data 命令定义该对象:

data "oci_mysql_mysql_versions" "gmv" {
    compartment_id = oci_identity_compartment.oic.id
}

这里会获取该租户环境下支持的所有MySQL版本。

然后,再使用 output 命令就可以获取并输出这些版本信息。详细的output命令如下:

output "mysql_version" {
  value       = data.oci_mysql_mysql_versions.gmv.versions
}

详细的输出示例如下:

mysql_version = tolist([
  {
    "version_family" = "8.0"
    "versions" = tolist([
      {
        "description" = "8.0.36"
        "version" = "8.0.36"
      },
      {
        "description" = "8.0.37"
        "version" = "8.0.37"
      },
      {
        "description" = "8.0.38"
        "version" = "8.0.38"
      },
      {
        "description" = "8.0.39"
        "version" = "8.0.39"
      },
      {
        "description" = "8.0.40"
        "version" = "8.0.40"
      },
      {
        "description" = "8.0.41"
        "version" = "8.0.41"
      },
    ])
  },
  {
    "version_family" = "8.4 - LTS"
    "versions" = tolist([
      {
        "description" = "8.4.0"
        "version" = "8.4.0"
      },
      {
        "description" = "8.4.1"
        "version" = "8.4.1"
      },
      {
        "description" = "8.4.2"
        "version" = "8.4.2"
      },
      {
        "description" = "8.4.3"
        "version" = "8.4.3"
      },
      {
        "description" = "8.4.4"
        "version" = "8.4.4"
      },
    ])
  },
  {
    "version_family" = "9 - Innovation"
    "versions" = tolist([
      {
        "description" = "9.1.0"
        "version" = "9.1.0"
      },
      {
        "description" = "9.1.1"
        "version" = "9.1.1"
      },
      {
        "description" = "9.1.2"
        "version" = "9.1.2"
      },
      {
        "description" = "9.2.0"
        "version" = "9.2.0"
      },
    ])
  },
])

获取特定大版本的各小版本

可以通过 data资源中新增filter模块以过滤出需要的对象。

在 Terraform 中,关于 data 资源是否可以使用 filter,以及filter支持的完整度视乎并没有明确的说明。这需要更具不同的供应商的实现。常见的,在data resourcefilter可以支持“列表匹配”、“通配符匹配”或者“正则匹配”。具体的匹配方式,则需要通过文档、或者测试区验证。

添加带正则匹配的 filter
data "oci_mysql_mysql_versions" "gmv" {
    #Required
    compartment_id = oci_identity_compartment.oic.id
    filter {
        name = "version_family"
        values = ["8.0.*"]
        regex  = true
    }
}

通过 HCL 语言获取最新的版本
output "latest_versions" {
  value = {
    for db_version in data.oci_mysql_mysql_versions.gmv.versions : db_version.version_family => sort([
      for v in db_version.versions : v.version
    ])[length(db_version.versions) - 1] // 取排序后的最后一个版本
  }
}

最后的输出如下:

latest_versions = {
  "8.0" = "8.0.41"
  "8.4 - LTS" = "8.4.4"
  "9 - Innovation" = "9.2.0"
}

参考链接

Leave a Reply

Your email address will not be published. Required fields are marked *