【问题标题】:How can I reuse the terraform output values in another deployment如何在另一个部署中重用 terraform 输出值
【发布时间】:2021-11-06 08:04:28
【问题描述】:

我有一个 terraform 代码,用于部署 Azure 资源并输出我需要用于进一步配置的一堆值。

我已初始化 terraform 后端并将状态保存到 Azure 存储帐户,我看到 tfstate 文件具有所有正确的值。

仅供参考,我已经添加了此配置,但仍然没有运气,我还在第二个位置运行 terraform init 命令,因此后端以相同的状态初始化:

  backend "azurerm" {
    storage_account_name  = "${var.STATE_STORAGE_ACCOUNT_NAME}"
    container_name        = "${var.STATE_CONTAINER_NAME}"
    key                   = "${var.STATE_STORAGE_ACCOUNT_KEY}"
  }

我想要做的是以某种方式拉动这个状态,这样我就可以在与我部署资源的位置不同的位置执行 terraform output -raw some_output。

我似乎找不到办法做到这一点。这怎么可能实现?谢谢

【问题讨论】:

    标签: azure terraform


    【解决方案1】:

    这真的取决于您的用例。您可以采取两种不同的方法:

    使用“数据”源导入资源

    数据源允许 Terraform 使用在 Terraform 之外定义、由另一个单独的 Terraform 配置定义或由函数修改的信息。
    Terraform docs

    对于 AWS,它会是这样的:

    // create ssm parameter in Terraform code A
    resource "aws_ssm_parameter" "secret" {
      name  = "/secret"
      type  = "String"
      value = "SecretValue"
    }
    
    // Import this resource in Terraform code B
    data "aws_ssm_parameter" "imported_secret" {
      name = "/secret"
    }
    
    // So later you can reference it
    locals any {
      secretValue = data.aws_ssm_parameter.secret.value
    }
    

    创建模块

    模块是一起使用的多个资源的容器。一个模块由保存在一个目录中的 .tf 和/或 .tf.json 文件的集合组成。模块是使用 Terraform 打包和重用资源配置的主要方式。
    Terraform docs

    这是 Terraform 模块的基本示例。我们创建了模块vpc,其中该模块的源位于../../modules/vpc 目录中,并且我们在rds 模块中通过module.vpc 引用了该模块。

    module "vpc" {
      source = "../../modules/vpc"
    
      env = var.env
      azs = var.azs
    
      cidr = var.cidr
    
      db_subnets = var.db_subnets
      private_subnets = var.private_subnets
      public_subnets = var.public_subnets
    }
    
    
    module "rds" {
      source = "../../modules/rds"
    
      db_subnets_cidr_blocks = module.vpc.db_subnets_cidr_block
      private_subnets_cidr_blocks = module.vpc.private_subnets_cidr_block
      public_subnets_cidr_blocks = module.vpc.public_subnets_cidr_block
    
      vpc_id = module.vpc.vpc_id
    
      env = var.env
    
      db_subnets_ids = module.vpc.db_subnets
    }
    

    【讨论】:

      【解决方案2】:

      我没有找到直接的方法来做到这一点,所以解决方案是,因为状态文件被保存到 Azure Blob 存储:

      1. 运行 Azure CLI 命令以在本地获取 blob:

        az storage blob download --container-name tstate --file $tf_state_file_name --name $tf_state_file_name --account-key $tf_state_key --account-name $tf_state_storage_account_name
        

        本地文件名在哪里:$tf_state_file_name

      2. 使用 JQ 读取所需的值:

        jq '.outputs.storage_account_name.value' ./$tf_state_file_name -r
        

        借助-r 参数,您可以读取原始值。这和做的一样:

        terraform output -raw storage_account_name
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-26
        • 1970-01-01
        • 2022-07-11
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        • 2021-03-21
        • 1970-01-01
        相关资源
        最近更新 更多