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 resource
中filter
可以支持“列表匹配”、“通配符匹配”或者“正则匹配”。具体的匹配方式,则需要通过文档、或者测试区验证。
添加带正则匹配的 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