
数据库运维云原生高可用监控【免费下载链接】pigstyEnterprise-Grade OSS PostgreSQL Distribution with HA, PITR, IaC, Monitor, 12 kernel forks and 575 PG extensions. Best-of-breed products integrated as a platform. Self-host Postgres like a Pro!项目地址https://gitcode.com/GitHub_Trending/pi/pigsty点击查看免费下载Pigsty 是一个面向生产环境的开源 PostgreSQL 发行版其基础设施层INFRA依赖大量系统包与监控组件。为了让多节点集群在无外网环境下也能快速初始化Pigsty 提供了名为repo的 Ansible 角色负责在一台管理节点上构建并对外提供本地软件仓库Local Software Repository。本文以 roles/repo/README.md 为主体结合该角色的任务实现、模板与默认配置完整讲解 repo 角色如何检查既有仓库、从上游拉取软件包、清理“脏包”、生成 YUM/APT 元数据并经 Nginx 发布以及如何通过infra.yml的 tags 精确控制构建流程帮助你理解并复用这套离线安装基础设施。一、repo 角色是什么为什么 Pigsty 需要它repo角色定义于 roles/repo/meta/main.yml模块归属 INFRA相关角色为infra与cache的核心职责是在一台具备外网访问能力的管理节点上构建一个本地软件仓库供集群内所有节点离线使用。其工作内容概括为五步检查本地是否已存在仓库按需下载上游软件包清理下载过程中混入的不需要的dirty包生成 APT / YUM 仓库元数据通过Nginx将仓库以 HTTP 方式对外提供服务。这样做带来的收益在 README 中明确列出离线安装Offline Installation仓库建成后集群内其余节点无需再访问互联网部署更快Faster Deployment本地内网包下载速度远高于访问上游软件源版本可控Version Control所有节点使用一致的软件包版本避免上游漂移支持隔离环境Air-Gapped Support非常适合安全等级高、网络隔离的生产环境。从源码看角色的完整调用链位于 infra.ymlINFRA play 在infra主机组上依次执行node_id、repo、node等角色其中- { role: repo, tags: repo }表明repo是基础设施初始化的固定一环位于节点准备node之前确保后续节点安装软件包时本地仓库已经就绪。二、目录结构与文件布局repo 角色的仓库内部结构如下来自 roles/repo/README.md 的 File Structureroles/repo/ ├── defaults/ │ └── main.yml # Default variables ├── meta/ │ └── main.yml # Role metadata dependencies ├── tasks/ │ ├── main.yml # Entry point: check - prepare/build - nginx │ ├── build.yml # [repo_build] Download packages create repo │ └── nginx.yml # [repo_nginx] Setup temporary Nginx server └── templates/ ├── nginx.conf.j2 # Nginx main configuration ├── default.conf.j2 # Nginx server block for repo └── index.html.j2 # Repo landing page (shown during install)任务入口 roles/repo/tasks/main.yml 分四段组织整个流程repo_check检查标志文件{{ repo_home }}/{{ repo_name }}/repo_complete是否存在并用set_fact写入repo_existsrepo_prepare若仓库已存在且repo_enabled为真则直接配置系统使用本地仓库repo_build仅当仓库不存在、或通过-e repo_buildtrue强制重建时导入 roles/repo/tasks/build.yml 执行完整构建repo_nginx若管理节点上还没有 nginx 在监听则导入 roles/repo/tasks/nginx.yml 拉起临时 Nginx 服务。模板方面nginx.conf.j2 是 Nginx 主配置worker 数自动、epoll、client_max_body_size 400m、gzip 开启default.conf.j2 是仓库的 server 块开启autoindex目录索引并预留/.well-known/acme-challenge/用于 ACME 证书签发index.html.j2 则是安装期间对外展示的“Pigsty 正在安装”落地页页面中动态渲染admin_ip、version、repo_name等变量。三、构建产物仓库目录结构构建完成后仓库本体位于{{ repo_home }}/{{ repo_name }}其标准布局如下/www/ # 通常为软链接 - /data/nginx全新安装时 └── pigsty/ # repo_name ├── *.rpm # RPM 包EL 系 ├── *.deb # DEB 包Debian/Ubuntu ├── repodata/ # YUM 元数据仅 EL 系 │ ├── repomd.xml │ ├── primary.xml.gz │ └── modules.yaml # DNF 模块元数据EL8/9 ├── Packages.gz # APT 元数据Debian/Ubuntu └── repo_complete # 完成标记MD5 校验和关键点repo_complete是仓库是否可用的唯一判据。由 build.yml 中repo_create任务在生成元数据后执行md5sum *.rpm repo_completedeb 系为md5sum *.deb写入。后续每次运行repo_check都通过该文件的stat结果决定走repo_prepare复用还是repo_build重建。/www与/data/nginx的关系默认变量中nginx_home: /www、nginx_data: /data/nginxrepo_home: /www。README 特别注明全新安装时角色会把/www创建为指向/data/nginx的符号链接若该路径已存在目录或链接则保留不动。对应实现见 build.yml 的repo_dir任务当NGINX_DATA以NODE_DATA为前缀时先创建数据目录再判断/www是否已存在并决定是否建立软链接同时还会创建{{ nginx_home }}/acme目录存放 ACME 证书质询文件。四、核心配置变量4.1 仓库本体设置以下变量来自 roles/repo/defaults/main.yml变量默认值说明repo_enabledtrue是否在此 infra 节点创建本地仓库repo_namepigsty仓库名称repo_home/www仓库基目录默认软链接到 nginx 数据目录repo_endpointhttp://${admin_ip}:80仓库对外访问地址repo_removetrue构建前是否移除/备份系统现有上游仓库文件repo_modulesinfra,node,pgsql生成上游仓库定义时覆盖的模块清单注意${admin_ip}是模板变量占位符实际渲染时会替换为管理节点 IPrepo_endpoint决定了仓库的访问 URL即{{ repo_endpoint }}/{{ repo_name }}/。4.2 包来源设置变量默认值说明repo_upstream[...]上游仓库定义按 OS 区分未显式定义时使用repo_upstream_defaultrepo_packages[...]需要下载的包清单未显式定义时使用repo_packages_defaultrepo_extra_packages[]额外追加下载的包repo_url_packages[]直接通过 URL 下载的包如二进制制品另有三个值得注意的“引用级”变量region: default可选default/china/europe决定从哪个区域镜像下载上游包。repo_url_pkg任务中当region china时会把下载 URL 中的pigsty.io替换为pigsty.ccproxy_env全局代理环境变量默认对localhost、内网网段、*.pigsty、*.aliyun.com、mirrors.*等地址设置no_proxyversion: v4.5.0Pigsty 版本号会渲染进仓库落地页标题。五、上游仓库与软件包清单从哪下载、下载什么repo 角色本身不内嵌仓库与包列表而是通过按 OS/架构分发的变量文件位于 roles/node_id/vars/ 下如 el9.x86_64.yml提供repo_upstream_default与repo_packages_default并根据os_packagerpm/deb与region自动选取。5.1 上游仓库定义repo_upstream_default每个上游仓库条目是一个 mapping字段含义如下name仓库标识如pgdg18description仓库描述module归属模块用于与repo_modules匹配如infra、node、pgsql、extra、beta、mysql、mongo、redis、grafana、kube、gitlab、click、percona、groonga等releases适用 OS 版本列表arch适用架构x86_64、aarch64baseurl.default/baseurl.china/baseurl.europe不同区域对应的镜像地址meta附加仓库属性如priority、skip_if_unavailable、excludepkgs。以 EL 系为例默认上游包含三类来源Pigsty 自维护的pigsty-localhttp://${admin_ip}/pigsty供内网节点使用、pigsty-infra/pigsty-pgsqlPigsty 官方 YUM 源默认与 china 双地址OS 基础源Rocky Linux 的baseos、appstream、extras、powertools/crb、epel第三方组件源nginx、docker-ce、PostgreSQL 官方pgdg系列 1418 及pgdg-beta、pgdg-extras、timescaledb、percona、groonga、mysql、mongo、redis、grafana、kubernetes、gitlab-ee/ce、clickhouse。repo_add任务build.yml会按repo_modules.split(,)逐个模块生成对应的.reporpm或.listdeb文件。模板中有若干值得注意的版本细节EL10 的 EPEL 使用$releaseverz即10z作为目标版本PGdg 在 EL9.6 与 EL10 上会使用完整次版本号如9.6作为目标版本以解决仓库结构差异EL8 的仓库自动追加module_hotfixes1AppStream 仓库对 PostgreSQL 相关包设置了excludepkgs: postgresql* libpq*避免与 PGdg 冲突。5.2 软件包清单repo_packages_default / repo_extra_packages_default默认下载清单同样按 OS 分发以 el9.x86_64.yml 为例repo_packages_default: [ node-bootstrap, infra-package, infra-addons, node-package1, node-package2, node-package3, pgsql-utility, extra-modules ] repo_extra_packages_default: [ pgsql-main ]这些只是包组别名真正的包名通过package_map展开同一文件中还有node_packages_default、infra_packages_default等实际包列表覆盖 chrony、haproxy、etcd、vector、grafana、victoria-metrics、alertmanager、node-exporter 等基础设施组件。repo_pkg任务里的 Jinja 模板会遍历repo_packages与repo_extra_packages将别名经package_map映射为真实包名并支持$v/${pg_version}占位符替换默认pg_version: 18。六、完整工作流首次构建与复用6.1 首次运行仓库不存在repo_check ─────► repo_build ─────────────────────────► repo_nginx │ │ │ │ ├── repo_dir (create directories) │ │ ├── repo_upstream (add sources) │ │ ├── repo_url_pkg (download URLs) │ │ ├── repo_cache (refresh cache) │ │ ├── repo_boot_pkg (install tools) │ │ ├── repo_pkg (download packages) │ │ ├── repo_create (build metadata) │ │ └── repo_use (configure local repo) │ │ │ └─► repo_complete not found Start Nginx6.2 后续运行仓库已存在repo_check ─────► repo_prepare ─────► repo_nginx │ │ │ └─► repo_complete found Start Nginx if not running │ Configure local repo file两条路径的共同终点是repo_nginx仓库要么被构建出来要么被复用最终都通过 Nginx 对外发布。6.3 构建阶段的底层实现细节结合 roles/repo/tasks/build.yml各子任务的实现要点如下repo_dir按 FHS 约定创建/www软链到/data/nginx、/www/pigsty、/www/acme并设置root:nginx属主repo_remove把系统现有/etc/yum.repos.d/*.repo或/etc/apt/sources.list.d/*、/etc/apt/sources.list移入backup/目录repo_removefalse时跳过保证构建环境干净repo_add按模块生成上游仓库文件见上文repo_url_pkg对repo_url_packages逐个get_url下载支持$releasever、$arch、$distro_codename占位符repo_cache执行yum clean all yum makecache或apt updateEL8 额外执行dnf module disable -y php nginx postgresql避免模块流冲突repo_boot_pkg安装构建仓库所需的引导工具——rpm 系为createrepo_cEL8/9 追加modulemd-tools、dnf-utilsEL7 为yum-utilsdeb 系为dpkg-devrepo_pkgrpm 系使用repotrackEL8 显式指定--arch {{ os_arch }},noarch下载包及其依赖deb 系则先用apt-cache depends --recurse --no-recommends ...递归展开依赖再apt-get download一次性下载全部候选包repo_createrpm 系执行createrepo_cEL8/9 再用repo2module -s stable . modules.yaml与modifyrepo_c --mdtypemodules生成 DNF 模块元数据deb 系执行dpkg-scanpackages . /dev/null | gzip -9c Packages.gz最后写入repo_complete完成标记repo_use把{{ repo_name }}-local.reporpm或pigsty-local.listdeb写入系统源目录指向file://{{ repo_home }}/{{ repo_name }}/并安装wget sshpass nginx createrepo_crpm 系/wget sshpass nginx dpkg-devdeb 系。需要说明的是repo_build的导入被包在ignore_errors: true中构建过程中的单点失败不会中断整个 play这也意味着构建完成后应通过repo_complete文件确认仓库是否真正就绪。6.4 Nginx 服务repo_nginxroles/repo/tasks/nginx.yml 负责将仓库发布为 HTTP 服务先用ss -tp state listening sport :{{ nginx_port }}探测端口监听情况仅当没有 nginx 在运行时才接管README 特别注明管理节点上已有 nginx 时不会创建临时 repo nginx该临时实例随后也会被nginx角色正式配置覆盖渲染三份模板到目标路径/etc/nginx/nginx.conf、/etc/nginx/conf.d/default.conf、{{ nginx_home }}/index.html针对 SELinux 环境执行semanage fcontext为/www、/data/nginx标记httpd_sys_content_t并restorecon同时放行 firewalld 端口deb 系额外处理 ufw通过systemd重启 nginx 并wait_for等待端口就绪。发布后的仓库即通过{{ repo_endpoint }}/{{ repo_name }}/访问Nginx server 块开启了autoindex因此浏览器可直接浏览目录与下载 RPM/DEB 包。七、脏包清理保证仓库纯净从上游仓库拉包时依赖解析经常带回一些不想要的包。repo_create在生成元数据之前会执行自动清理README 中的规则如下匹配模式平台原因*.i686.rpmEL7来自 multilib 仓库的 32 位包*i386.debDebian/Ubuntux86_64 上不需要的 32 位包patroni*3.0.4*全部旧版本与新版 patroni 冲突对应实现见 build.yml 的repo_createrpm 分支先rm -f *.i686.rpm仅 EL7与rm -rf patroni*3.0.4*再执行createrepo_cdeb 分支先rm -f *i386.deb再生成Packages.gz。这些“脏包”可能引发的三类问题README 原述安装时的包冲突无谓的磁盘空间占用多版本并存带来的混乱。八、常用命令与 tags 实战repo 角色通过infra.yml执行所有子任务都挂有独立 tags可以精确控制执行范围。以下命令均来自 README 的 Common Commands 章节# 完整执行 repo 角色检查 - 构建/复用 - nginx ./infra.yml -t repo # 仅检查并复用已有仓库 ./infra.yml -t repo_check,repo_prepare # 强制重建仓库即使已存在 ./infra.yml -t repo_build -e repo_buildtrue # 只重建元数据不重新下载复用已有包 ./infra.yml -t repo_build -e repo_packages[] -e repo_url_packages[] # 仅重新生成仓库元数据 ./infra.yml -t repo_create # 仅添加上游仓库定义 ./infra.yml -t repo_upstream # 仅下载指定包 ./infra.yml -t repo_pkg -e repo_packages[nginx,postgresql17] # 仅设置/重启仓库 nginx ./infra.yml -t repo_nginx # 基于仓库制作离线安装包缓存 ./cache.ymlTag 层级README 原文repo # 角色完整执行 │ ├── repo_check # 检查仓库是否已存在 │ ├── repo_prepare # 若已存在则直接复用 │ ├── repo_build # 从零构建若不存在 │ ├── repo_dir # 创建仓库目录 │ ├── repo_upstream # 配置上游仓库 │ │ ├── repo_remove # 备份现有仓库文件 │ │ └── repo_add # 添加上游仓库定义 │ ├── repo_url_pkg # 从 URL 下载包 │ ├── repo_cache # 刷新包缓存 │ ├── repo_boot_pkg # 安装引导包 │ ├── repo_pkg # 下载全部所需包 │ └── repo_create # 创建元数据含清理 │ └── repo_use # 配置系统使用本地仓库 │ └── repo_nginx # 设置临时 Nginx 服务几个实用组合说明首次部署后如果只想把仓库“认领”下来跳过下载与构建执行-t repo_check,repo_prepare,repo_nginx即可网络环境变化后需要切换镜像区域重新拉包可执行-t repo_build -e regionchina配合清理只想补几个包时用-t repo_pkg -e repo_packages[...]随后补一次-t repo_create刷新元数据。九、与其他模块的协作关系repo 角色不是孤立的它与 Pigsty 基础设施体系紧密协作infrarepo 属于 INFRA 模块由 infra.yml 在infra主机组上执行位于节点初始化之前nodenode 角色在 roles/node/tasks/pkg.yml 中引用repo_upstream_default等相关默认值节点软件安装直接消费本地仓库README 的 See Also 也明确列出node: Node preparation (uses repo)cache执行 cache.yml 可以把当前本地仓库打包成离线缓存制品用于把整个仓库搬运到其他隔离环境nginxrepo 启动的临时 Nginx 是“过渡方案”后续会被正式nginx角色覆盖接管最终统一由 Nginx 对外提供仓库、监控等全部 Web 服务。十、常见问题与使用注意结合源码实现使用 repo 角色时有几点值得留意repo_complete是权威状态标志判断仓库是否可用的依据是标记文件而非目录里有没有包。手工拷贝仓库到新机器时务必同时保留该文件否则repo_check会认为仓库不存在并触发全量重建。repo_removetrue会备份并移走系统上游源原.repo/sources.list文件被移入/etc/yum.repos.d/backup/rpm或/etc/apt/backup/deb如需恢复可手动移回这也保证了构建过程中不会误用未定义的第三方源。构建时长与网络相关README 与源码注释都提到repo_cache的yum makecache通常需要 12 分钟全量包下载耗时则取决于网络状况与所选region镜像。EL 系版本差异内置处理EL7 与 EL8/9 在模块元数据modules.yaml、module_hotfixes、dnf module disable、repotrack --arch等环节走不同分支role 会自动适配无需手工干预。仓库构建失败可容忍但需人工确认repo_build在 main.yml 中以ignore_errors: true导入若下载阶段失败需结合repo_complete是否存在来判断仓库是否可用。结语repo 角色是 Pigsty 离线部署能力的地基它用一个可重复、可精确控制的 Ansible 流程把“从上游拉包、清理脏包、生成元数据、Nginx 发布、节点复用”串成一条完整链路配合 roles/repo/defaults/main.yml 的变量体系与 roles/node_id/vars/ 的按 OS 分发配置可以灵活适配 EL7/EL8/EL9/EL10 与 Debian/Ubuntu 等多类平台。无论是想搭建自己的离线软件源还是深入理解 Pigsty 初始化流程roles/repo都是最值得研读的入口之一。赞分享数据库运维云原生高可用监控【免费下载链接】pigstyEnterprise-Grade OSS PostgreSQL Distribution with HA, PITR, IaC, Monitor, 12 kernel forks and 575 PG extensions. Best-of-breed products integrated as a platform. Self-host Postgres like a Pro!项目地址https://gitcode.com/GitHub_Trending/pi/pigsty点击查看免费下载相关推荐createrepo 命令详解用 createrepo 构建本地 YUM 软件仓库createrepo 命令详解用 createrepo 构建本地 YUM 软件仓库 createrepo 是 Linux 系统中用于创建 YUM 仓库的核文档教程Skia 仓库中的 Skottie 服务Docker 镜像构建规则与本地/线上部署全解析Skia 仓库中的 Skottie 服务Docker 镜像构建规则与本地/线上部署全解析 本文围绕 Skia 开源仓库中 infra/skottie/ 目录的图形学图像处理Earthly Debian 软件仓库Ubuntu/Debian 安装配置与 apt 仓库发布全流程Earthly Debian 软件仓库Ubuntu/Debian 安装配置与 apt 仓库发布全流程 Earthly 官方为 Debian 系用户维护了一个CI/CDDevOps构建工具上一篇Maestro BMAD命令指南敏捷AI开发框架在Maestro中的落地下一篇A-1 Auto Transport 档案解析remote-jobs 仓库中 Fully-Remote 物流技术公司的 Frontmatter 数据结构与渲染链路创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考