将基准文件部署到受管节点

AnsibleBeginner
立即练习

介绍

一旦清单(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 模板将基准文件部署到了受管主机别名。这为可重复的受管节点状态变更奠定了基础。