有些时候在创建资源的时候,会用到一些数据,比如在创建ecs的时候,我可能会用到一些镜像。这个我们可以去浏览云供应商提供的文档去查询,其实我们也可以通过provider来拿到,provider里面是有这些数据的。
provider里面其实是由两部分组成的,提供了两部分数据。一部分是resource资源,每个磁盘,每个域名都是资源。
这些data source都是通过provider帮我们集成好的,只要在tf里面使用了provider之后,都可以通过data格式去定义我们的数据源。
数据源说白了就是云供应商为我们提供的数据。
这里的镜像就是创建ecs的时候我们选择的镜像,我们在选镜像的时候也不知道镜像对应的ID是多少,这个其实可以通过provider里面去查到。
# Declare the data source
data "alicloud_instance_types" "types_ds" {
availability_zone = "cn-hangzhou-b"
cpu_core_count = 1
memory_size = 1
}
data "alicloud_images" "images_ds" {
owners = "system"
name_regex = "^centos_7"
os_type = "linux"
architecture = "x86_64"
instance_type = "ecs.n1.tiny"
}
output "instance_types" {
value = data.alicloud_instance_types.types_ds.instance_types.*.id
}
output "images_id" {
value = data.alicloud_images.images_ds.images.*.id
}
Changes to Outputs:
+ images_id = [
+ "centos_7_9_uefi_x64_20G_alibase_20210611.vhd",
+ "centos_7_9_x64_20G_alibase_20220824.vhd",
+ "centos_7_8_x64_20G_alibase_20211130.vhd",
+ "centos_7_7_x64_20G_alibase_20211130.vhd",
+ "centos_7_6_x64_20G_alibase_20211130.vhd",
+ "centos_7_5_x64_20G_alibase_20211130.vhd",
+ "centos_7_04_64_20G_alibase_201701015.vhd",
+ "centos_7_03_64_20G_alibase_20170818.vhd",
+ "centos_7_02_64_20G_alibase_20170818.vhd",
]
+ instance_types = [
+ "ecs.n1.tiny",
]
通过data定义数据源,然后里面的属性是帮助我们去筛选数据的,因为镜像有很多种类型,可能来自于公共市场,也有可能自己定义的,还有系统,阿里这边提供的。
按照名称分类还要分为不同的版本,比如centos 7,centos 8版本。
所以需要筛选数据。
筛选完数据如何去引用呢?这里output也是变量的一种类型,叫做输出变量。在学编程语言的时候有输入和输出,return函数返回值,这里output就可以理解为函数的返回,这里输出就是打印这个值,而且还可以提供为其他模块调用这些值。
这里output就是为了验证我们拿到的数据,也就是镜像源里面的镜像。
provider里面有很多很多的数据源,我们都可以去使用,这里语法是以data关键字开头的,然后后面是它的类型,最后语句块里面就是筛选的条件参数了。
- architecture - (Optional, Available in 1.95.0+) The image architecture. Valid values:
i386
andx86_64
.
- name_regex - (Optional) A regex string to filter resulting images by name.
- owners - (Optional) Filter results by a specific image owner. Valid items are
system
,self
,others
,marketplace
.
- output_file - (Optional) File name where to save data source results (after running
terraform plan
).(阿里云特性,可以将输出写到文件里面)
status - (Optional, Available in 1.95.0+) The status of the image. The following values are available, Separate multiple parameter values by using commas (,). Default value: Available
. Valid values:
- Available: The image is available.(镜像是否可用)
- os_type - (Optional, Available in 1.95.0+) The operating system type of the image. Valid values:
windows
andlinux
.
- instance_type - (Optional, Available in 1.95.0+) The instance type for which the image can be used.
上面就是数据源的定义,简单了解就是云端的镜像列表,操作系统,磁盘种类这些都可以在这里拿到。
Datasource-引用方式
output就是将值传递出去。
可以看到所有镜像的id都可以拿到,这些镜像都是我们筛选的结果。
两种打印方式,一种通过输出文件的方式,另外一种是通过output打印到终端。
value = data.alicloud_images.images_ds.images" 拿到全部镜像,返回的是一个数组,具体的使用某个镜像id: image_id = data.alicloud_images.images_ds.images[0].id
如果要调用output的输出,就通过output中定义的名字去调用就行了。
Changes to Outputs:
+ images_id = [
+ {
+ architecture = "x86_64"
+ creation_time = "2021-06-25T07:53:29Z"
+ description = ""
+ disk_device_mappings = []
+ id = "centos_7_9_uefi_x64_20G_alibase_20210611.vhd"
+ image_id = "centos_7_9_uefi_x64_20G_alibase_20210611.vhd"
+ image_owner_alias = "system"
+ image_version = ""
+ is_copied = false
+ is_self_shared = ""
+ is_subscribed = false
+ is_support_io_optimized = true
+ name = "centos_7_9_uefi_x64_20G_alibase_20210611.vhd"
+ os_name = "CentOS 7.9 64位 UEFI版"
+ os_name_en = "CentOS 7.9 64 bit UEFI Edition"
+ os_type = "linux"
+ platform = "CentOS"
},
+ {
+ architecture = "x86_64"
+ creation_time = "2022-08-31T06:33:47Z"
+ description = ""
+ disk_device_mappings = []
+ id = "centos_7_9_x64_20G_alibase_20220824.vhd"
+ image_id = "centos_7_9_x64_20G_alibase_20220824.vhd"
...........................................
},
拿到所有镜像,包含镜像具体信息
value = data.alicloud_images.images_ds.images
拿到所有镜像的id
value = data.alicloud_images.images_ds.images.*.id
拿到指定镜像的id
value = data.alicloud_images.images_ds.images[0].id
在ecs里面去引用
所有数据源的定义都需要去看官方文档,它的格式就是data,后面类型加上名称,最后就是筛选数据的一些参数。参数越多也就是条件越多,可能筛选出来就更加精确。
最后如果镜像不经常换,那么可以将镜像的ID号写死。
输出可以输出到json文件里面,另外可以输出到终端。
最后举个例,如果要拿到以及创建好的华为云上资源的信息可以使用如下:
这个资源是已经创建的,我要通过其名称拿到其属性id值。
data "huaweicloud_vpc_subnet" "mynet" {
name = "terraform_subnet_webapp"
}
output "mynet" {
value = data.huaweicloud_vpc_subnet.mynet.id
}
完整示例如下:
data "huaweicloud_availability_zones" "myaz" {}
data "huaweicloud_compute_flavors" "myflavor" {
availability_zone = data.huaweicloud_availability_zones.myaz.names[0]
performance_type = "normal"
cpu_core_count = 2
memory_size = 4
}
data "huaweicloud_vpc_subnet" "mynet" {
name = "subnet-default"
}
data "huaweicloud_images_image" "myimage" {
name = "Ubuntu 18.04 server 64bit"
most_recent = true
}
resource "huaweicloud_compute_instance" "basic" {
name = "basic"
image_id = data.huaweicloud_images_image.myimage.id
flavor_id = data.huaweicloud_compute_flavors.myflavor.ids[0]
security_groups = ["default"]
availability_zone = data.huaweicloud_availability_zones.myaz.names[0]
network {
uuid = data.huaweicloud_vpc_subnet.mynet.id
}
}