Ansible Playbook 实战:批量配置 Linux 主机

前言

在云原生运维、服务器集群管理场景中,我们经常需要对多台 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 集群节点、业务服务器的标准化部署,都可以基于该模板迭代优化,彻底告别手动运维,实现环境统一、高效、可复用。

相关推荐
迷茫的大专生12 天前
服务器部署与 MySQL 运维学习笔记:从 Ansible 到高可用与性能优化
mysql·nginx·ansible·mysql优化·keepalive
杜子不疼.14 天前
Ansible 批量部署 Node Exporter:从单机安装流程到远程主机统一执行
ai·ansible
运维全栈笔记15 天前
Ansible 自动化 Nginx 集群部署实战:动态 Inventory、滚动发布与 Role 工程化
nginx·自动化·ansible
User_芊芊君子20 天前
让异构增量同步飞起来-KFS全链路并行同步方案
运维·自动化·ansible
あ-22 天前
ansible-playbook安装seaweedfs三节点集群
ansible
Tassel_YUE24 天前
非 ansible 主机批量执行命令方法:psssh 和 pscp(随手记)
linux·网络·ssh·scp·ansible
亿朝亿夕1 个月前
ansible安装
ansible
.柒宇.1 个月前
运维常见面试题_07_配置管理与监控(Ansible · Prometheus · Alertmanager)· 容器编排(Kubernetes)
运维·k8s·ansible·prometheus
相顾若初见1 个月前
Ansible部署k8s
容器·kubernetes·ansible