Terraform中如何使用数据源



Terraform数据源文档告诉我什么是数据源,但我不太了解。有人可以给我一个数据源的用例吗?它与使用变量配置某些东西有什么区别?

数据源可用于多种原因;但是他们的目标是做某事,然后给您数据

让我们以他们的文档为例:

# 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选项传递,然后返回一个可以从中获取信息的对象 - 查看这些属性!

  • 名称
  • 所有者_id
  • 描述
  • image_id

...列表继续。假设我总是想拉出最新的AMI匹配某些标签,并将启动配置与之保持最新,这真的很有用。我可以使用此数据提供商,而不是始终需要更新变量或硬编码ID。

数据源也可用于其他原因;我的最爱之一是模板提供商。

祝你好运!

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

这可能包括:

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

换句话说,数据源是 访问我们配置外部的预先存在组件的状态。

定义了数据源后,您可以使用Terraform配置中其他位置的数据。

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

在这种情况下,我们可以使用aws_ami数据源来获取有关具有名称前缀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资源的ami参数传递。

resource "aws_instance" "app" {
  ami           = "${data.aws_ami.app_ami.id}"
  instance_type = "t2.micro"
}

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

变量用于 static 值,那些很少更改的变量,例如访问和秘密键或服务器的标准sudoer列表。

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

资源:我们平台上资源/下文的配置。创建,更新和删除!

变量:将预定义值作为我们IAC上的变量。资源用于配置。

数据源:从我们的Infra/提供商中获取值,并为我们的资源提供数据以提供INFRA/资源。

数据源用于从提供商端获取数据,因此可以用作.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"
}

最新更新