【问题标题】:How can i pass variables from jenkins file to terraform我如何将变量从 jenkins 文件传递​​到 terraform
【发布时间】:2020-11-21 23:43:22
【问题描述】:

当我在 variable.tf 中使用局部变量运行 terraform 时,一切都像魅力一样 我想在 terraform variable.tf 文件中传递 Jenkins 参数,因此它将是来自 Jenkins 的动态 我怎样才能实现它?

pipeline {
    agent any
    options {
        skipDefaultCheckout true
    }
    environment {
       TF_VAR_datacenter="${DATA_CENTER}"
       TF_VAR_cluster="${CLUSTER}"
       TF_VAR_esxi="${ESXI}"
       TF_VAR_datastore="${DATASTORE}"
       TF_VAR_network="${NETWORK}"
       TF_VAR_server_hostname="${SERVER_HOSTNAME}"
       TF_VAR_server_mac="${SERVER_MAC}"
    }
    parameters {
        string(name: 'DATA_CENTER', defaultValue: 'xxx', description: 'vcenter data center',)
        string(name: 'CLUSTER', defaultValue: 'xxx', description: 'data center cluster',)
        string(name: 'ESXI', defaultValue: 'xxx', description: 'esxi hostname',)
        string(name: 'DATASTORE', defaultValue: 'xxx', description: 'data center datastore',)
        string(name: 'NETWORK', defaultValue: 'xxx', description: 'data center network',)
        string(name: 'SERVER_HOSTNAME', defaultValue: 'xxx', description: 'server hostname',)
        string(name: 'SERVER_MAC', defaultValue: 'xxx', description: 'server mac',)
        string(name: 'SERVER_IP', defaultValue: 'xxx', description: 'server ip',)
        string(name: 'SERVER_NETMASK', defaultValue: 'xxx', description: 'server netmask',)
        string(name: 'SERVER_GATEWAY', defaultValue: 'xxx', description: 'server gateway',)
        string(name: 'COBBLER_PROFILE', defaultValue: 'xxx', description: 'cobbler profile',)
        choice(name: 'BUILD_DESTROY', description: '', choices: ['build' , 'destroy'])
    }

    stages {
        stage('OS PROVISION') {
            steps {
                dir("/root/terraform"){
                    sh """
                    export TF_VAR_datacenter=${DATA_CENTER}
                    export TF_VAR_cluster=${CLUSTER}
                    export TF_VAR_esxi=${ESXI}
                    export TF_VAR_datastore=${DATASTORE}
                    export TF_VAR_network=${NETWORK}
                    export TF_VAR_server_hostname=${SERVER_HOSTNAME}
                    export TF_VAR_server_mac=${SERVER_MAC}
                    terraform init
                    terraform apply -auto-approve
                    """
                }
            }
        }
    }
    post {
         always {
             echo 'This will always run'
         }

    }
}

【问题讨论】:

  • 您的示例应该可以正常工作,但在 CLI 中使用 -var 参数可能会更容易。
  • 使用环境块时,不再需要再次导出。它是重复的。顺便说一句,我不明白你的问题。你的例子不起作用?

标签: jenkins-pipeline terraform


【解决方案1】:

我更喜欢使用这种格式:

terraform apply \
  -var 'vpc_id=$(AWS_VPC_ID)' \
  -var 'subnet_id=$(AWS_SUBNET_ID)' \
  -var 'aws_region=$(AWS_REGION)' \
  -var 'ami_id=$(AMI_ID)'\
  -var 'instance_type=$(AWS_EC2_TYPE)' \
  -var 'key_pair=$(KEY_PAIR_NAME)' \
  -var 'tags={ "Owner":"$(OWNER)", "Service":"$(SERVICE)", "Terraform":"true", "Env":"$(ENV)" }'

【讨论】:

    【解决方案2】:

    你的问题需要更清楚一些,但我会做一些有根据的猜测。

    在 variable.tf 中带有局部变量

    你的意思是locals {,或者你所说的局部变量到底是什么意思?

    在 terraform variable.tf 文件中传递 Jenkins 参数

    这不是“传递参数”的正确文件。 *.tf 文件用于声明变量。 您可能正在查看*.tfvars 文件。

    *.tfvars 文件有 3 个选项:

    1. 一个完全命名为terraform.tfvars的文件
    2. 一个名为<anything>.auto.tfvars的文件
    3. 一个名为 <anything>.tfvars 的文件,您使用 -var-file CLI 参数引用该文件。

    *.tfvars 文件的格式很简单: var1_name = var1_value

    您可以(必须)使用通常的 HCL 标记来处理、列表、地图……

    【讨论】:

    • 我放弃并通过 -var 选项传递了它
    • 如果您向我展示您的代码,我可以帮助您找出问题所在。
    猜你喜欢
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多