You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Azure DevOps Pipeline+Terraform部署Oracle Cloud资源并存储状态文件

解决方案:Azure DevOps Pipeline + Terraform 部署 OCI 资源并存储状态到 Azure 存储账户

一、OCI Provider 支持情况

Terraform 官方维护的 Oracle Cloud Infrastructure(OCI)Provider 是完全支持的,版本迭代活跃,能覆盖计算、网络、存储、数据库等绝大多数 OCI 资源的创建与管理。你可以直接在 Terraform 配置中引用该 Provider,示例如下:

terraform {
  required_providers {
    oci = {
      source  = "oracle/oci"
      version = "~> 5.0" # 建议使用最新稳定版
    }
  }
}

provider "oci" {
  tenancy_ocid     = var.tenancy_ocid
  user_ocid        = var.user_ocid
  fingerprint      = var.fingerprint
  private_key      = var.private_key # 或通过路径引用私钥文件
  region           = var.region
}

二、配置 Terraform 状态文件存储到 Azure 存储账户

1. 前置准备

先在 Azure 上创建一个存储账户和 Blob 容器:

  • 存储账户需启用Blob 存储功能
  • 容器权限设为私有,防止状态文件泄露

2. 配置 Terraform Backend

在 Terraform 配置中添加 azurerm 类型的 backend,将状态文件定向到 Azure 存储:

terraform {
  backend "azurerm" {
    resource_group_name  = "你的Azure资源组名"
    storage_account_name = "你的存储账户名"
    container_name       = "你的容器名"
    key                  = "oci-resources.tfstate" # 自定义状态文件名
  }
}

初始化 Terraform 时,Azure 存储的访问凭据可通过环境变量传递,或借助 Azure DevOps 服务连接自动获取权限,无需硬编码。

三、Azure DevOps Pipeline 部署流程

1. 凭据管理

  • 在 Azure DevOps 中创建变量组,存储 OCI 敏感信息:tenancy_ocid、user_ocid、fingerprint、private_key(私钥内容需保留格式,用\n替代换行)、region
  • 若使用 Azure 存储账户的服务连接,可直接在 Pipeline 中引用,无需手动存储账户密钥

2. Pipeline YAML 示例

trigger:
  branches:
    include:
      - main

pool:
  vmImage: 'ubuntu-latest'

variables:
  - group: OCI-Variables # 引用存储OCI凭据的变量组
  - name: ARM_RESOURCE_GROUP_NAME
    value: "你的Azure资源组名"
  - name: ARM_STORAGE_ACCOUNT_NAME
    value: "你的存储账户名"
  - name: ARM_CONTAINER_NAME
    value: "你的容器名"
  - name: ARM_KEY
    value: "oci-resources.tfstate"

steps:
  # 安装指定版本Terraform
  - script: |
      wget https://releases.hashicorp.com/terraform/1.5.7/terraform_1.5.7_linux_amd64.zip
      unzip terraform_1.5.7_linux_amd64.zip
      sudo mv terraform /usr/local/bin/
      terraform --version
    displayName: '安装Terraform'

  # 初始化Terraform(加载backend和OCI Provider)
  - script: |
      terraform init \
        -backend-config="resource_group_name=$(ARM_RESOURCE_GROUP_NAME)" \
        -backend-config="storage_account_name=$(ARM_STORAGE_ACCOUNT_NAME)" \
        -backend-config="container_name=$(ARM_CONTAINER_NAME)" \
        -backend-config="key=$(ARM_KEY)"
    env:
      OCI_TENANCY_OCID: $(tenancy_ocid)
      OCI_USER_OCID: $(user_ocid)
      OCI_FINGERPRINT: $(fingerprint)
      OCI_PRIVATE_KEY: $(private_key)
      OCI_REGION: $(region)
    displayName: 'Terraform初始化'

  # 生成部署计划
  - script: terraform plan -out=tfplan
    env:
      OCI_TENANCY_OCID: $(tenancy_ocid)
      OCI_USER_OCID: $(user_ocid)
      OCI_FINGERPRINT: $(fingerprint)
      OCI_PRIVATE_KEY: $(private_key)
      OCI_REGION: $(region)
    displayName: '生成Terraform部署计划'

  # 执行部署
  - script: terraform apply tfplan
    env:
      OCI_TENANCY_OCID: $(tenancy_ocid)
      OCI_USER_OCID: $(user_ocid)
      OCI_FINGERPRINT: $(fingerprint)
      OCI_PRIVATE_KEY: $(private_key)
      OCI_REGION: $(region)
    displayName: '执行Terraform部署'

3. 关键注意事项

  • OCI 私钥处理:将私钥内容存入变量时,需用\n替换原始换行符,确保 Terraform 能正确解析
  • 权限控制:确保 Azure DevOps 服务主体对存储账户有存储 Blob 数据参与者权限,OCI 用户对目标资源有部署权限
  • 安全优化:敏感信息优先存入 Azure Key Vault,再通过 Azure DevOps 变量组引用,避免明文存储

内容的提问来源于stack exchange,提问作者Hamma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:35:18