2. Ansible 架构与核心组件
Ansible 采用无代理(Agentless)架构,通过 SSH 或 WinRM 协议直接管理远程节点。其核心设计围绕“控制节点”与“受管节点”的分离,以及一套声明式的任务编排语言。理解这些组件是构建可靠自动化基线的基础。
2.1 架构总览:控制节点与受管节点
Ansible 的运行时拓扑极为简洁:控制节点(Control Node)是安装 Ansible 的主机,负责下发指令;受管节点(Managed Node)是被管理的目标主机,只需开放 SSH(Linux)或 WinRM(Windows)端口,无需预装 Agent。
基线核验提示:在环境一致性核验场景中,控制节点通常作为“审计跳板机”部署,受管节点无需额外安装软件,这大幅降低了大规模基线扫描的部署成本。
2.2 核心组件详解
Ansible 的功能由以下七大核心组件协同完成。下表总结了各组件的职责与在基线核验中的典型用途:
| 组件 | 职责 | 基线核验场景示例 |
|---|---|---|
| Inventory | 定义受管节点列表与分组 | 按环境(dev/staging/prod)或角色(web/db)分组,指定连接变量 |
| Modules | 执行具体任务的原子单元 | command、shell、file、lineinfile 等模块用于检查文件权限、内核参数 |
| Playbooks | YAML 格式的任务编排文件 | 编写“基线核验剧本”,按顺序执行多项检查并生成报告 |
| Plugins | 扩展 Ansible 核心功能 | 使用 callback 插件自定义核验结果输出格式(JSON/CSV) |
| Connection Plugins | 定义控制节点与受管节点的通信方式 | 默认 SSH;网络设备使用 network_cli;容器使用 docker |
2.3 Inventory:受管节点清单
Inventory 是 Ansible 的“地址簿”,支持静态文件(INI/YAML)和动态脚本(如从云 API 拉取)。基线核验中,通常按环境与角色组织主机:
# inventory/baseline.ini
[web_servers]
web01 ansible_host=192.168.1.10
web02 ansible_host=192.168.1.11
[db_servers]
db01 ansible_host=192.168.1.20
[all:vars]
ansible_user=auditor
ansible_ssh_private_key_file=/home/auditor/.ssh/baseline_key
最佳实践:为基线核验创建专用 Inventory 文件,使用
auditor 等只读用户,避免使用 root 或 sudo 权限,确保核验操作不影响生产环境。
2.4 Modules 与 Playbooks:任务执行核心
Modules 是 Ansible 的“工具箱”,每个模块独立完成一项操作(如复制文件、安装包、执行命令)。Playbooks 将这些模块按逻辑顺序编排成剧本,支持条件判断、循环、变量和错误处理。
以下是一个基线核验 Playbook 片段,用于检查受管节点的内核参数:
---
- name: 基线核验 - 内核参数检查
hosts: all
gather_facts: yes
tasks:
- name: 检查 net.ipv4.tcp_syncookies 是否启用
ansible.builtin.shell:
cmd: sysctl net.ipv4.tcp_syncookies
register: syncookies_result
changed_when: false
- name: 输出检查结果
ansible.builtin.debug:
msg: "tcp_syncookies = {{ syncookies_result.stdout_lines[0] }}"
2.5 Plugins 与 Connection Plugins:扩展与通信
Plugins 增强了 Ansible 的灵活性。在基线核验中,最常用的是 Callback Plugins(自定义输出格式)和 Filter Plugins(数据转换)。Connection Plugins 则决定了 Ansible 如何“连”上目标主机:
- ssh(默认):通过 SSH 协议连接 Linux/Unix 主机。
- winrm:通过 WinRM 协议连接 Windows 主机。
- local:直接在控制节点本地执行,用于管理控制节点自身。
- network_cli:专为网络设备(如 Cisco、Juniper)设计的 CLI 连接方式。
- docker:直接与 Docker 容器交互,无需 SSH。
2.6 组件协作流程
一次典型的 Ansible 执行流程如下:
- 加载 Inventory:解析主机清单,确定目标节点与分组。
- 读取 Playbook:解析 YAML 剧本,提取任务列表与变量。
- 建立连接:通过 Connection Plugin(如 SSH)连接到每个受管节点。
- 收集 Facts:自动收集目标节点系统信息(可选,通过
gather_facts: yes控制)。 - 执行任务:按顺序调用 Modules,每个模块在目标节点上执行并返回结果。
- 处理结果:通过 Callback Plugin 输出结果,支持 JSON、YAML 或自定义格式。
基线核验注意事项:在核验场景中,建议关闭
gather_facts 以加速执行(除非需要系统信息),并使用 changed_when: false 避免误报变更。所有核验任务应保持幂等性,即多次执行结果一致。