数据源

原文


请注意:数据源是从 Packer 1.7 及之后的版本开始支持的。

数据源允许在 localssources 配置中查询或计算数据。使用数据源使得我们可以在构建器中使用在 Packer 之外定义的信息。

使用数据源

使用 data 块声明数据源,配置如下所示:

data "amazon-ami" "example" {
    filters = {
        virtualization-type = "hvm"
        name = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
        root-device-type = "ebs"
    }
    owners = ["099720109477"]
    most_recent = true
}

data 块请求 Packer 从给定的数据源(“amazon-ami”)读取并在给定的本地名称(“example”)下输出结果。该名称可以被用于从同一 Packer 配置中的其他地方引用此数据源。

data 块创建一个指定类型(第一个块标签)和名称(第二个块标签)的 data 实例。类型和名称的组合在配置文件中必须是唯一的。

在块({})内是 data 实例的参数。参数取决于类型,并在数据源部分按类型分开说明。比如,我们可以在这里访问类型为 amazon-ami 的数据源文档。

数据源可以输出一个或多个属性,可以通过将它们的键名添加到数据源唯一标识符后面来使用,如data.<TYPE>.<NAME>.<ATTRIBUTE>

上面例子里的 amazon-ami.example 的输出可以按如下方式访问:

输出数据:

"data.amazon-ami.example" {
  id = "ami12345"
  name = "MyAMI"
  creation_date = "01/01/2021"
  owner = "123456789"
  owner_name = "Some Name"
  tags = {"tag1": "value"}
}

用法:

// in a local
locals {
  source_ami_id = data.amazon-ami.example.id
  source_ami_name = data.amazon-ami.example.name
 }
// in a source
source "amazon-ebs" "basic-example" {
  source_ami = locals.source_ami
  // ...
}

已知的限制

目前不支持在数据源(data source)中使用局部变量,例如下面的示例。

locals {
  cloud_owners           = ["happycloud"]
  cloud_base_filter_name = "cloud-hvm-2.0.*-x86_64-gp2"
}

data "happycloud" "happycloud-linux2-east" {
  filters = {
    name = local.cloud_base_filter_name
  }
  most_recent = true
  owners = local.cloud_owners
}

局部变量可以引用数据源,但数据源为了避免循环依赖所以不能引用局部变量,因为被引用的局部变量可能引用了数据源自身,或者引用了那些引用了该数据源的局部变量。目前,在数据源中引用用户输入数据的首选方法是使用 variable 块。

variable "cloud_base_filter_name" {
  type     = string
  default  = "cloud-hvm-2.0.*-x86_64-gp2"
}

variable "cloud_owners" {
  type     = string
  default  = "happycloud"
}

data "happycloud" "happycloud-linux2-east" {
  filters = {
    name =  var.cloud_base_filter_name
  }
  most_recent = true
  owners = var.cloud_owners
}

results matching ""

    No results matching ""