介绍
Ansible 内容可以来自角色(roles)和集合(collections)。在受限的实验环境中,使用本地内容归档比从互联网下载更安全。
在本实验中,你将打包一个本地角色,通过需求文件(requirements file)进行安装,检查预装的集合,并应用已安装的角色。
创建内容安装项目
在此步骤中,你将创建一个包含本地内容源、已安装角色、剧本(playbook)和输出目录的项目。
cd /home/labex/project
mkdir -p rhce-ansible/{inventory,roles,vendor_src/local_message/{tasks,meta},playbooks,managed,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
roles_path = ./roles
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[managed]
host ansible_connection=local
EOF
本实验将角色源与已安装的角色内容分离开来。vendor_src/local_message 代表你接收或构建的内容,而 roles/local_message 将是 Ansible 实际加载的安装副本。
构建本地角色源
在此步骤中,你将在已安装的 roles 目录之外创建一个小型角色源。这模拟了从受信任来源接收角色内容的过程。
在执行此步骤中的命令之前,请返回 Ansible 项目目录。这样即使 LabEx 分步运行,命令也能保持稳定。
cd /home/labex/project/rhce-ansible
cat > vendor_src/local_message/tasks/main.yml <<'EOF'
---
- name: Ensure local message directory exists
ansible.builtin.file:
path: /home/labex/project/rhce-ansible/managed/local-message
state: directory
mode: '0755'
- name: Write message from installed role
ansible.builtin.copy:
dest: /home/labex/project/rhce-ansible/managed/local-message/message.txt
content: |
installed_role=local_message
mode: '0644'
EOF
cat > vendor_src/local_message/meta/main.yml <<'EOF'
---
galaxy_info:
author: LabEx
description: Local role for RHCE Ansible prep
license: MIT
min_ansible_version: '2.16'
dependencies: []
EOF
该角色源具有与普通角色相同的基本结构:tasks/main.yml 中的任务逻辑和 meta/main.yml 中的角色元数据。该任务会写入一条可见的消息,以便你验证已安装的角色是否已执行。
tar -czf vendor_src/local_message.tar.gz -C vendor_src local_message
该归档文件模拟了一个离线角色包。使用本地归档文件既能保持实验的确定性,又能教授 requirements.yml 的工作流程。
ls -l vendor_src/local_message.tar.gz
通过需求文件安装角色
在此步骤中,你将编写一个指向本地归档文件的角色需求文件,并将其安装到 roles 目录中。
在执行此步骤中的命令之前,请返回 Ansible 项目目录。这样即使 LabEx 分步运行,命令也能保持稳定。
cd /home/labex/project/rhce-ansible
cat > requirements.yml <<'EOF'
---
roles:
- name: local_message
src: file:///home/labex/project/rhce-ansible/vendor_src/local_message.tar.gz
EOF
file:// 源将 ansible-galaxy 指向本地归档文件。这与使用远程源的思路相同,但无需依赖网络访问。
ansible-galaxy role install -r requirements.yml -p roles --force
-r 选项用于读取需求文件,-p roles 指定安装目录,--force 确保在重新运行实验时命令可重复执行。
find roles/local_message -maxdepth 2 -type f -print
你应该能看到已安装角色的 tasks/main.yml 和 meta/main.yml。剧本将使用已安装的角色路径,而不是原始的 vendor_src 目录。
检查已安装的集合内容
在此步骤中,你将检查一个已安装的集合。RHEL10 镜像中已经包含了常见的集合,因此本实验避免了从互联网下载,同时展示了集合的发现过程。 在执行此步骤中的命令之前,请返回 Ansible 项目目录。这样即使 LabEx 分步运行,命令也能保持稳定。
cd /home/labex/project/rhce-ansible
ansible-galaxy collection list ansible.posix | tee reports/collection-list.txt
ansible-doc ansible.posix.acl | sed -n "1,20p"
集合将模块打包在命名空间下。此处 ansible.posix.acl 表示来自 ansible.posix 集合的 acl 模块,而 ansible-doc 证明了 Ansible 可以在本地找到其文档。
应用已安装的角色
在此步骤中,你将应用通过需求文件安装的角色。这证明了 Ansible 可以找到并执行已安装的角色内容。 在执行此步骤中的命令之前,请返回 Ansible 项目目录。这样即使 LabEx 分步运行,命令也能保持稳定。
cd /home/labex/project/rhce-ansible
cat > playbooks/use-installed-role.yml <<'EOF'
---
- name: Use a locally installed role
hosts: managed
gather_facts: false
roles:
- role: local_message
EOF
剧本仅引用了 local_message,因为 roles_path 指向了安装目录。这使得剧本独立于归档文件的位置。
ansible-playbook playbooks/use-installed-role.yml | tee reports/installed-role-run.txt
运行结果应显示 failed=0,并创建由已安装角色的任务生成的消息文件。
cat managed/local-message/message.txt
总结
你通过 requirements.yml 打包并安装了一个本地角色,检查了已安装的集合内容,并从剧本中应用了该已安装的角色。


