一、配置管理概述
1.1 配置管理的重要性
在大规模 IT 环境中,服务器数量众多且用途各异,若缺乏有效的配置管理,极易出现环境混乱问题。例如,不同服务器的软件版本不一致、安全设置参差不齐,这不仅会增加运维复杂度,还可能引发系统故障与安全风险。配置管理旨在通过标准化、自动化手段,确保所有服务器具备相同的基础配置与运行环境,提升系统稳定性与可维护性。
1.2 Ansible 的优势
与传统手动配置或脚本配置方式相比,Ansible 具有显著优势。其基于 YAML 的 Playbook 编写简洁直观,易于理解与维护;无需在目标主机安装代理,通过 SSH 即可通信,降低部署成本;模块化设计支持丰富的配置任务,从系统基础设置到复杂应用部署均可轻松应对,且能实现幂等性操作,即多次执行同一 Playbook 不会对已正确配置的环境造成额外改变,有效保障配置一致性。
二、服务器基础配置
2.1 操作系统初始化配置
以 CentOS 系统为例,使用 Ansible 进行操作系统初始化配置的 Playbook 如下:
- name: OS Initialization for CentOS
hosts: all_centos_servers
become: yes
tasks:
- name: Set hostname
hostname:
name: "{{ inventory_hostname }}"
- name: Configure network
lineinfile:
path: /etc/sysconfig/network-scripts/ifcfg-eth0
line: "IPADDR=192.168.1.{{ item }}"
insertafter: "^BOOTPROTO=static"
with_items:
- 10
- 11
- 12
- name: Update system packages
yum:
name: "*"
state: latest
解释:
- hosts: all_centos_servers:指定该 Playbook 作用于主机清单中名为all_centos_servers的主机组,可在/etc/ansible/hosts文件中提前定义。
- become: yes:获取 root 权限执行后续任务。
- Set hostname任务:使用hostname模块,将主机名设置为清单中的主机名变量{{ inventory_hostname }}。
- Configure network任务:通过lineinfile模块修改网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0,在BOOTPROTO=static行后插入指定 IP 地址(通过with_items循环为不同主机设置不同 IP)。
- Update system packages任务:利用yum模块更新所有系统软件包至最新版本。
2.2 用户管理
以下 Playbook 用于创建用户并设置权限:
- name: User Management
hosts: all_servers
become: yes
tasks:
- name: Create user
user:
name: appuser
comment: "Application user"
createhome: yes
shell: /bin/bash
- name: Set user password (using encrypted password)
user:
name: appuser
password: "$6$rounds=656000$H6a9rFfX$t2dXW7Lm9pT3ZvGJf1sJ5bF6Xm1p9Qj5y3eT1dN4Z7R1b1V6u2h7m4K2t1R4V2m3c"
- name: Add user to group
user:
name: appuser
groups: wheel
append: yes
解释:
- Create user任务:创建名为appuser的用户,生成用户主目录并设置默认 Shell 为/bin/bash。
- Set user password任务:设置用户密码,密码为加密后的字符串(可通过mkpasswd -m sha - 512等工具生成)。
- Add user to group任务:将appuser添加到wheel组(以 CentOS 为例,该组用户可获取 sudo 权限),append: yes表示追加到组,不覆盖原有组设置。
2.3 安全配置
以防火墙与 SSH 密钥管理为例:
- name: Security Configuration
hosts: all_servers
become: yes
tasks:
- name: Configure firewall (using firewalld)
firewalld:
service: ssh
permanent: yes
state: enabled
- name: Disable root login via SSH
lineinfile:
path: /etc/ssh/sshd_config
line: "PermitRootLogin no"
insertafter: "^#PermitRootLogin yes"
backup: yes
- name: Distribute SSH public key
authorized_key:
user: appuser
key: "{{ lookup('file', '/home/user/.ssh/id_rsa.pub') }}"
解释:
- Configure firewall任务:使用firewalld模块启用 SSH 服务并永久生效。
- Disable root login via SSH任务:修改/etc/ssh/sshd_config文件禁止 root 通过 SSH 登录,backup: yes保留原文件备份。
- Distribute SSH public key任务:将指定的公钥文件内容添加到appuser的授权密钥列表,实现免密登录。
三、软件安装与配置
3.1 Web 服务器安装(以 Apache 为例)
- name: Install and Configure Apache
hosts: web_servers
become: yes
tasks:
- name: Install Apache
yum:
name: httpd
state: present
- name: Start Apache service
service:
name: httpd
state: started
enabled: yes
- name: Configure virtual host
template:
src: httpd - vhosts.conf.j2
dest: /etc/httpd/conf.d/httpd - vhosts.conf
解释:
- Install Apache任务:通过yum模块安装 Apache 软件包。
- Start Apache service任务:启动 Apache 服务并设置开机自启。
- Configure virtual host任务:使用template模块,将httpd - vhosts.conf.j2模板文件渲染后复制到目标路径,用于配置虚拟主机(模板文件可包含动态变量,如域名、文档根目录等)。
3.2 数据库服务器配置(以 MySQL 为例)
- name: Install and Configure MySQL
hosts: db_servers
become: yes
tasks:
- name: Install MySQL
yum:
name: mariadb - server
state: present
- name: Start MySQL service
service:
name: mariadb
state: started
enabled: yes
- name: Secure MySQL installation
shell: mysql_secure_installation --set - password=password '{{ mysql_root_password }}'
vars:
mysql_root_password: "MySecureP@ss123"
- name: Create database and user
mysql_db:
name: mydb
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
mysql_user:
name: myuser
host: "%"
password: "MyUserP@ss456"
priv: "mydb.*:ALL"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
解释:
- Install MySQL任务:安装 MariaDB(MySQL 分支)服务器软件包。
- Secure MySQL installation任务:执行mysql_secure_installation脚本设置 root 密码(通过变量传递)。
- Create database and user任务:分别使用mysql_db与mysql_user模块创建数据库mydb及用户myuser,并分配权限。
四、配置管理的版本控制与回滚
4.1 纳入版本控制系统
将 Ansible 配置文件(如ansible.cfg、主机清单、Playbook 及模板文件)添加到 Git 仓库进行版本管理。在项目根目录执行:
git init
git add.
git commit -m "Initial Ansible configuration commit"
后续修改配置后,按常规 Git 流程提交与推送,便于追踪配置变更历史。
4.2 回滚操作
若配置出现问题,可通过 Git 回滚至之前稳定版本。例如,回滚至上一个提交版本:
git reset --hard HEAD^
然后重新执行正确版本的 Playbook,快速恢复环境一致性。