如何在Terraform中使用数据源?

use*_*955 19 amazon-web-services terraform

Terraform数据源文档告诉我一个数据源是什么,但我不太明白.有人能给我一个数据源的用例吗?它与使用变量配置的东西有什么区别?

TJ *_*dle 24

可以出于多种原因使用数据源; 但他们的目标是做一些事情,然后给你数据.

我们来自他们的文档中的示例:

# 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
}
Run Code Online (Sandbox Code Playgroud)

这使用了aws_ami数据源 - 这与资源不同!它只会给你信息,而不是创造任何东西.这个例子特别会调用describe-imagesAWS API调用,传递一些--filter指定的选项,并返回一个可以从中获取信息的对象 - 看一下这些属性!

  • 名称
  • owner_id
  • 描述
  • image_id

......名单还在继续.如果我这样做,这非常有用 - 总是希望拉出与某些标签匹配的最新AMI,并保持最新的发布配置.我可以使用此数据提供程序,而不是总是更新变量或硬编码ID.

数据源也可以用于其他原因; 我最喜欢的一个是模板提供者.

祝好运!

  • 嗨,谢谢 TJ。你的回答很明确。我不明白为什么 terraform 没有以您的方式解释什么是数据源。:-) (2认同)

小智 23

Terraform 数据源、资源和变量之间的主要区别是:

资源:在我们的平台上提供资源/基础设施。创建、更新和删除!

多变的:提供预定义值作为 IAC 上的变量。由资源用于配置。

数据源:从我们的基础设施/提供商获取值,并为我们的资源提供数据以配置基础设施/资源。


d4n*_*yll 15

数据源提供有关不由当前Terraform配置管理的实体的信息。

这可能包括:

  • 来自领事的配置数据
  • 有关手动配置的基础结构组件状态的信息

换句话说,数据源是只读视图,可查看配置外部的现有组件的状态。

定义数据源后,就可以在Terraform配置中的其他地方使用数据。

例如,假设我们要为新的AWS EC2实例创建Terraform配置。我们想要使用由Jenkins作业使用AWS CLI创建和上传的AMI图像,而不是由Terraform管理。作为我们Jenkins工作配置的一部分,此AMI映像将始终具有带前缀的名称app-

在这种情况下,我们可以使用aws_ami数据源获取有关具有名称前缀的最新AMI图像的信息app-

data "aws_ami" "app_ami" {
  most_recent = true
  filter {
    name   = "name"
    values = ["app-*"]
  }
}
Run Code Online (Sandbox Code Playgroud)

数据源导出属性,就像资源一样。我们可以使用语法对这些属性进行插值data.TYPE.NAME.ATTR。在我们的示例中,我们可以将AMI ID的值插入为data.aws_ami.app_ami.id,并将其作为ami我们的aws_instanceresource的参数传递。

resource "aws_instance" "app" {
  ami           = "${data.aws_ami.app_ami.id}"
  instance_type = "t2.micro"
}
Run Code Online (Sandbox Code Playgroud)

当检索有关动态实体的信息时,数据源是最强大的- 动态实体的属性经常更改值。例如,下一次Terraform为我们的aws_ami数据源获取数据时,导出属性的值可能会有所不同(我们可能已经构建并推送了新的AMI)。

变量用于静态值,这些值很少更改,例如您的访问权和秘密密钥,或服务器的标准sudoer列表。


Shi*_*arg 12

数据源用于从提供者端获取数据,以便可以将其用作.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"
}
Run Code Online (Sandbox Code Playgroud)