一、引言
Ansible 作为一款强大的自动化运维工具,在实际的 IT 运维工作中发挥着重要作用。通过前几篇文章的由浅入深,全方位讲解了ansible的概念和使用方法,使我们更好地理解和掌握 Ansible 的使用技巧;本篇文章,作为本系列的收官之作,将通过具体的实践案例,总结出一些最佳实践,提高运维效率和系统的稳定性。本文将分享几个常见的 Ansible 实践案例,并介绍相关的最佳实践经验。
二、实践案例
2.1 批量安装软件
案例描述
在一个包含多台 CentOS 服务器的集群中,需要批量安装 Nginx 服务器软件。
步骤
1、准备库存文件
创建一个名为 inventory.ini
的文件,内容如下:
[web_servers]
server1 ansible_host=192.168.1.101
server2 ansible_host=192.168.1.102
解释:
[web_servers]
是主机组名称。ansible_host
指定了服务器的实际 IP 地址。
2、编写 Playbook
创建一个名为 install_nginx.yml
的 Playbook 文件,内容如下:
---
- name: Install Nginx on Web Servers
hosts: web_servers
become: true
tasks:
- name: Install Nginx
yum:
name: nginx
state: present
- name: Start Nginx service
service:
name: nginx
state: started
enabled: true
解释:
hosts: web_servers
表示该 Playbook 将在web_servers
主机组中的所有服务器上执行。become: true
表示以超级用户权限执行任务。yum
模块用于安装软件包,state: present
表示确保软件包已安装。service
模块用于管理服务,state: started
表示启动服务,enabled: true
表示设置服务开机自启。
3、执行 Playbook
在终端中执行以下命令:
ansible-playbook -i inventory.ini install_nginx.yml
2.2 配置文件分发
案例描述
需要将本地的 Nginx 配置文件分发到多台 CentOS 服务器上,并重启 Nginx 服务。
步骤
-
准备配置文件
在本地创建一个名为nginx.conf
的 Nginx 配置文件。 -
编写 Playbook
创建一个名为distribute_nginx_config.yml
的 Playbook 文件,内容如下:
---
- name: Distribute Nginx Config
hosts: web_servers
become: true
tasks:
- name: Copy Nginx config file
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
- name: Restart Nginx service
service:
name: nginx
state: restarted
解释:
copy
模块用于将本地文件复制到远程服务器,src
指定本地文件路径,dest
指定远程文件路径。
3、执行 Playbook
在终端中执行以下命令:
ansible-playbook -i inventory.ini distribute_nginx_config.yml
2.3 自动化部署应用
案例描述
在多台 CentOS 服务器上自动化部署一个 Python Flask 应用。
步骤
-
准备应用代码
将 Python Flask 应用的代码放在本地的一个目录中。 -
编写 Playbook
创建一个名为deploy_flask_app.yml
的 Playbook 文件,内容如下:
---
- name: Deploy Flask App
hosts: web_servers
become: true
tasks:
- name: Install Python and pip
yum:
name:
- python3
- python3-pip
state: present
- name: Create application directory
file:
path: /opt/flask_app
state: directory
- name: Copy application code
copy:
src: ./flask_app/
dest: /opt/flask_app
- name: Install application dependencies
pip:
requirements: /opt/flask_app/requirements.txt
- name: Start Flask application
shell: nohup python3 /opt/flask_app/app.py &
解释:
file
模块用于创建目录,state: directory
表示创建目录。pip
模块用于安装 Python 包,requirements
指定依赖文件路径。shell
模块用于执行 shell 命令,nohup
和&
用于在后台运行应用。
3、执行 Playbook
在终端中执行以下命令:
ansible-playbook -i inventory.ini deploy_flask_app.yml
2.4 数据库集群配置与初始化
案例描述
在 CentOS 环境中搭建 MySQL 主从复制集群,需自动化完成以下任务:
- 安装 MySQL 服务
- 配置主库(Master)与从库(Slave)参数
- 初始化主从复制关系
步骤
1. 准备库存文件
在 inventory.ini 中定义主机组:
[mysql_master]
master ansible_host=192.168.1.103
[mysql_slaves]
slave1 ansible_host=192.168.1.104
slave2 ansible_host=192.168.1.105
[mysql_cluster:children]
mysql_master
mysql_slaves
解释:
- [mysql_master] 和 [mysql_slaves] 分别定义主库与从库主机。
- [mysql_cluster:children] 将主从库组合成一个集群组。
2. 编写 Playbook
创建 mysql_cluster_setup.yml:
---
- name: Setup MySQL Cluster
hosts: mysql_cluster
become: true
tasks:
- name: Install MySQL
yum:
name: mysql-server
state: present
- name: Start MySQL service
service:
name: mysqld
state: started
enabled: true
- name: Configure MySQL Master (on master only)
when: inventory_hostname in groups['mysql_master']
block:
- name: Set server-id and log-bin
lineinfile:
path: /etc/my.cnf
lines:
- "server-id=1"
- "log-bin=mysql-bin"
- name: Restart MySQL after config change
service:
name: mysqld
state: restarted
- name: Configure MySQL Slave (on slaves only)
when: inventory_hostname in groups['mysql_slaves']
block:
- name: Set server-id
lineinfile:
path: /etc/my.cnf
line: "server-id={{ 2 + groups['mysql_slaves'].index(inventory_hostname) }}"
- name: Restart MySQL after config change
service:
name: mysqld
state: restarted
- name: Initialize Master-Slave Replication (on slaves only)
when: inventory_hostname in groups['mysql_slaves']
shell: |
mysql -e "CHANGE MASTER TO
MASTER_HOST='192.168.1.103',
MASTER_USER='repl_user',
MASTER_PASSWORD='repl_pass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;
START SLAVE;"
注释:
- when 条件判断主机所属组,分别执行主库与从库配置。
- lineinfile 模块修改 my.cnf 配置文件。
- shell 模块执行 SQL 命令初始化主从复制。
3. 执行 Playbook
ansible-playbook -i inventory.ini mysql_cluster_setup.yml
2.5 防火墙策略批量部署
案例描述
为多台 CentOS 服务器统一配置防火墙(firewalld)规则,允许 HTTP、HTTPS 流量,禁用非必要端口。
步骤
1. 编写 Playbook
创建 firewall_config.yml:
---
- name: Configure Firewall Rules
hosts: all
become: true
tasks:
- name: Enable HTTP and HTTPS services
firewalld:
service: "{{ item }}"
state: enabled
permanent: true
immediate: true
with_items:
- http
- https
- name: Disable unwanted ports
firewalld:
port: "{{ item }}/tcp"
state: disabled
permanent: true
immediate: true
with_items:
- "8080"
- "9000"
注释:
- firewalld 模块管理防火墙规则。
- with_items 循环批量配置服务与端口。
2. 执行 Playbook
ansible-playbook -i inventory.ini firewall_config.yml
2.6 用户权限批量管理
案例描述
在多个 CentOS 服务器上创建用户组 developers,并批量添加用户至该组,同时分配 sudo 权限。
步骤
1. 编写 Playbook
创建 user_management.yml:
---
- name: Manage User Groups and Permissions
hosts: all
become: true
tasks:
- name: Create developers group
group:
name: developers
state: present
- name: Add users to developers group
user:
name: "{{ item }}"
groups: developers
state: present
with_items:
- "user1"
- "user2"
- name: Grant sudo permissions to developers group
lineinfile:
path: /etc/sudoers
line: "%developers ALL=(ALL) NOPASSWD: ALL"
state: present
validate: "visudo -cf %s"
注释:
- group 模块创建用户组。
- user 模块添加用户并关联组。
- lineinfile 模块修改 sudoers 文件,validate 确保语法正确。
2. 执行 Playbook
ansible-playbook -i inventory.ini user_management.yml
2.7 日志清理自动化
案例描述
定期清理多台 CentOS 服务器上的系统日志文件(如 /var/log/messages),保留最近 7 天的日志。
步骤
1. 编写 Playbook
创建 log_cleanup.yml:
---
- name: Clean System Logs
hosts: all
become: true
tasks:
- name: Rotate and compress old logs
shell: |
logrotate -f /etc/logrotate.conf
find /var/log -type f -mtime +7 -exec rm {} \;
注释:
- logrotate 工具按配置文件(/etc/logrotate.conf)轮换日志。
- find 命令删除 7 天前的日志文件。
2. 执行 Playbook
ansible-playbook -i inventory.ini log_cleanup.yml
三、最佳实践
3.1 库存文件管理
- 分层管理:根据不同的环境(开发、测试、生产)、功能(Web 服务器、数据库服务器)等对主机进行分组,方便管理和维护。
- 动态库存:对于大规模、动态变化的基础设施,使用动态库存脚本从外部数据源(如云提供商的 API)获取主机信息。
3.2 Playbook 编写规范
- 模块化设计:将相关的任务封装成角色,提高代码的复用性和可维护性。
- 注释清晰:在 Playbook 中添加详细的注释,解释每个任务的目的和作用。
- 错误处理:使用
ignore_errors
、failed_when
等关键字处理任务执行过程中的错误。
3.3 安全注意事项
- 权限管理:使用
become
关键字控制任务的执行权限,避免使用不必要的超级用户权限。 - 加密敏感信息:使用 Ansible Vault 对敏感信息(如密码、密钥)进行加密存储。
四、尾言
Ansible 可高效应对数据库集群搭建、安全策略部署、用户管理等复杂场景。
实践中可结合以下扩展:
变量化配置:将敏感信息(如密码)、端口号等提取为变量,通过 group_vars 或 host_vars 动态赋值。
错误回滚:使用 block/rescue 结构实现任务失败时的自动回滚(如数据库配置错误时恢复默认参数)。
监控集成:结合 Ansible 与 Prometheus 等工具,自动化部署监控客户端并配置数据采集规则。
这些案例与扩展思路可帮助运维人员进一步提升 Ansible 自动化的深度与广度。