脚本之间共享资源

时间:2019-08-13 08:54:19

标签: terraform

对不起,这个菜鸟问题...我试图找出一种在tf脚本之间共享资源的方法,但是我什么也找不到,所以可能我在寻找错误的关键字...

假设我有3个脚本:

base/base.tf
one/one.tf
two/two.tf

base创建aws vpc和网络负载平衡器 一和二是两个ecs fargate服务。他们创建任务定义,并将mappind添加到网络负载平衡器。

我的目标是要在负载均衡器中跟踪映射的端口,并读取它并从一个和两个更新。

类似 基础将last_port设置为14000 一个读取last_port,加1并更新值 两次读取last_port,加1并更新值

有可能吗?

谢谢

1 个答案:

答案 0 :(得分:0)

在Terraform中解决此问题的一般方法是Data Sources,这是一种特殊资源,可从其他地方检索数据,而不是自己创建和管理对象。

为了使用数据源,您希望共享的数据必须发布在某个地方。为了在Terraem配置之间共享,您需要一个可以同时被Terraform写入和读取的数据存储位置。

自从您提到ECS Fargate以来,我假设您正在使用AWS,在这种情况下,合理的选择是将数据存储在AWS SSM参数存储中,然后让其他配置读出。

创建数据的配置将使用the aws_ssm_parameter resource type创建一个新参数:

resource "aws_ssm_parameter" "foo" {
  name  = "port_number"
  type  = "String"
  value = aws_lb_listener.example.port
}

随后将使用the corresponding data source来读取将使用此数据的配置:

data "aws_ssm_parameter" "foo" {
  name = "port_number"
}

但是,您的问题是关于一种配置读取值,递增值并将新值写回到同一位置的可能性。对于Terraform,这是不可能的,因为Terraform是一个声明式系统,可用于描述静态期望状态。尽管每个对象都可以读取

Terraform将需要以下两种解决方案之一,而不是动态分配端口号:

  • 使用其他系统来持久地管理端口分配,这样,一旦为特定的调用方分配了端口号,它将始终获得相同的端口号。我不知道为此目的构建任何现有系统,因此在这种情况下这可能不是一个可行的选择,但是如果确实存在这样的系统,那么我们将在Terraform中使用代表特定端口的资源类型对其进行建模分配,当不再需要端口时,Terraform最终可以与所有其他基础结构一起破坏。
  • 确定一种系统的方法,为每个系统分配一致的端口号,以便每个配置都可以知道(通过硬编码或确定性的计算)它应该使用哪个端口号。 / li>