【问题标题】:Jenkins pipline with terraforn - how to get outpt variable feed into follwing Ansible stage带有 terraforn 的 Jenkins 管道 - 如何将输出变量馈送到以下 Ansible 阶段
【发布时间】:2021-02-13 19:57:30
【问题描述】:

各位, 我将使用 Jenkins Pipeline 来获取 git clone,然后运行 ​​terraform 来部署 AWS 实例,这确实为我提供了一些我在 Ansible Stage 中需要的输出,以使用正确的 IP 和密码。从 terraform 导出一个值并创建一个 Jenkins 变量,我可以在我的 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=terraform.DDVE_public_IP DD_password=terraform.Instance_id"

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

【问题讨论】:

    标签: ansible jenkins-pipeline terraform


    【解决方案1】:

    有很多方法可以做到。

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

    ma​​in.tf / output.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
    }
    

    template.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 变量上设置 terraform 输出:
    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}"
         """
      }
    
    }
    
    

    【讨论】:

    • 正如 Samit 所说,有很多方法可以做到这一点,我会写入 json 文件并使用 jq 提取任何值或写入 yaml 文件并使用 yq。这个 json 或 yaml 文件将在 Jenkins 的工件中
    猜你喜欢
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多