如何通过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
相关产品推荐
相关产品推荐

