如何使用极狐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
属性类型是否必需描述
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:- 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."} 错误。

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

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

相关文章

【QT】深入理解 Qt 中的对象树:机制、用途与最佳实践

深入理解 Qt 中的对象树&#xff1a;机制、用途与最佳实践 在使用 Qt 编程时&#xff0c;你是否注意到很多对象可以设置“父对象”&#xff1f;比如&#xff1a; QPushButton* btn new QPushButton(parentWidget);这不是简单的层级结构&#xff0c;而是 Qt 强大而优雅的 对象…

比较入站和出站防火墙规则

组织需要仔细配置防火墙规则&#xff0c;监控网络的传入和传出流量&#xff0c;从而最大限度降低遭受攻击的风险。在有效管理入站和出站防火墙规则前&#xff0c;了解入站与出站流量的区别至关重要。 一、什么是入站流量&#xff1f; 入站流量指的是并非源自网络内部&#xf…

Unity-Shader详解-其五

关于Unity的Shader部分的基础知识其实已经讲解得差不多了&#xff0c;今天我们来一些实例分享&#xff1a; 溶解 效果如下&#xff1a; 代码如下&#xff1a; Shader "Chapter8/chapter8_1" {Properties{// 定义属性[NoScaleOffset]_Albedo("Albedo", 2…

COLT_CMDB_linux_userInfo_20250508.sh修复历史脚本输出指标信息中userName与输出信息不一致问题

#!/bin/bash #IT_BEGIN #IT_TYPE3 #IT SYSTEM_LINUX_AGENTUSERDISCOVER|discovery.user[disc] #原型指标 #IT_RULE SYSTEM_LINUX_AGENTUSERGROUPID|groupId[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERHOME|userHome[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERNAME|user…

TCP 与 UDP报文

** TCP 与 UDP报文** 1. 引言 在网络通信中&#xff0c;TCP&#xff08;传输控制协议&#xff09; 和 UDP&#xff08;用户数据报协议&#xff09; 是两种最核心的传输层协议。它们各自适用于不同的场景&#xff0c;理解其工作原理对开发高性能网络应用至关重要。本文将详细解…

LabVIEW燃气轮机测控系统

在能源需求不断增长以及生态环境保护备受重视的背景下&#xff0c;微型燃气轮机凭借其在经济性、可靠性、维护性及排放性等方面的显著优势&#xff0c;在航空航天、分布式发电等众多领域得到广泛应用。随着计算机技术的快速发展&#xff0c;虚拟仪器应运而生&#xff0c;LabVIE…

基于vueflow可拖拽元素的示例(基于官网示例的单文件示例)

效果图 代码 <template><div style"width: 100%;height: calc(100vh - 84px)"><VueFlow :nodes"nodes" :edges"edges" drop"onDrop" dragover"onDragOver" dragleave"onDragLeave"><div cl…

笔试专题(十六)

文章目录 相差不超过k的最多数题解代码 最长公共子序列&#xff08;一&#xff09;题解代码 小红的口罩题解代码 春游题解代码 相差不超过k的最多数 题目链接 题解 1. 排序 滑动窗口 2. 为什么使用滑动窗口&#xff1f; 因为max-min < k&#xff0c;求这个区间内的数最…

技术视界 | 青龙机器人训练地形详解(三):复杂地形精讲之台阶

在前两篇中&#xff0c;我们依次讲解了“如何创建一个地形”以及“如何将地形添加到训练环境中”。从基础出发&#xff0c;逐步构建机器人可交互的三维仿真环境。在机器人强化学习训练中&#xff0c;地形的复杂度决定了策略的泛化能力&#xff0c;仅靠 jump_plat 和 jump_pit 等…

MYSQL之索引结构,为何要用B+树

索引的目的就是为了提高查询效率 索引的结构是B树&#xff0c;那么说到B树&#xff0c;必须提一下其他三种结构&#xff0c;分别是&#xff1a;二叉查找树、平衡二叉树、B树 我们来看看各自的结构特征 二叉查找树 特点:任何节点的左子节点的值都小于当前节点的值&#xff0c;右…

3.2.3 掌握RDD转换算子 - 2. 过滤算子 - filter()

在本节课中&#xff0c;我们深入学习了Spark RDD的过滤算子filter()。filter()算子能够通过指定的函数对RDD中的元素进行筛选&#xff0c;返回一个满足条件的新RDD&#xff0c;通常新RDD的元素个数会比源RDD少。通过案例演示&#xff0c;我们掌握了如何使用filter()来过滤列表中…

vue3使用轮播图组件swiper

一、在swiper的官网源码下载地址 下载Swiper - Swiper中文网 二、官网浏览轮播图类型地址 Swiper演示 - Swiper中文网 三、swiper配置参数地址 中文api - Swiper中文网 四、在vue3项目引入swiper npm install swiper 五、在vue3中使用 官网vue3中使用&#xff1a;Swiper…

MySQL优化-MySQL故障排查与监控

MySQL优化-MySQL故障排查与监控 一、MySQL监控 实时了解数据库的运行状态&#xff0c;通过不同的监控指标&#xff0c;识别潜在问题并进行预防。常见得到MySQL监控指标包括&#xff1a;连接数、缓存池命中率、磁盘I/O、查询执行情况等。 1、监控数据库状态变量 MySQL的状态…

【MongoDB篇】MongoDB的分片操作!

目录 引言第一节&#xff1a;分片核心概念&#xff1a;为什么要分片&#xff1f;它是什么&#xff1f; &#x1f914;&#x1f4a5;&#x1f680;第二节&#xff1a;分片架构的“三大金刚”&#xff1a;核心组件解析 &#x1f9f1;&#x1f9e0;&#x1f6e3;️第三节&#xff…

C++ 函数类型及实用例题

请各位大佬一键三连支持一下 目录 请各位大佬一键三连支持一下 1. 无参数无返回值函数 2. 有参数无返回值函数 3. 无参数有返回值函数 4. 有参数有返回值函数 5. 函数重载 6. 递归函数 7. 带默认参数的函数 8. 内联函数 下面我将介绍 C 中不同类型的函数&#xff0c;…

AtCoder Beginner Contest 404 A-E 题解

还是ABC好打~比ARC好打多了&#xff08; 题解部分 A - Not Found 给定你一个长度最大25的字符串&#xff0c;任意输出一个未出现过的小写字母 签到题&#xff0c;map或者数组下标查询一下就好 #include<bits/stdc.h>using namespace std;#define int long long #def…

trae ai编程工具

Trae&#xff0c;致力于成为真正的 AI 工程师&#xff08;The Real Al Engineer&#xff09;。Trae 旗下的 AI IDE 产品&#xff0c;以智能生产力为核心&#xff0c;无缝融入你的开发流程&#xff0c;与你默契配合&#xff0c;更高质量、高效率完成每一个任务。 版本差异 国内…

Web 架构之前后端分离

文章目录 思维导图一、引言二、前后端分离的概念代码示例&#xff08;简单的前后端分离交互&#xff09;后端&#xff08;使用 Python Flask 框架&#xff09;前端&#xff08;使用 JavaScript 和 jQuery&#xff09; 三、前后端分离的优势3.1 提高开发效率3.2 代码可维护性增强…

理解 Elasticsearch 的评分机制和 Explain API

作者&#xff1a;来自 Elastic Kofi Bartlett 深入了解 Elasticsearch 的评分机制并探索 Explain API。 想获得 Elastic 认证吗&#xff1f;查看下一期 Elasticsearch Engineer 培训的时间&#xff01; Elasticsearch 拥有大量新功能&#xff0c;帮助你为你的使用场景构建最佳…

Jupyter Notebook / Lab 疑难杂症记:从命令找不到到环境冲突与网络阻塞的排查实录

Jupyter Notebook / Lab 疑难杂症记&#xff1a;从命令找不到到环境冲突与网络阻塞的排查实录 摘要&#xff1a; 本文记录了一次复杂的 Jupyter Notebook / Lab 故障排查过程。从最初的“command not found”错误出发&#xff0c;我们深入挖掘了可执行文件存在的矛盾、conda 环…