当前位置: 首页 > news >正文

11.Ansible自动化之-内容集管理

11-Ansible 内容集管理

文章目录

    • 11-Ansible 内容集管理
      • 实验环境准备
      • Ansible 内容集是什么?
      • 为什么需要内容集?
      • 内容集的命名规则:命名空间
      • 从哪里获取内容集?
        • 配置内容集仓库(可选)
      • 内容集存放在哪里?
      • 内容集管理命令:ansible-galaxy collection
        • 查看已安装的内容集
        • 安装内容集
        • 使用内容集中的资源
        • 创建自己的内容集

实验环境准备

操作流程:创建项目目录→配置 Ansible 默认参数(ansible.cfg)→定义主机清单(inventory)

# 创建名为web的项目目录并进入,用于存放本次实验的所有文件
[bq@controller ~]$ mkdir web && cd web# 创建Ansible配置文件ansible.cfg,定义默认行为
[bq@controller web]$ cat > ansible.cfg <<'EOF'
[defaults]
remote_user = bq          # 远程执行任务的默认用户
inventory = ./inventory   # 指定主机清单文件路径(当前目录下的inventory)[privilege_escalation]
become = True             # 允许提权(切换到root执行任务)
become_user = root        # 提权后的目标用户
become_method = sudo      # 提权方式为sudo
become_ask_pass = False   # 提权时不询问密码(需提前配置sudo免密)
EOF# 创建主机清单文件inventory,列出需要管理的主机
[bq@controller web]$ cat > inventory <<'EOF'
controller   # 控制节点自身
node1        # 被管理节点1
node2        # 被管理节点2
node3        # 被管理节点3
node4        # 被管理节点4
EOF

Ansible 内容集是什么?

简单来说,内容集(Content Collections) 是 Ansible 用来打包和分发 “工具” 的一种方式。早期 Ansible 的所有模块都塞在核心包里,更新起来很麻烦 —— 改一个模块就得整个软件同步更新。后来 Ansible 把这些 “工具” 拆分成了一个个独立的 “内容集”,每个内容集里包含一堆相关的工具,方便单独更新和复用。

一个内容集里可能有这些东西:

  • 模块(Modules):执行具体任务的小工具(比如安装软件、创建用户)。
  • 插件(Plugins):扩展 Ansible 功能的组件(比如连接远程主机的插件、查找变量的插件)。
  • 角色(Roles):预定义的任务集合(比如 “部署 Nginx” 的一套完整步骤)。
  • Playbook:任务执行的 “剧本”(告诉 Ansible 先做什么、后做什么)。
  • 文档和其他资源:使用说明、模板文件、变量配置等。

小贴士:Ansible 2.9 及以上版本才支持内容集。现在大部分模块都从核心软件里移到了内容集里,比如以前的mysql_db模块,现在在community.mysql内容集里。

为什么需要内容集?

  1. 方便复用,少重复劳动
    比如你写了一套部署数据库的模块和角色,打包成内容集后,下次换个项目直接用,不用重新写。
  2. 分发更规范
    可以通过社区仓库(Ansible Galaxy)或公司内部仓库分享内容集,版本号清晰,升级、回滚都方便。
  3. 依赖管理更简单
    一个内容集如果需要其他内容集才能工作,可以在配置里声明依赖,安装时会自动下载所需的依赖。
  4. 扩展 Ansible 功能
    社区开发者可以贡献自己的内容集,比如针对特定数据库、云平台的工具,让 Ansible 能支持更多场景。
  5. 好维护
    相关的工具都放在一个内容集里,改代码、写文档都集中在一处,不用东找西找。

内容集的命名规则:命名空间

为了避免不同人开发的内容集重名(比如两个人都想叫 “mysql”),Ansible 用 “命名空间” 来区分。就像微信公众号的 “账号 + 名称”,命名空间相当于 “账号”,内容集名称相当于 “公众号名”。

举几个例子:

  • 社区维护的内容集用community命名空间,比如community.mysql(数据库相关)、community.rabbitmq(消息队列相关)。
  • 红帽官方维护的用redhat命名空间,比如redhat.satellite(卫星服务器相关)。

从哪里获取内容集?

  1. 自带的基础内容集
    安装 Ansible Core 后,会自带ansible.builtin内容集,里面是最常用的基础模块(比如dnfservice)。
  2. Ansible Galaxy 社区仓库
    这是一个公开的 “内容集商店”,里面有大量社区贡献的内容集(比如community.mysql)。但注意,这里的内容集没有官方担保,需要自己验证可用性。
  3. Git 仓库或压缩包
    可以从 Git 代码库(比如 GitHub)直接下载,或者用本地 / 远程的 tar 压缩包安装(类似下载安装包手动安装软件)。
  4. 公司私有仓库
    企业可以搭建自己的 “私有自动化中心”,存放内部开发的内容集,更安全可控。
配置内容集仓库(可选)

默认情况下,ansible-galaxy命令会从https://galaxy.ansible.com/(Ansible Galaxy)下载内容集。如果需要用私有仓库,需在ansible.cfg中配置:

[galaxy]
server_list = automation_hub, galaxy  # 仓库优先级:先查automation_hub,再查galaxy[galaxy_server.automation_hub]
url=https://console.redhat.com/api/automation-hub/  # 私有仓库地址
auth_url=https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token  # 认证地址
token=eyJh...Jf0o  # 访问令牌(从私有仓库的Web界面生成)[galaxy_server.galaxy]
url=https://galaxy.ansible.com/  # 公共Galaxy仓库地址

内容集存放在哪里?

Ansible 通过ansible.cfg中的collections_path参数指定内容集的存放路径(多个路径用冒号分隔)。

  • 默认路径~/.ansible/collections:/usr/share/ansible/collections
    ~表示当前用户的家目录,系统级的内容集放在/usr/share,用户自己装的在~/.ansible
  • 推荐路径./collections:~/.ansible/collections:/usr/share/ansible/collections
    增加当前项目目录下的collections,方便按项目管理内容集(项目内的内容集优先使用)。

内容集管理命令:ansible-galaxy collection

ansible-galaxy collection是管理内容集的核心命令,常用功能包括查看、安装、创建等。先看看它的基本用法:

[bq@controller web]$ ansible-galaxy collection --help
# 输出说明:
# 主要动作(COLLECTION_ACTION)包括:
# download:下载内容集(含依赖)为压缩包(用于离线安装)
# init:初始化一个新内容集(创建目录结构)
# build:打包内容集为可发布的压缩包
# publish:发布内容集到仓库(如Galaxy)
# install:安装内容集(从文件、URL或仓库)
# list:查看已安装的内容集
# verify:验证已安装内容集的完整性
查看已安装的内容集

操作流程:执行查看命令→查看输出结果(内容集名称和版本)

# 查看命令的帮助(可选,了解更多参数)
[bq@controller web]$ ansible-galaxy collection list -h# 查看系统中已安装的所有内容集
[bq@controller web]$ ansible-galaxy collection list# 输出示例(解释):
# /usr/share/ansible/collections/ansible_collections  # 内容集存放路径
Collection               Version  # 内容集名称和版本
------------------------ -------
redhat.rhel_system_roles 1.16.2   # 红帽的RHEL系统角色内容集,版本1.16.2
安装内容集

操作流程:选择安装来源(Galaxy / 本地包 / Git)→执行安装命令→验证安装结果

# 查看安装命令的帮助(了解参数,比如指定安装路径)
[bq@controller web]$ ansible-galaxy collection install -h# 1. 从Ansible Galaxy安装(最常用)
# 安装community.mysql内容集(含MySQL相关模块)
[bq@controller web]$ ansible-galaxy collection install community.mysql # 2. 从本地或远程tar压缩包安装
# 从本地tar包安装(-p collections指定安装到当前目录的collections文件夹)
[bq@controller web]$ ansible-galaxy collection install /home/bq/role-collections/gls-utils-0.0.1.tar.gz -p collections
# 从远程tar包安装(通过HTTP地址下载)
[bq@controller web]$ ansible-galaxy collection install http://content.bq.cloud/redhat-insights-1.0.7.tar.gz -p collections# 3. 从Git仓库安装
# 从Git仓库直接拉取并安装(适合安装开发中的内容集)
[bq@controller web]$ ansible-galaxy collection install git@git.bq.cloud:organization/repo_name.git -p collections# 4. 通过要求文件(requirements.yml)批量安装
# 第一步:创建requirements.yml,列出需要安装的内容集
[bq@controller web]$ vim collections/requirements.yml
---
collections:- name: community.mysql  # 从Galaxy安装- name: ansible.posix    # 指定版本1.2.0version: 1.2.0- name: /home/bq/role-collections/redhat-insights-1.0.7.tar.gz  # 本地tar包- name: http://www.bq.cloud/redhat-insights-1.0.5.tar.gz  # 远程tar包- name: git+https://github.com/ansible-collections/community.general.git  # Git仓库version: main  # 分支名称# 第二步:执行安装(-r指定要求文件,-p指定安装路径)
[bq@controller web]$ ansible-galaxy collection install -r collections/requirements.yml  -p collections
使用内容集中的资源

内容集安装后,就可以在 Playbook 中使用里面的模块、角色等资源了。

示例 1:使用内容集中的模块(以 community.mysql 为例)

功能:在 node1 上安装 MariaDB,创建数据库和用户。

---
- name: 安装MariaDB并配置数据库hosts: node1  # 目标主机vars:root_password: redhat  # 数据库root密码tasks:# 使用ansible.builtin自带模块安装软件(ansible.builtin是默认内容集,可省略前缀)- name: 安装mariadb-server和Python驱动ansible.builtin.dnf:name: mariadb-server,python3-PyMySQL  # 要安装的包state: present  # 确保包已安装# 使用自带模块启动服务- name: 启动并设置mariadb开机自启ansible.builtin.service:name: mariadbstate: started  # 确保服务运行中enabled: yes    # 开机自启# 使用自带模块设置root密码- name: 给root@localhost设置密码ansible.builtin.shell: mysqladmin password {{ root_password }} # 使用community.mysql内容集中的mysql_db模块创建数据库- name: 创建wordpress数据库community.mysql.mysql_db:  # 格式:命名空间.内容集名称.模块名name: wordpress  # 数据库名state: present   # 确保数据库存在login_user: root  # 登录用户login_password: 'redhat'  # 登录密码login_host: localhost  # 数据库地址# 使用community.mysql内容集中的mysql_user模块创建用户- name: 创建数据库用户bq并授权community.mysql.mysql_user:name: bq  # 用户名host: '%'  # 允许从任何主机连接password: redhat  # 用户密码priv: '*.*:ALL'  # 授权:所有数据库的所有权限state: present  # 确保用户存在login_user: rootlogin_password: 'redhat'login_host: localhost

示例 2:使用内容集中的角色和自定义模块

功能:使用gls.utils内容集中的newping模块和backup角色,检查主机存活并备份配置文件。

---
- name: 备份系统配置并检查主机存活hosts: node1gather_facts: false  # 不收集主机信息(加快执行)tasks:# 使用gls.utils内容集中的newping模块(自定义模块)- name: 检查主机是否存活(发送ping请求)gls.utils.newping:  # 格式:命名空间.内容集名称.模块名data: pong  # 发送的测试数据# 使用gls.utils内容集中的backup角色- name: 备份配置文件(/etc/sysconfig和/etc/yum.repos.d)include_role:name: gls.utils.backup  # 格式:命名空间.内容集名称.角色名vars:backup_id: backup_etc  # 备份标识(用于区分不同备份)backup_files:  # 需要备份的文件/目录- /etc/sysconfig- /etc/yum.repos.d

思考:备份的文件存在哪里?
提示:通常由角色的默认变量定义,可查看gls.utils.backup角色的vars目录或文档(一般在collections/ansible_collections/gls/utils/roles/backup/下)。

创建自己的内容集

如果你想把自己写的模块、角色打包分享,可以创建一个内容集。

操作流程:初始化内容集目录→添加模块 / 角色等资源→配置元数据→打包→发布

  1. 初始化内容集目录
    ansible-galaxy collection init命令创建基础结构(命名空间和内容集名称自定义):

    # 格式:ansible-galaxy collection init 命名空间.内容集名称
    ansible-galaxy collection init mycompany.webserver
    

    执行后会生成如下目录结构:

    mycompany/webserver/  # 内容集根目录(命名空间/内容集名称)
    ├── docs/               # 存放文档(使用说明、示例等)
    ├── plugins/            # 存放插件
    │   ├── modules/        # 自定义模块(.py文件)
    │   ├── inventory/      # 自定义inventory插件
    │   └── ...             # 其他插件(如过滤插件、回调插件)
    ├── roles/              # 存放角色(每个角色一个子目录)
    ├── playbooks/          # 存放示例Playbook
    ├── tests/              # 存放测试用例(确保内容集能正常工作)
    ├── galaxy.yml          # 元数据文件(名称、版本、作者等)
    └── README.md           # 内容集说明(功能、使用方法)
    
  2. 添加资源

    • plugins/modules/下创建自定义模块(比如install_nginx.py)。
    • roles/下创建角色(比如deploy_nginx角色,包含 tasks、handlers 等)。
    • playbooks/下添加示例 Playbook(展示如何使用内容集)。
  3. 配置元数据(galaxy.yml)
    编辑galaxy.yml,填写内容集的基本信息:

    namespace: mycompany  # 命名空间
    name: webserver       # 内容集名称
    version: 1.0.0        # 版本号(遵循语义化版本:主版本.次版本.补丁)
    authors:- 张三 <zhangsan@example.com>  # 作者信息
    description: 用于部署和管理Web服务器的内容集  # 功能描述
    dependencies:  # 依赖的其他内容集(可选)- community.general: 5.0.0
    
  4. 打包内容集
    进入内容集根目录的上一级,执行build命令生成 tar 压缩包:

    # 进入mycompany的父目录(确保能看到mycompany文件夹)
    cd ..
    # 打包(会生成mycompany-webserver-1.0.0.tar.gz)
    ansible-galaxy collection build mycompany/webserver
    
  5. 发布内容集(可选)

    • 发布到 Ansible Galaxy:ansible-galaxy collection publish mycompany-webserver-1.0.0.tar.gz --token=你的Galaxy令牌
    • 发布到私有仓库:根据私有仓库的要求上传 tar 包(通常通过 Web 界面或专用命令)。

通过以上步骤,你可以轻松管理、使用甚至创建 Ansible 内容集,让自动化任务更高效、更可复用。

http://www.lryc.cn/news/625896.html

相关文章:

  • 快手Klear-Reasoner登顶8B模型榜首,GPPO算法双效强化稳定性与探索能力!
  • 图像增强——灰度变换增强(线性,对数,指数)、空间滤波增强、频域增强、主成分/彩色合成增强(原理解释和代码示例)
  • FPGA 在情绪识别领域的护理应用(一)
  • Spring Boot应用实现图片资源服务
  • 电商数据分析可视化预测系统
  • gitlab、jenkins等应用集成ldap
  • Wireshark获取数据传输的码元速率
  • 【iOS】内存管理
  • implement libtime on Windows
  • 软件系统运维常见问题
  • STM32之beep、多文件、延迟、按键以及呼吸灯
  • 【数据结构】用堆解决TOPK问题
  • 服务器数据恢复—硬盘坏道离线导致raid崩溃的StorNext文件系统数据恢复案例
  • 深度学习-167-MCP技术之工具函数的设计及注册到MCP服务器的两种方式
  • 应用控制技术、内容审计技术、AAA服务器技术
  • Commons-io
  • Syntax Error: Error: PostCSS received undefined instead of CSS string
  • CSS封装大屏自定义组件(标签线)
  • 2025年6月中国电子学会青少年软件编程(图形化)等级考试试卷(一级)答案 + 解析
  • LangChain —多模态 / 多源上下文管理
  • 云原生俱乐部-mysql知识点归纳(3)
  • 【论文阅读】SIMBA: single-cell embedding along with features(1)
  • 《Dual Prompt Personalized Federated Learning in Foundation Models》——论文阅读
  • 自然语言处理(NLP)技术的发展历史
  • 【QT入门到晋级】进程间通信(IPC)-socket(包含性能优化案例)
  • Python爬虫实战:研究ICP-Checker,构建ICP 备案信息自动查询系统
  • GIS在海洋大数据的应用
  • 数据结构:深入解析常见数据结构及其特性
  • 3 创建wordpress网站
  • 【实时Linux实战系列】实时大数据处理与分析