安装角色与内容集合

AnsibleBeginner
立即练习

介绍

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 打包并安装了一个本地角色,检查了已安装的集合内容,并从剧本中应用了该已安装的角色。