如何使用极狐GitLab 软件包仓库功能托管 terraform?
极狐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
属性 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id | integer/string | yes | ID 或项目的 URL 编码路径。 |
module-name | string | yes | 模块名称。支持的语法:1 到 64 个 ASCII 字符,包括小写字母 (a-z)、数字 (0-9) 和连字符 (- )。 |
module-system | string | yes | 模块系统。支持的语法:1 到 64 个 ASCII 字符,包括小写字母 (a-z)、数字 (0-9) 和连字符 (- )。查看更多信息:Terraform Module Registry Protocol documentation。 |
module-version | string | yes | 模块版本。根据语义版本规范,它必须是有效的。 |
在请求正文中提供文件内容。
请注意,在以下示例中,请求必须以 /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_SYSTEM | local | Terraform 模块目标的系统或提供者。例如,local 、aws 、google 。 |
TERRAFORM_MODULE_VERSION | ${CI_COMMIT_TAG} | Terraform 模块版本。您应该遵循语义版本控制规范。 |
手动使用 CI/CD
要在极狐GitLab CI/CD 中使用 Terraform 模块,您可以使用 CI_JOB_TOKEN
代替命令中的个人访问令牌。
例如:
stages:- uploadupload:stage: uploadimage: curlimages/curl:latestvariables:TERRAFORM_MODULE_DIR: ${CI_PROJECT_DIR} # The path to your Terraform moduleTERRAFORM_MODULE_NAME: ${CI_PROJECT_NAME} # The name of your Terraform moduleTERRAFORM_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 publishedscript:- 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."}
错误。
相关文章:
如何使用极狐GitLab 软件包仓库功能托管 terraform?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 Terraform 模块库 (BASIC ALL) 基础设施仓库和 Terraform 模块仓库合并到单个 Terraform 模块仓库功能引入于极狐GitLab 15.1…...

观测云:安全、可信赖的监控观测云服务
引言 近日,“TikTok 遭欧盟隐私监管机构调查并处以 5.3 亿欧元”一案,再次引发行业内对数据合规等话题的热议。据了解,仅 2023 年一年就产生了超过 20 亿美元的 GDPR 罚单。这凸显了在全球化背景下,企业在数据隐私保护方面所面临…...
【python】使用Python和BERT进行文本摘要:从数据预处理到模型训练与生成
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着信息爆炸时代的到来,海量文本数据的高效处理与理解成为亟待解决的问题。文本摘要作为自然语言处理(NLP)中的关键任务,旨在自动生成…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.3 相关性分析(PEARSON/SPEARMAN相关系数)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 5.3 相关性分析(PEARSON/SPEARMAN相关系数)5.3.1 相关性分析理论基础5.3.1.1 相关系数定义与分类5.3.1.2 Pearson相关系数( Pearson Corr…...
Redis面试 实战贴 后面持续更新链接
redis是使用C语言写的。 面试问题列表: Redis支持哪些数据类型?各适用于什么场景? Redis为什么采用单线程模型?优势与瓶颈是什么? RDB和AOF持久化的区别?如何选择?混合持久化如何实现&#x…...
小程序滚动条隐藏(uniapp版本)
单独指定页面隐藏(找到对应的scroll-view) <style> /* 全局隐藏滚动条样式 */ ::-webkit-scrollbar { display: none; width: 0; height: 0; color: transparent; background: transparent; } /* 确保scroll-view组件也隐藏滚动条 */ …...

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 对象…...
C++核心概念全解析:从析构函数到运算符重载的深度指南
目录 前言一、构析函数1.1 概念1.2 语法格式 1.3 核心特性1.4 调用时机1.5 构造函数 vs 析构函数1.6 代码示例 二、this关键字2.1 基本概念2.2 核心特性2.3 使用场景2.3.1 区分成员与局部变量2.3.2 返回对象自身(链式调用)2.3.3 成员函数间传递当前对象2…...
如何巧妙解决 Too many connections 报错?
1. 背景 在日常的 MySQL 运维中,难免会出现参数设置不合理,导致 MySQL 在使用过程中出现各种各样的问题。 今天,我们就来讲解一下 MySQL 运维中一种常见的问题:最大连接数设置不合理,一旦到了业务高峰期就会出现连接…...

自由学习记录(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…...
ES6 知识点整理
一、变量声明:var、let、const 的区别 作用域 var:函数作用域(函数内有效)。let/const:块级作用域({} 内有效,如 if、for)。 变量提升 var 会提升变量到作用域顶部(值为…...

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

工程师 - 汽车分类
欧洲和中国按字母对汽车分类: **轴距**:简单来说,就是前轮中心点到后轮中心点之间的距离,也就是前轮轴和后轮轴之间的长度。根据轴距的大小,国际上通常把轿车分为以下几类(德国大众汽车习惯用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 什么是金丝雀发布? 金丝雀发布(Canary Release)是一种渐进式部署策略,通过逐步将生产流量从旧版本迁移至新版本,结合实时指标验证,在最小化风险的前提下完成版本迭代。其核心逻辑…...

Qt中数据结构使用自定义类————附带详细示例
文章目录 C对数据结构使用自定义类1 QMap使用自定义类1.1 使用自定义类做key1.2 使用自定义类做value 2 QSet使用自定义类 参考 C对数据结构使用自定义类 1 QMap使用自定义类 1.1 使用自定义类做key QMap<key,value>中数据存入时会对存入key值的数据进行比较ÿ…...

数据可视化与分析
数据可视化的目的是为了数据分析,而非仅仅是数据的图形化展示。 项目介绍 项目案例为电商双11美妆数据分析,分析品牌销售量、性价比等。 数据集包括更新日期、ID、title、品牌名、克数容量、价格、销售数量、评论数量、店名等信息。 1、数据初步了解…...
基于大模型预测的产钳助产分娩全方位研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 二、产钳助产分娩概述 2.1 产钳助产定义与历史 2.2 适用情况与临床意义 三、大模型预测原理与数据基础 3.1 大模型技术原理 3.2 数据收集与处理 3.3 模型训练与验证 四、术前预测与准备 4.1 大模型术前风险预…...
通过混合机器学习和 TOPSIS 实现智能手机身份验证的稳健行为生物识别框架
1. 简介 随着日常工作、个人生活和金融操作对智能手机的依赖性不断增强,对弹性安全身份验证系统的需求也日益增长。尽管 PIN 码、密码和静态生物识别等传统身份验证方法仍可为系统提供一定的安全级别,但事实证明,它们容易受到多种威胁,包括敏感数据泄露、网络钓鱼、盗窃和…...

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

使用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(总平方和):公式、意义与应用 在机器学习与统计建模领域,评价模型好坏的重要指标之一就是方差与误差分析。其中,TSS(Total Sum of Squares,总平方和)扮演着非常关键的角…...

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

Spring Framework 6:虚拟线程支持与性能增强
文章目录 引言一、虚拟线程支持:并发模型的革命二、AOT编译与原生镜像优化三、响应式编程与可观测性增强四、HTTP接口客户端与声明式HTTP五、性能比较与实际应用总结 引言 Spring Framework 6作为Spring生态系统的基础框架,随着Java 21的正式发布&#…...
用Redisson实现库存扣减的方法
Redisson是一个在Redis基础上实现的Java客户端,提供了许多高级功能,包括分布式锁、计数器、集合等。使用Redisson实现库存扣减可以保证操作的原子性和高效性。本文将详细介绍如何使用Redisson实现一个简单的库存扣减功能。 一、初始化Redisson客户端 首…...
视频转GIF
视频转GIF 以下是一个使用 Python 将视频转换为 GIF 的脚本,使用了 imageio 和 opencv-python 库: import cv2 import imageio import numpy as np """将视频转换为GIF图参数:video_path -- 输入视频的路径gif_path -- 输出GIF的路径fp…...

一场静悄悄的革命:AI大模型如何重构中国产业版图?
一场静悄悄的革命:AI大模型如何重构中国产业版图? 当ChatGPT在2022年掀起全球AI热潮时,很少有人意识到,这场技术变革正在中国产业界掀起更深层次的革命。在浙江宁波,一个纺织企业老板打开"产业链智能创新平台",30秒内就获得了原料采购、设备升级、海外拓客的全…...
kotlin 02flow-sharedFlow 完整教程
一 sharedFlow是什么 SharedFlow 是 Kotlin 协程中 Flow 的一种 热流(Hot Flow),用于在多个订阅者之间 共享事件或数据流。它适合处理 一次性事件(如导航、弹窗、Toast、刷新通知等),而不是持续状态。 ✅ …...

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