

有些时候在创建资源的时候,会用到一些数据,比如在创建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关键字开头的,然后后面是它的类型,最后语句块里面就是筛选的条件参数了。
i386 and x86_64.system, self, others, marketplace.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:
windows and linux.上面就是数据源的定义,简单了解就是云端的镜像列表,操作系统,磁盘种类这些都可以在这里拿到。

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
- }
- }