【问题标题】:Terraform module 1 output as input to module 2Terraform 模块 1 输出作为模块 2 的输入
【发布时间】:2021-07-08 06:57:01
【问题描述】:

我有 2 个 terraform 模块,一个用于从自定义 AMI 启动实例(AMI 备份),另一个用于测试通过此自定义 AMI 启动的实例的状态(1/2 或 2/2 状态)。

我正在使用外部数据源调用 Bash 脚本来获取实例状态。

模块 1(实例 id)的输出可以用作模块 2 的输入吗?因为外部模块中需要实例 id。

 [root@ip-172-16-1-168 devops]# vim main.tf
 module "mymodule" {
 source = "/terraform/devops/modules/AMI_Creation_module"
 qa_instance_type = "t3.medium"
 qa_subnet_id = "subnet-0ab**9a916***4cc"
 qa_key_name = "terraform"
 Environment = "QA"

 module "mymodule2" {
 source = "/terraform/devops/modules/AMI_Status_module"
 qa_instance_type = "module.mymodule2.qa_instance_type"
 qa_subnet_id = "module.mymodule2.qa_subnet_id"
  qa_key_name = "module.mymodule2.qa_key_name"
 Environment = "QA"
 #QA-server-via-ami = ["${module.mymodule.QA-server-via-ami}"]
 }

AMI_Status_Module:

 data "external" "instance_status" {

 program = ["bash", "${path.module}/get_instance_status.sh"]

 query = {
 id = QA-server-via-ami.id
 }
}

output "test" {
value = data.external.instance_status.result
}

Bash 脚本:

 #!/bin/bash

 set -e

 eval "$(jq -r '@sh "INSTANCE_ID=\(.id)"')"

 status=$(aws ec2 describe-instance-status --instance-ids ${INSTANCE_ID} --output json --query 
 'InstanceStatuses[0]')

 instance_status=$(echo ${status} | jq -r '.InstanceStatus.Details[0].Status')
 system_status=$(echo ${status} | jq -r '.SystemStatus.Details[0].Status')

 jq -n --arg inst_status "$instance_status" \
  --arg sys_status "$system_status" \
  '{"instance_status":$inst_status,"system_status":$sys_status}'

我们可以在两个模块之间设置睡眠吗?因为我想要一段时间后的实例状态。

AMI_Creation_Module main.tf : 

terraform {
required_providers {
aws = {
  source  = "hashicorp/aws"
  version = "~> 3.0"
 }
 }
 }

provider "aws" {
region = "us-east-1"
access_key = "A*************"
secret_key = "k**************"
}


 resource "aws_ami_from_instance" "QA-ami" {
 name               = "QA-ami"
 source_instance_id = "i-00f4*******"
 } //line20 


 resource "aws_instance" "QA-server-via-ami" {

ami = aws_ami_from_instance.QA-ami.id
instance_type = var.qa_instance_type
subnet_id = var.qa_subnet_id
key_name = var.qa_key_name
tags = {
    Name = "QA-server-via-ami"
}
}

output "instance_id" {
value = aws.ec2_instance.QA-server-via-ami.id
}

【问题讨论】:

  • 这个问题是怎么解决的?

标签: amazon-web-services terraform terraform-provider-aws


【解决方案1】:

模块 1(实例 id)的输出可以用作模块 2 的输入吗?因为外部模块中需要实例 id。

是的。在您的mymodule 中,您需要定义一些将实例 ID 返回给父模块的输出,例如:

在 mymodule tf 脚本中


output "instance_id" {
  value = aws.ec2_instance.<your-instance>.id
}

然后你将它传递给第二个模块:

module "mymodule2" {
 source = "/terraform/devops/modules/AMI_Status_module"
 qa_instance_type = "module.mymodule2.qa_instance_type"
 qa_subnet_id = "module.mymodule2.qa_subnet_id"

 instance_id = module.mymodule.instance_id

  qa_key_name = "module.mymodule2.qa_key_name"
 Environment = "QA"
 #QA-server-via-ami = ["${module.mymodule.QA-server-via-ami}"]
 }

我们可以在两个模块之间设置睡眠吗?

是的,你可以。有几种方法可以做到这一点。最简单的方法是将 sleep 放入 bash 脚本中:

 #!/bin/bash

 set -e

 eval "$(jq -r '@sh "INSTANCE_ID=\(.id)"')"

 sleep 60 # provide how much time you want to wait. now 60 seconds

 status=$(aws ec2 describe-instance-status --instance-ids ${INSTANCE_ID} --output json --query 
 'InstanceStatuses[0]')

 instance_status=$(echo ${status} | jq -r '.InstanceStatus.Details[0].Status')
 system_status=$(echo ${status} | jq -r '.SystemStatus.Details[0].Status')

 jq -n --arg inst_status "$instance_status" \
  --arg sys_status "$system_status" \
  '{"instance_status":$inst_status,"system_status":$sys_status}'

但如果你只想等到实例状态正常,你可以使用instance-status-ok:

 #!/bin/bash

 set -e

 eval "$(jq -r '@sh "INSTANCE_ID=\(.id)"')"

 aws ec2 wait instance-status-ok --instance-ids ${INSTANCE_ID}

 status=$(aws ec2 describe-instance-status --instance-ids ${INSTANCE_ID} --output json --query 
 'InstanceStatuses[0]')

 instance_status=$(echo ${status} | jq -r '.InstanceStatus.Details[0].Status')
 system_status=$(echo ${status} | jq -r '.SystemStatus.Details[0].Status')

 jq -n --arg inst_status "$instance_status" \
  --arg sys_status "$system_status" \
  '{"instance_status":$inst_status,"system_status":$sys_status}'

【讨论】:

  • 在运行 Terraform 计划时出现错误:错误:在 main.tf 第 20 行,模块“mymodule”中需要参数或块定义:此处需要参数或块定义。
  • @AnkitK “这里”在哪里? 20号线是什么?您的问题不完整,未提供此类信息。这似乎是一个新问题。
  • 我在上面附上了AMI Creation Module main.tf文件,并提到了第20行,请看一下。
  • @AnkitK 错误来自mymodule 所在的文件,而不是模块本身。我建议提出新问题,因为这是新问题。如果我的回答有助于解决您当前关于“睡眠时间”的问题,我们将不胜感激。
  • 我提出了一个新问题,我遇到了外部数据源调用 bash scipt 的问题。stackoverflow.com/questions/67104606/…
猜你喜欢
  • 2021-01-11
  • 2021-02-12
  • 2021-08-16
  • 2021-03-07
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 2020-07-01
  • 2021-04-09
相关资源
最近更新 更多