前言
在云原生运维、服务器集群管理场景中,我们经常需要对多台 Linux 主机做统一初始化、基线配置、环境标准化。
如果采用手动逐台操作,会出现大量重复劳动,同时极易产生配置不一致、漏配置、配置错误等问题,后续集群运维、K8s 部署、服务上线都会埋下隐患。
Ansible 作为无Agent的自动化运维工具,基于 SSH 协议实现管控,无需在被控主机安装客户端。通过编写 Playbook 剧本,可以实现「一次编写、批量执行、统一交付」,完美解决多主机标准化配置问题。
本文主打落地实战,从零完成环境准备、主机清单配置、完整初始化剧本编写、执行校验、排错复盘,所有代码可直接复制运行,适合作为云原生运维、自动化运维的入门实战案例。
环境说明
本次实战环境统一标准化,适配 CentOS / Rocky Linux 全系:
-
控制节点:Rocky Linux 9 + ansible-core 最新版
-
被控节点:多台 Rocky Linux 9 服务器(集群主机)
-
通信方式:SSH 密钥免密登录(生产最优方案,无明文密码风险)
-
实战目标:批量完成 Linux 服务器生产基线初始化配置
一、前期环境准备
1.1 被控主机免密互通配置
Ansible 所有操作基于 SSH 通信,必须保证控制节点可免密登录所有被控节点。
在控制节点执行以下命令生成 SSH 密钥:
bash
# 生成ssh密钥,全程回车默认即可
ssh-keygen
# 分发公钥到所有被控节点,替换为自己节点IP
ssh-copy-id root@192.168.122.10
ssh-copy-id root@192.168.122.11
ssh-copy-id root@192.168.122.12
1.2 编写主机清单 Inventory 文件
Inventory 是 Ansible 的核心主机清单,用于统一管理所有被控主机,支持分组管理、全局变量配置。
新建 inventory.ini 文件:
ini
# 定义主机分组
[linux_nodes]
node1 ansible_host=192.168.122.10
node2 ansible_host=192.168.122.11
node3 ansible_host=192.168.122.12
# 分组全局变量
[linux_nodes:vars]
ansible_user=root
ansible_ssh_private_key_file=/root/.ssh/id_rsa
1.3 连通性测试
通过 ansible 内置 ping 模块,测试所有主机是否正常连通:
bash
ansible -i inventory.ini linux_nodes -m ping
所有主机返回 SUCCESS 即为环境就绪,可正常执行剧本。
二、核心实战:批量初始化 Playbook
2.1 剧本实现功能
本次编写的 linux_init.yml 是运维通用基线剧本,覆盖生产环境最常用的初始化操作:
-
批量设置主机名(与清单主机名保持一致)
-
关闭并禁用防火墙、关闭 SELinux(集群节点标准配置)
-
批量安装系统必备工具包
-
创建运维普通用户并配置 sudo 免密权限
-
配置 chrony 时间同步,保证集群时间统一
-
强制立即同步系统时间并输出结果
2.2 完整 Playbook 代码
新建 linux_init.yml,完整可直接运行:
yaml
---
- name: 批量Linux生产主机初始化基线配置
hosts: linux_nodes
gather_facts: true
become: true
tasks:
# 1. 设置主机名
- name: 批量修改主机名
ansible.builtin.hostname:
name: "{{ inventory_hostname }}"
# 2. 关闭防火墙并禁用开机自启
- name: 关闭并禁用firewalld
ansible.builtin.service:
name: firewalld
state: stopped
enabled: false
# 3. 关闭SELinux
- name: 永久关闭SELinux
ansible.builtin.selinux:
state: disabled
# 4. 安装基础运维工具
- name: 批量安装系统必备工具包
ansible.builtin.dnf:
name:
- chrony
- vim
- net-tools
- wget
- tree
- lsof
- curl
state: present
# 5. 创建运维普通用户
- name: 创建ops运维用户
ansible.builtin.user:
name: ops
shell: /bin/bash
state: present
# 6. 配置sudo免密
- name: 配置ops用户sudo免密权限
ansible.builtin.copy:
content: 'ops ALL=(ALL) NOPASSWD: ALL'
dest: /etc/sudoers.d/ops
mode: '0440'
# 7. 启动时间同步服务
- name: 启动chrony时间同步并开机自启
ansible.builtin.service:
name: chronyd
state: started
enabled: true
# 8. 强制同步系统时间
- name: 立即同步系统时间
ansible.builtin.command: chronyc makestep
register: chrony_sync
changed_when: false
# 9. 打印同步结果
- name: 输出时间同步结果
ansible.builtin.debug:
msg: "时间同步结果:{{ chrony_sync.stdout }}"
三、Playbook 标准执行流程
生产环境执行 Playbook 必须遵循 语法校验 - 模拟空跑 - 正式执行 三步流程,避免批量故障。
3.1 语法校验
bash
ansible-playbook -i inventory.ini linux_init.yml --syntax-check
返回 syntax check passed 代表剧本语法无错误。
3.2 模拟空跑(Dry-run)
只模拟执行、不修改任何主机配置,用于提前检查配置逻辑:
bash
ansible-playbook -i inventory.ini linux_init.yml --check
3.3 正式批量执行
bash
ansible-playbook -i inventory.ini linux_init.yml
执行完毕后,所有节点自动完成全套初始化基线配置,集群环境统一标准化。
四、实战高频踩坑总结
整理实操过程中最常见的报错与解决方案,适配新手避坑:
1. SSH 连接失败
原因:主机不通、防火墙拦截、免密未配置、密钥权限异常。
解决:检查 IP 连通性、重新分发密钥、关闭被控节点默认防火墙。
2. SELinux 模块报错
低版本 Ansible 无内置 selinux 模块,可改用 command 直接修改配置文件。
3. sudo 权限失效
/etc/sudoers.d/ 下文件权限必须为 0440,权限过大会被系统拦截,导致 sudo 无法使用。
4. 执行速度过慢
gather_facts: true 会收集主机信息,大批量机器执行可关闭该参数,提升执行速度。
五、进阶扩展方向
本文剧本为基础基线模板,可基于此持续迭代,适配 K8s 集群节点预部署场景:
-
批量修改内核参数,适配 K8s 内核优化
-
批量配置系统资源限制 limits.conf
-
自动化部署 containerd、docker 容器运行时
-
将剧本改造为 Ansible Role,实现结构化、工程化运维
-
结合 CI/CD 实现集群环境一键初始化
总结
Ansible Playbook 的核心价值是声明式自动化运维:我们只需要定义「服务器最终的标准状态」,无需关注每一步操作流程,Ansible 会自动比对主机现状,完成增量配置。
这套批量初始化剧本是云原生运维的基石,所有 K8s 集群节点、业务服务器的标准化部署,都可以基于该模板迭代优化,彻底告别手动运维,实现环境统一、高效、可复用。