Terraform Data Sources documentation告诉我数据源是什么,但我不太明白。有人能给我一个数据源的用例吗?它与使用变量配置内容有什么区别?
答案 0 :(得分:13)
可以出于多种原因使用数据源;但他们的目标是做某事,然后为您提供数据。
让我们从documentation:
中取出示例# Find the latest available AMI that is tagged with Component = web
data "aws_ami" "web" {
filter {
name = "state"
values = ["available"]
}
filter {
name = "tag:Component"
values = ["web"]
}
most_recent = true
}
这使用aws_ami数据源 - 这与资源不同!它只会给你信息,而不是创造任何东西。这个例子特别会调用describe-images
AWS API调用,传入一些指定的--filter
个选项,并返回一个可以从中获取信息的对象 - 看看这些{{3 }}!
......名单还在继续。如果我这样做,这非常有用 - 请说 - 总是希望拉出与某些标签匹配的最新AMI,并使其保持最新的启动配置。我可以使用这个数据提供程序而不是总是更新变量或硬编码ID。
数据源也可以用于其他原因;我最喜欢的一个是attributes。
祝你好运!答案 1 :(得分:8)
数据源提供有关当前不受Terraform配置管理的实体的信息。
这可能包括:
换句话说,数据源是只读视图,用于查看配置外部的现有组件的状态。
一旦定义了数据源,就可以在Terraform配置中的其他地方使用数据。
例如,假设我们要为新的AWS EC2实例创建Terraform配置。我们想要使用由Jenkins作业使用AWS CLI创建和上传的AMI图像,而不是由Terraform管理。作为我们Jenkins工作配置的一部分,此AMI映像将始终具有一个前缀为app-
的名称。
在这种情况下,我们可以使用aws_ami
data source获取有关名称为app-
的最新AMI图像的信息。
data "aws_ami" "app_ami" {
most_recent = true
filter {
name = "name"
values = ["app-*"]
}
}
数据资源导出属性,就像资源一样。我们可以使用语法data.TYPE.NAME.ATTR
内插这些属性。在我们的示例中,我们可以将AMI ID的值插值为data.aws_ami.app_ami.id
,并将其作为aws_instance
resource的ami
参数传递。
resource "aws_instance" "app" {
ami = "${data.aws_ami.app_ami.id}"
instance_type = "t2.micro"
}
数据源在检索有关 dynamic 实体的信息时功能最强大-实体的属性经常更改值。例如,下次Terraform为我们的aws_ami
数据源获取数据时,导出的属性的值可能会有所不同(我们可能已经构建并推送了新的AMI)。
变量用于 static 值,这些值很少更改,例如您的访问权限和密钥,或服务器的标准sudoer列表。
答案 2 :(得分:0)
数据源用于从提供程序端获取数据,以便可以将其用作.tf文件中的配置,而不是对其进行硬编码。示例:下面的代码获取AWS AMI ID并将其用于启动AWS实例。
data "aws_ami" "std_ami" {
most_recent = true
owners = ["amazon"]
filter {
name = "root-device-type"
values = ["ebs"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
}
resource "aws_instance" "myec2" {
ami = data.aws_ami.std_ami.id
instance_type = "t2.micro"
}