简体   繁体   中英

Terraform module 1 output as input to module 2

I have 2 terraform modules, one for Launching instance from custom AMI (AMI Backup) and another to test the status of instance (1/2 or 2/2 status) launched via this custom AMI.

I am using external data source calling the Bash script for instance status.

Can the output of module 1(instance id) be used as a input to module 2?as instance id is required in external module.

 [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 Script:

 #!/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}'

can we put sleep between the two modules?as i want instance status after some time.

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
}

Can the output of module 1(instance id) be used as a input to module 2?as instance id is required in external module.

Yes. In your mymodule you would need to define some output that returns the instance id to parent module, eg:

In mymodule tf script


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

Then you pass it to the second module:

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}"]
 }

can we put sleep between the two modules?

Yes you can. There are several ways of doing this. The easiest would be to put sleep in your bash script:

 #!/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}'

But if you want to wait only until instance status is ok, you can use 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}'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM