• 【无标题】


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

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

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

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

    Terraform Registry

    这里的镜像就是创建ecs的时候我们选择的镜像,我们在选镜像的时候也不知道镜像对应的ID是多少,这个其实可以通过provider里面去查到。

    1. # Declare the data source
    2. data "alicloud_instance_types" "types_ds" {
    3. availability_zone = "cn-hangzhou-b"
    4. cpu_core_count = 1
    5. memory_size = 1
    6. }
    7. data "alicloud_images" "images_ds" {
    8. owners = "system"
    9. name_regex = "^centos_7"
    10. os_type = "linux"
    11. architecture = "x86_64"
    12. instance_type = "ecs.n1.tiny"
    13. }
    14. output "instance_types" {
    15. value = data.alicloud_instance_types.types_ds.instance_types.*.id
    16. }
    17. output "images_id" {
    18. value = data.alicloud_images.images_ds.images.*.id
    19. }
    20. Changes to Outputs:
    21. + images_id = [
    22. + "centos_7_9_uefi_x64_20G_alibase_20210611.vhd",
    23. + "centos_7_9_x64_20G_alibase_20220824.vhd",
    24. + "centos_7_8_x64_20G_alibase_20211130.vhd",
    25. + "centos_7_7_x64_20G_alibase_20211130.vhd",
    26. + "centos_7_6_x64_20G_alibase_20211130.vhd",
    27. + "centos_7_5_x64_20G_alibase_20211130.vhd",
    28. + "centos_7_04_64_20G_alibase_201701015.vhd",
    29. + "centos_7_03_64_20G_alibase_20170818.vhd",
    30. + "centos_7_02_64_20G_alibase_20170818.vhd",
    31. ]
    32. + instance_types = [
    33. + "ecs.n1.tiny",
    34. ]

    通过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中定义的名字去调用就行了。 

    1. Changes to Outputs:
    2. + images_id = [
    3. + {
    4. + architecture = "x86_64"
    5. + creation_time = "2021-06-25T07:53:29Z"
    6. + description = ""
    7. + disk_device_mappings = []
    8. + id = "centos_7_9_uefi_x64_20G_alibase_20210611.vhd"
    9. + image_id = "centos_7_9_uefi_x64_20G_alibase_20210611.vhd"
    10. + image_owner_alias = "system"
    11. + image_version = ""
    12. + is_copied = false
    13. + is_self_shared = ""
    14. + is_subscribed = false
    15. + is_support_io_optimized = true
    16. + name = "centos_7_9_uefi_x64_20G_alibase_20210611.vhd"
    17. + os_name = "CentOS 7.9 64位 UEFI版"
    18. + os_name_en = "CentOS 7.9 64 bit UEFI Edition"
    19. + os_type = "linux"
    20. + platform = "CentOS"
    21. },
    22. + {
    23. + architecture = "x86_64"
    24. + creation_time = "2022-08-31T06:33:47Z"
    25. + description = ""
    26. + disk_device_mappings = []
    27. + id = "centos_7_9_x64_20G_alibase_20220824.vhd"
    28. + image_id = "centos_7_9_x64_20G_alibase_20220824.vhd"
    29. ...........................................
    30. },

    拿到所有镜像,包含镜像具体信息

    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值。

    1. data "huaweicloud_vpc_subnet" "mynet" {
    2. name = "terraform_subnet_webapp"
    3. }
    1. output "mynet" {
    2. value = data.huaweicloud_vpc_subnet.mynet.id
    3. }

    完整示例如下:

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

    1. data "huaweicloud_availability_zones" "myaz" {}
    2. data "huaweicloud_compute_flavors" "myflavor" {
    3. availability_zone = data.huaweicloud_availability_zones.myaz.names[0]
    4. performance_type = "normal"
    5. cpu_core_count = 2
    6. memory_size = 4
    7. }
    8. data "huaweicloud_vpc_subnet" "mynet" {
    9. name = "subnet-default"
    10. }
    11. data "huaweicloud_images_image" "myimage" {
    12. name = "Ubuntu 18.04 server 64bit"
    13. most_recent = true
    14. }
    15. resource "huaweicloud_compute_instance" "basic" {
    16. name = "basic"
    17. image_id = data.huaweicloud_images_image.myimage.id
    18. flavor_id = data.huaweicloud_compute_flavors.myflavor.ids[0]
    19. security_groups = ["default"]
    20. availability_zone = data.huaweicloud_availability_zones.myaz.names[0]
    21. network {
    22. uuid = data.huaweicloud_vpc_subnet.mynet.id
    23. }
    24. }
  • 相关阅读:
    【c++设计模式之中介者模式】分析及示例
    玩转输入输出
    【数据结构】直接插入排序 & 希尔排序(一)
    docker安装es与kibana
    TypeScript中报错:元素隐式具有 “any“ 类型,因为类型为 “XXX“ 的表达式不能用于索引类型。
    计算机毕业设计(附源码)python游泳馆管理平台
    关于mac终端 无法显示中文 + echo cut 组合问题
    腾讯待办是什么?关停之后如何继续提醒待办事项?
    C#.NET Framework 使用BC库(BouncyCastle) RSA 公钥加密 私钥解密 ver:20230706
    护理教育学考试复习题
  • 原文地址:https://blog.csdn.net/qq_34556414/article/details/127550461