Terraform 语法 DataSource 数据源

有些时候在创建资源的时候,会用到一些数据,比如在创建ecs的时候,我可能会用到一些镜像。这个我们可以去浏览云供应商提供的文档去查询,其实我们也可以通过provider来拿到,provider里面是有这些数据的。

provider里面其实是由两部分组成的,提供了两部分数据。一部分是resource资源,每个磁盘,每个域名都是资源。

这些data source都是通过provider帮我们集成好的,只要在tf里面使用了provider之后,都可以通过data格式去定义我们的数据源。

数据源说白了就是云供应商为我们提供的数据。

Terraform Registry

这里的镜像就是创建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 and x86_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 systemselfothersmarketplace.
  • 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 and linux.
  • 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
}

完整示例如下:

terraform-provider-huaweicloud/main.tf at master · huaweicloud/terraform-provider-huaweicloud · GitHub

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

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/127550461