Jenkins pipline与terraforn-如何将变量输出到后续的Ansible阶段



各位,我将使用Jenkins Pipeline来获得一个git克隆,然后运行一个terraform来部署一个AWS实例,这确实为我的Ansible阶段提供了一些需要的输出,以使用正确的IP和密码。从terraform导出一个值,并创建一个Jenkis-var,我可以在我的Jenkinsfile中为Ansible剧本使用它。

Terraform output.tf将显示给我:

output "S3_bucket_name" {
value       = aws_s3_bucket.ddve6.bucket
description = "The value you do need for DDVE configuration on the bucket name!"
}
output "Instance_id" {
value       = aws_instance.terraform_ddve.id
description = "EC2 instance ID for default sysadmin password"
}
output "DDVE_public_IP" {
value       = aws_instance.terraform_ddve.public_ip
description = "Public IP of your DDVE"
}
output "DDVE_DNS_Name" {
value       = aws_instance.terraform_ddve.public_dns
description = "Public DNS name of your DDVE"
}
output "Anzahl_Metadisk" {
value       = var.amount_of_metadisk
description = "Amount of attached metadata disk"
}

如何创建可以在上使用的Jenkins变量

ansible playbook release.yml——extra vars"DD_IP=地形.DDVE_public_IP DD_password=地形.Instance_id";

我正在寻找一些如何交换不同阶段的数据并使用它们的例子。

有很多方法可以做到这一点。

  1. 通过使用terraform模板,您可以生成预期的YAML文件,并在运行ansible时使用该文件。terraform templatefile-将向您解释模板的工作原理对于您的场景,它将是这样的:

main.tf/输出.tf

locals {
someVariable = templatefile("${path.module}/template.tpl", {
dd_ip = aws_instance.terraform_ddve.public_ip, 
dd_password = aws_instance.terraform_ddve.id
})
}
output "neededForAnsible" {
value = local.someVariable
}

模板.tpl

DD_IP = ${dd_ip}
DD_password = ${dd_password} 

Jenkinsfile

node {
stage('terraform') {
sh """
terraform init
terraform plan
terraform apply --auto-approve
"""
//write the template output in a file
def fileContent = sh(returnStdout: true, script: "terraform output neededForAnsible")
writeFile file: "${WORKSPACE}/vars.yaml", text: fileContent
}
stage('ansible') {
sh """
ansible-playbook release.yml -e @vars.yaml
"""
}
}
  1. 在groovy变量上设置地形输出:
def dd_ip
def dd_password
node {
stage('terraform) {
sh """
terraform init
terraform plan
terraform apply --auto-approve
"""
// inject terraform out to a groovy variable
dd_ip = sh(returnStdout: true, script: "terraform output DDVE_public_IP").trim()
dd_password = sh(returnStdout: true, script: "terraform output Instance_id").trim()

}
stage('ansible') {
sh """
ansible-playbook release.yml --extra-vars "DD_IP=${dd_ip} DD_password=${dd_password}"
"""
}
}

最新更新