介绍
角色(Roles)将默认值、任务、模板、文件和处理器(Handlers)打包成一种可重用的结构。它们能让 Playbook 保持简洁,并使自动化配置更易于共享。
在本实验中,你将手动创建一个角色,添加默认值、模板和任务,然后将其应用到两个主机别名上。
创建角色练习项目
在此步骤中,你将创建一个包含 roles 目录和两个本地 Web 主机别名的项目。
cd /home/labex/project
mkdir -p rhce-ansible/{inventory,roles,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'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
EOF
roles_path = ./roles 设置告诉 Ansible 在哪里查找 Playbook 中使用的角色名称。如果没有此设置,Ansible 可能只会搜索系统级或用户级的角色路径。
创建角色目录结构
在此步骤中,你将创建关键的角色目录。defaults 用于存储低优先级的变量,tasks 用于存储任务逻辑,而 templates 用于存储 Jinja2 模板。
在执行此步骤的命令之前,请返回 Ansible 项目目录。这样即使 LabEx 分步运行,命令也能保持稳定。
cd /home/labex/project/rhce-ansible
mkdir -p roles/web_banner/{defaults,tasks,templates}
find roles/web_banner -maxdepth 2 -type d | sort
输出应显示角色根目录以及 defaults、tasks 和 templates。这些名称对 Ansible 具有特定含义;例如,tasks/main.yml 是该角色的任务入口点。
添加角色默认值和模板
在此步骤中,你将添加默认变量和模板。除非 Playbook 或清单(Inventory)覆盖这些值,否则角色将使用这些默认值。 在执行此步骤的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
cat > roles/web_banner/defaults/main.yml <<'EOF'
---
banner_message: Welcome to RHCE Ansible Prep
EOF
cat > roles/web_banner/templates/banner.txt.j2 <<'EOF'
Host: {{ inventory_hostname }}
Message: {{ banner_message }}
EOF
默认值是低优先级的角色变量。当 Playbook 或清单未提供值时,它们为角色提供可用的默认值,同时仍允许调用者在后续进行覆盖。
cat roles/web_banner/defaults/main.yml roles/web_banner/templates/banner.txt.j2
该模板将当前主机别名与默认消息结合在一起。当角色为两台主机运行时,同一个模板应渲染出两行不同的 Host: 信息。
添加角色任务并应用角色
在此步骤中,你将添加 tasks/main.yml 以及一个应用该角色的 Playbook。该角色会创建一个主机目录,并为每台主机渲染一个横幅文件。
在执行此步骤的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
cat > roles/web_banner/tasks/main.yml <<'EOF'
---
- name: Ensure host banner directory exists
ansible.builtin.file:
path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
state: directory
mode: '0755'
- name: Render host banner
ansible.builtin.template:
src: banner.txt.j2
dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/banner.txt"
mode: '0644'
EOF
cat > playbooks/apply-role.yml <<'EOF'
---
- name: Apply reusable web banner role
hosts: web
gather_facts: false
roles:
- role: web_banner
EOF
角色任务文件包含了具体实现,而 playbooks/apply-role.yml 则保持简洁,仅指定角色名称。这就是角色的核心价值:在不重复编写每个任务的情况下实现结构的可重用性。
ansible-playbook playbooks/apply-role.yml --syntax-check
运行基于角色的 Playbook
在此步骤中,你将运行 Playbook 并检查渲染后的文件。由于角色承载了可重用的实现,Playbook 保持了简洁。 在执行此步骤的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/apply-role.yml | tee reports/role-run.txt
运行过程应针对 web 组中的每个主机别名执行一次角色。如果执行结果显示 failed=0,则说明角色已通过 roles_path 被成功找到,且任务已完成。
cat managed/web1/banner.txt managed/web2/banner.txt
渲染后的文件应共享相同的消息,但具有不同的 Host: 行。这证明了角色在重用相同逻辑的同时,仍能针对每台主机渲染出对应的数据。
总结
你构建了一个可重用的角色结构,添加了默认值、任务和模板,通过 Playbook 应用了该角色,并验证了渲染输出。


