介绍
一旦清单(inventory)和访问权限配置就绪,常见的后续任务就是部署基准文件。基准文件可能包括横幅(banner)、服务片段或合规性标记,这些文件在各主机间应保持一致,但仍需包含特定于主机的数值。
在本实验中,你将创建一个小型多主机清单,定义组变量,编写模板,运行剧本(playbook),并验证各主机的基准文件。
创建基准部署项目
在此步骤中,你将创建一个包含清单、模板、文件和剧本的项目。这种结构将可重用的源内容与剧本逻辑分离开来。
创建并进入项目目录。
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,playbooks,files,templates,managed}
cd rhce-ansible
创建 ansible.cfg。
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
retry_files_enabled = False
interpreter_python = auto_silent
EOF
这些目录在工作流中区分了不同的角色:files 存放无需修改直接复制的内容,templates 存放使用变量渲染的内容,playbooks 存放自动化逻辑,而 managed 将展示最终针对每台主机的生成结果。
创建清单和基准变量
在此步骤中,你将定义两个受管主机别名和共享的基准变量。这些变量稍后将在模板中使用。
在执行此步骤的命令之前,请返回 Ansible 项目目录。这能确保即使 LabEx 分步运行,命令依然稳定有效。
cd /home/labex/project/rhce-ansible
创建清单。
cat > inventory/hosts <<'EOF'
[managed]
node1 ansible_connection=local
node2 ansible_connection=local
EOF
这两个别名允许一个剧本生成两个独立的受管输出。即使这两个别名都在同一台虚拟机上运行,Ansible 依然会为每台主机渲染出不同的 inventory_hostname。
为受管主机创建组变量。
cat > inventory/group_vars/managed.yml <<'EOF'
baseline_owner: labex
baseline_environment: training
EOF
这些变量适用于 managed 组中的每一台主机。它们代表了在基准配置中应共享的数值,而主机名将保持为特定于主机的状态。
创建源文件和模板
在此步骤中,你将创建源内容。普通文件会被直接复制,而 Jinja2 模板则使用 inventory_hostname 和 baseline_environment 等变量来渲染特定于主机的输出。
在执行此步骤的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
创建一个共享的横幅文件。
cat > files/banner.txt <<'EOF'
Managed by RHCE Ansible Prep
EOF
该横幅是纯文本源内容。它将被原样复制,因此适用于那些不需要随主机变化的内容。
创建一个模板。
cat > templates/baseline.conf.j2 <<'EOF'
host={{ inventory_hostname }}
environment={{ baseline_environment }}
owner={{ baseline_owner }}
EOF
该模板包含 Jinja2 表达式。当 Ansible 渲染它时,inventory_hostname 会变为 node1 或 node2,而基准变量则来自 inventory/group_vars/managed.yml。
编写基准部署剧本
在此步骤中,你将编写一个剧本,为每个主机别名创建一个目录,并部署共享的横幅和渲染后的模板。由于剧本存储在 playbooks 中,源路径将使用 ../files 和 ../templates。
在执行此步骤的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
创建剧本。
cat > playbooks/deploy-baseline.yml <<'EOF'
---
- name: Deploy baseline files to managed aliases
hosts: managed
gather_facts: false
tasks:
- name: Create per-host baseline directory
ansible.builtin.file:
path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
state: directory
mode: '0755'
- name: Copy shared banner
ansible.builtin.copy:
src: ../files/banner.txt
dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/banner.txt"
mode: '0644'
- name: Render baseline configuration
ansible.builtin.template:
src: ../templates/baseline.conf.j2
dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/baseline.conf"
mode: '0644'
EOF
将这三个任务视为一个完整的部署序列。首先为每个主机别名创建目标目录,然后复制静态横幅,最后将模板渲染为特定于主机的配置文件。
运行语法检查。
ansible-playbook playbooks/deploy-baseline.yml --syntax-check
语法检查应打印出一行 playbook:。这确认了在剧本写入任何受管文件之前,Ansible 可以正确解析相对源路径。
运行并验证基准部署
在此步骤中,你将运行剧本并检查渲染后的文件。渲染后的配置应根据主机名有所不同,同时保持共享的 environment 和 owner 数值。
在执行此步骤的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
运行剧本。
ansible-playbook playbooks/deploy-baseline.yml
首次运行应报告变更,因为受管目录和文件尚未存在。如果执行摘要显示 failed=0,则意味着每个主机别名都已成功接收基准配置。
检查部署的文件。
find managed -maxdepth 3 -type f -print
cat managed/node1/banner.txt managed/node1/baseline.conf managed/node2/banner.txt managed/node2/baseline.conf
banner.txt 文件应完全一致。baseline.conf 文件应共享相同的 environment 和 owner 数值,但在 host= 行上有所不同。
总结
你使用清单变量、共享源文件和 Jinja2 模板将基准文件部署到了受管主机别名。这为可重复的受管节点状态变更奠定了基础。


