如何使用极狐GitLab 软件包仓库功能托管 terraform?

news2025/5/9 20:31:15

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有:

  • 极狐GitLab 中文文档
  • 极狐GitLab 中文论坛
  • 极狐GitLab 官网

Terraform 模块库 (BASIC ALL)


  • 基础设施仓库和 Terraform 模块仓库合并到单个 Terraform 模块仓库功能引入于极狐GitLab 15.11。
  • 对于群组的支持引入于极狐GitLab 16.9。

借助 Terraform 模块库,您可以将极狐GitLab 项目用作 Terraform 模块私有库。您可以使用极狐GitLab CI/CD 创建和发布模块,然后可以从其他私有项目中使用这些模块。

查看 Terraform 模块


  • 对于 Readme 文件的支持引入于极狐GitLab 17.2。

查看项目中的 Terraform 模块:

1.进入项目。
2.在左侧边栏中,选择 软件包和镜像库 > Terraform 模块

您可以在此页面上搜索、排序和过滤模块。
有关如何创建和上传软件包的信息,请查看适用于您的软件包类型的极狐GitLab 文档:

Terraform 模块库身份验证


要对 Terraform 模块库进行身份验证,您需要:

  • 至少具有 read_api 权限的个人访问令牌。

  • CI/CD 作业令牌。

  • 一个具有 read_package_registry 或/和 write_package_registry 范围的部署令牌。

不要使用此处记录的方法以外的身份验证方法。将来可能会删除未记录的身份验证方法。

发布 Terraform 模块


当您发布 Terraform 模块时,如果它不存在,则会创建它。
先决条件:

  • 顶级命名空间中必须不存在具有相同名称和版本的包。
  • 您的项目和组名称不得包含点 (.)。例如,source = "gitlab.example.com/my.group/project.name"
  • 您必须使用 API 进行身份验证。如果使用部署令牌进行身份验证,则必须使用 write_package_registry 范围进行配置。
  • 除非允许重复的 Terraform 模块,否则模块名称必须在其群组的范围内是唯一的,否则会发生错误。
PUT /projects/:id/packages/terraform/modules/:module-name/:module-system/:module-version/file
属性类型是否必需描述
idinteger/stringyesID 或项目的 URL 编码路径。
module-namestringyes模块名称。支持的语法:1 到 64 个 ASCII 字符,包括小写字母 (a-z)、数字 (0-9) 和连字符 (-)。
module-systemstringyes模块系统。支持的语法:1 到 64 个 ASCII 字符,包括小写字母 (a-z)、数字 (0-9) 和连字符 (-)。查看更多信息:Terraform Module Registry Protocol documentation。
module-versionstringyes模块版本。根据语义版本规范,它必须是有效的。

在请求正文中提供文件内容。

请注意,在以下示例中,请求必须以 /file 结尾。
如果您发送以其他内容结尾的请求,则会导致 404 错误 {"error":"404 Not Found"}

使用个人访问令牌的示例请求:

curl --header "PRIVATE-TOKEN: <your_access_token>" \
     --upload-file path/to/file.tgz \
     "https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/terraform/modules/my-module/my-system/0.0.1/file"

使用部署令牌的示例请求:

curl --header "DEPLOY-TOKEN: <deploy_token>" \
     --upload-file path/to/file.tgz \
     "https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/terraform/modules/my-module/my-system/0.0.1/file"

示例响应:

{
  "message":"201 Created"
}

使用 CI/CD 模板(推荐)

  • 引入于 15.9 版本。

您可以使用 Terraform-Module.gitlab-ci.yml 或高级 Terraform/Module-Base.gitlab-ci.yml CI/CD 模板,将 Terraform 模块发布到极狐GitLab terraform 库:

include:
  template: Terraform-Module.gitlab-ci.yml

流水线包含以下作业:

  • fmt - 验证 Terraform 模块的格式。

  • kics-iac-sast - 测试 Terraform 模块的安全问题。

  • deploy - 仅适用于标签流水线。将 Terraform 模块部署到 Terraform 模块库。

流水线变量

您可以使用以下变量配置流水线:

变量默认值描述
TERRAFORM_MODULE_DIR${CI_PROJECT_DIR}Terraform 项目根目录的相对路径。
TERRAFORM_MODULE_NAME${CI_PROJECT_NAME}Terraform 模块的名称。不得包含任何空格或下划线。
TERRAFORM_MODULE_SYSTEMlocalTerraform 模块目标的系统或提供者。例如,localawsgoogle
TERRAFORM_MODULE_VERSION${CI_COMMIT_TAG}Terraform 模块版本。您应该遵循语义版本控制规范。

手动使用 CI/CD


要在极狐GitLab CI/CD 中使用 Terraform 模块,您可以使用 CI_JOB_TOKEN 代替命令中的个人访问令牌。
例如:

stages:
  - upload

upload:
  stage: upload
  image: curlimages/curl:latest
  variables:
    TERRAFORM_MODULE_DIR: ${CI_PROJECT_DIR} # The path to your Terraform module
    TERRAFORM_MODULE_NAME: ${CI_PROJECT_NAME} # The name of your Terraform module
    TERRAFORM_MODULE_SYSTEM: local # The system or provider your Terraform module targets (ex. local, aws, google)
    TERRAFORM_MODULE_VERSION: ${CI_COMMIT_TAG} # Tag commits with SemVer for the version of your Terraform module to be published
  script:
    - TERRAFORM_MODULE_NAME=$(echo "${TERRAFORM_MODULE_NAME}" | tr " _" -) # module-name must not have spaces or underscores, so translate them to hyphens
    - tar -vczf ${TERRAFORM_MODULE_NAME}-${TERRAFORM_MODULE_SYSTEM}-${TERRAFORM_MODULE_VERSION}.tgz -C ${TERRAFORM_MODULE_DIR} --exclude=./.git .
    - 'curl --location --header "JOB-TOKEN: ${CI_JOB_TOKEN}"
         --upload-file ${TERRAFORM_MODULE_NAME}-${TERRAFORM_MODULE_SYSTEM}-${TERRAFORM_MODULE_VERSION}.tgz
         ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/terraform/modules/${TERRAFORM_MODULE_NAME}/${TERRAFORM_MODULE_SYSTEM}/${TERRAFORM_MODULE_VERSION}/file'
  rules:
    - if: $CI_COMMIT_TAG

要触发此上传作业,请将 Git 标签添加到您的提交中。rules:if: $CI_COMMIT_TAG 定义这一点,因此不是每次提交到您的仓库都会触发上传。有关在 CI/CD 流水线中控制作业的其他方法,请参阅 .gitlab-ci.yml 关键字参考。

允许重复的 terraform 模块

  • 引入于极狐GitLab 16.8。
  • 在极狐GitLab 17.0 中,需要的角色从维护者更改为所有者。

默认情况下,Terraform 模块仓库强制对同一命名空间中的模块名称进行唯一性检查。

要允许发布重复的模块名称:

1.在左侧边栏中,选择 搜索或转到 并找到您的群组。
2.选择 设置 > 软件包和镜像库
3.在 Terraform 模块重复的软件包 表中,关闭 允许重复 开关。
4.可选的。在 异常 文本框中,输入匹配允许重复的包的名称的正则表达式。

您的更改将自动保存。

您还可以通过在 GraphQL API 中启用 terraform_module_duplicates_allowed 来允许发布重复的模块名称。

要允重复的特定名称:

1.确保 terraform_module_duplicates_allowed 未启用。
2.使用 terraform_module_duplicate_exception_regex 来定义允许重复的模块名称的正则表达式。

顶级命名空间设置优先于子命名空间设置。比如,如果您为群组启用了 terraform_module_duplicates_allowed,并在子群组中禁用它,则在群组和子群组中的所有项目允许模块名称重复。

引用 Terraform 模块


先决条件:

  • 您需要使用 API 进行身份验证。如果使用个人访问令牌进行身份验证,则必须使用 read_api 范围进行配置。

从命名空间中

您可以在环境变量中为 terrafrom 提供认证令牌(作业令牌、个人访问令牌或部署令牌)。

您应该为环境变量的域名名称添加前缀 TF_TOKEN_,将点号编码为下划线。

比如,当 CLI 向 jihulab.com 发送服务请求时,使用名为 TF_TOKEN_jihulab_com 的变量的值作为部署令牌。

export TF_TOKEN_gitlab_com='glpat-<deploy_token>'

此方法首选于企业实现。对于本地或临时环境,您可能希望创建 .terraformrc%APPDATA%/terraform.rc 文件:

credentials "jihulab.com" {
  token = "<TOKEN>"
}

将其中的 jihulab.com 替换为您私有化部署实例的主机名。

随后,您可以从下游 Terraform 项目中引用您的 Terraform 模块:

module "<module>" {
  source = "jihulab.com/<namespace>/<module-name>/<module-system>"
}

其中,<namespace> 是 Terraform 模块注册仓库的命名空间。

从项目中

要引用一个使用项目级别资源的 Terraform 模块,您可以使用 Terraform 提供的 通过 HTTP 获取归档 源类型。

您可以在 ~/.netrc 文件中为 terraform 提供认证令牌(作业令牌、个人访问令牌或部署令牌):

machine jihulab.com
login <USERNAME>
password <TOKEN>

其中,jihulab.com 可以替换为私有化部署实例的主机名,<USERNAME> 是您的令牌用户名。

您可以从下游 Terraform 项目中引用您的 Terraform 模块:

module "<module>" {
  source = "https://gitlab.com/api/v4/projects/<project-id>/packages/terraform/modules/<module-name>/<module-system>/<module-version>"
}

如果您需要引用最新版本的模块,您可以从源 URL 中省略 <module-version>。为了防止未来出现问题,您应尽量引用特定版本。

如果在相同的命名空间中存在重复的模块名称,从命名空间级别引用模块会安装最近发布的模块。要引用特定版本的重复模块,请使用 项目级别 源类型。

下载 Terraform 模块


下载 Terraform 模块:

1.在左侧边栏中,选择 软件包和镜像库 > Terraform 模块。
2.选择您要下载的模块名称。
3.在 活动 部分,选择您要下载的模块的名称。

模块解析工作原理


当您上传一个新模块时,极狐GitLab 会为该模块生成一个路径,例如 https://gitlab.example.com/parent-group/my-infra-package

  • 此路径符合 Terraform 规范。
  • 路径名称在命名空间中必须是唯一的。

对于子组中的项目,极狐GitLab 检查模块名称是否已存在于命名空间的任何位置,包括所有子组和父组。
例如:

  • 项目为 gitlab.example.com/parent-group/sub-group/my-project
  • Terraform 模块为 my-infra-package

项目名称在 parent-group 下所有群组的所有项目中必须是唯一的。

删除 Terraform 模块


在 Terraform 模块库中发布 Terraform 模块后,您将无法对其进行编辑,您必须删除并重新创建它。

要删除模块,您必须具有合适的权限。

您可以使用软件包 API 或 UI 删除模块。

要从您的项目中删除 UI 中的模块:

1.在左侧边栏中,选择 软件包与镜像库 > Terraform 模块。
2.找到要删除的软件包的名称。
3.选择 删除

软件包被永久删除。

禁用 Terraform 模块库


Terraform 模块库自动启用。

对于私有化部署实例,极狐GitLab 管理员可以禁用 软件包与镜像库,系统会从侧边栏中删除此菜单项。

您还可以删除特定项目的 Terraform 模块库:

1.在您的项目中,转到 设置 > 通用
2.展开 可视化、项目功能和权限 部分并关闭 软件包(灰色)
3.选择 保存更改

要重新启用它,请按照上述相同步骤将其打开(蓝色)。

故障排查


  • 发布具有重复名称的模块时,您可能会遇到 {"message":"A module with the same name already exists in the namespace."} 错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2371766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

观测云:安全、可信赖的监控观测云服务

引言 近日&#xff0c;“TikTok 遭欧盟隐私监管机构调查并处以 5.3 亿欧元”一案&#xff0c;再次引发行业内对数据合规等话题的热议。据了解&#xff0c;仅 2023 年一年就产生了超过 20 亿美元的 GDPR 罚单。这凸显了在全球化背景下&#xff0c;企业在数据隐私保护方面所面临…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.3 相关性分析(PEARSON/SPEARMAN相关系数)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 5.3 相关性分析&#xff08;PEARSON/SPEARMAN相关系数&#xff09;5.3.1 相关性分析理论基础5.3.1.1 相关系数定义与分类5.3.1.2 Pearson相关系数&#xff08; Pearson Corr…

python基础:序列和索引-->Python的特殊属性

一.序列和索引 1.1 用索引检索字符串中的元素 # 正向递增 shelloworld for i in range (0,len(s)):# i是索引print(i,s[i],end\t\t) print(\n--------------------------) # 反向递减 for i in range (-10,0):print(i,s[i],end\t\t)print(\n--------------------------) print(…

java反射(2)

package 反射;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays;public class demo {public static void main(String[] args) throws Exception {// 通过类的全限定名获取对应的 Class 对象…

自由学习记录(58)

Why you were able to complete the SpringBoot MyBatisPlus task smoothly: Clear logic flow: Database → Entity → Service → Controller → API → JSON response. Errors are explicit, results are verifiable — you know what’s broken and what’s fixed. Sta…

《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》

《MATLAB实战训练营&#xff1a;从入门到工业级应用》高阶挑战篇-5G通信速成&#xff1a;MATLAB毫米波信道建模仿真指南 &#x1f680;&#x1f4e1; 大家好&#xff01;今天我将带大家进入5G通信的奇妙世界&#xff0c;我们一起探索5G通信中最激动人心的部分之一——毫米波信…

工程师 - 汽车分类

欧洲和中国按字母对汽车分类&#xff1a; **轴距**&#xff1a;简单来说&#xff0c;就是前轮中心点到后轮中心点之间的距离&#xff0c;也就是前轮轴和后轮轴之间的长度。根据轴距的大小&#xff0c;国际上通常把轿车分为以下几类&#xff08;德国大众汽车习惯用A\B\C\D分类&a…

57.[前端开发-前端工程化]Day04-webpack插件模式-搭建本地服务器

Webpack常见的插件和模式 1 认识插件Plugin 认识Plugin 2 CleanWebpackPlugin CleanWebpackPlugin 3 HtmlWebpackPlugin HtmlWebpackPlugin 生成index.html分析 自定义HTML模板 自定义模板数据填充 4 DefinePlugin DefinePlugin的介绍 DefinePlugin的使用 5 mode模式配置…

K8S - 金丝雀发布实战 - Argo Rollouts 流量控制解析

一、金丝雀发布概述 1.1 什么是金丝雀发布&#xff1f; 金丝雀发布&#xff08;Canary Release&#xff09;是一种渐进式部署策略&#xff0c;通过逐步将生产流量从旧版本迁移至新版本&#xff0c;结合实时指标验证&#xff0c;在最小化风险的前提下完成版本迭代。其核心逻辑…

Qt中数据结构使用自定义类————附带详细示例

文章目录 C对数据结构使用自定义类1 QMap使用自定义类1.1 使用自定义类做key1.2 使用自定义类做value 2 QSet使用自定义类 参考 C对数据结构使用自定义类 1 QMap使用自定义类 1.1 使用自定义类做key QMap<key,value>中数据存入时会对存入key值的数据进行比较&#xff…

数据可视化与分析

数据可视化的目的是为了数据分析&#xff0c;而非仅仅是数据的图形化展示。 项目介绍 项目案例为电商双11美妆数据分析&#xff0c;分析品牌销售量、性价比等。 数据集包括更新日期、ID、title、品牌名、克数容量、价格、销售数量、评论数量、店名等信息。 1、数据初步了解…

旅游设备生产企业的痛点 质检系统在旅游设备生产企业的应用

在旅游设备制造行业&#xff0c;产品质量直接关系到用户体验与企业口碑。从景区缆车、观光车到水上娱乐设施&#xff0c;每一件设备的安全性与可靠性都需经过严苛检测。然而&#xff0c;传统质检模式常面临数据分散、流程不透明、合规风险高等痛点&#xff0c;难以满足旅游设备…

使用ESPHome烧录固件到ESP32-C3并接入HomeAssistant

文章目录 一、安装ESPHome二、配置ESP32-C3控制灯1.主配置文件esp32c3-luat.yaml2.基础通用配置base.yaml3.密码文件secret.yaml4.围栏灯four_light.yaml5.彩灯rgb_light.yaml6.左右柱灯left_right_light.yaml 三、安装固件四、HomeAssistant配置ESPHome1.直接访问2.配置ESPHom…

【漫话机器学习系列】237. TSS总平方和

深度理解 TSS&#xff08;总平方和&#xff09;&#xff1a;公式、意义与应用 在机器学习与统计建模领域&#xff0c;评价模型好坏的重要指标之一就是方差与误差分析。其中&#xff0c;TSS&#xff08;Total Sum of Squares&#xff0c;总平方和&#xff09;扮演着非常关键的角…

DeepSeek多尺度数据:无监督与原则性诊断方案全解析

DeepSeek 多尺度数据诊断方案的重要性 在当今的 IT 领域,数据如同石油,是驱动各类智能应用发展的核心资源。随着技术的飞速发展,数据的规模和复杂性呈爆炸式增长,多尺度数据处理成为了众多领域面临的关键挑战。以计算机视觉为例,在目标检测任务中,小目标可能只有几个像素…

Spring Framework 6:虚拟线程支持与性能增强

文章目录 引言一、虚拟线程支持&#xff1a;并发模型的革命二、AOT编译与原生镜像优化三、响应式编程与可观测性增强四、HTTP接口客户端与声明式HTTP五、性能比较与实际应用总结 引言 Spring Framework 6作为Spring生态系统的基础框架&#xff0c;随着Java 21的正式发布&#…

一场静悄悄的革命:AI大模型如何重构中国产业版图?

一场静悄悄的革命:AI大模型如何重构中国产业版图? 当ChatGPT在2022年掀起全球AI热潮时,很少有人意识到,这场技术变革正在中国产业界掀起更深层次的革命。在浙江宁波,一个纺织企业老板打开"产业链智能创新平台",30秒内就获得了原料采购、设备升级、海外拓客的全…

CentOS网络之network和NetworkManager深度解析

文章目录 CentOS网络之network和NetworkManager深度解析1. CentOS网络服务发展历史1.1 传统network阶段&#xff08;CentOS 5-6&#xff09;1.2 过渡期&#xff08;CentOS 7&#xff09;1.3 新时代&#xff08;CentOS 8&#xff09; 2. network和NetworkManager的核心区别3. ne…

当当狸智能天文望远镜 TW2 | 用科技触摸星辰,让探索触手可及

当科技邂逅星空&#xff0c;每个普通人都能成为宇宙的追光者 伽利略用望远镜揭开宇宙面纱的 400 年后&#xff0c;当当狸以颠覆传统的设计&#xff0c;让天文观测从专业领域走入千家万户。当当狸智能天文望远镜 TW2&#xff0c;重新定义「观星自由」—— 无需专业知识&#xff…

科学发现 | 源于生活的启示与突破计划的创新

注&#xff1a;本文为“科学发现”相关文章合辑。 略作重排&#xff0c;未全整理。 哪些重大科学发现&#xff0c;来自生活的启示 ︱ 科学史 2020/10/29 导读 好奇心是最好的向导和老师。 撰文 | 陈敬全&#xff08;东华大学人文学院教授&#xff09; 英国进化论者赫胥黎…