数据源
请注意:数据源是从 Packer 1.7 及之后的版本开始支持的。
数据源允许在 locals
和 sources
配置中查询或计算数据。使用数据源使得我们可以在构建器中使用在 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
}