【Ansible自动化运维】六、ansible 实践案例与最佳实践:经验总结与分享
一、引言
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 Servershosts: web_serversbecome: truetasks:- name: Install Nginxyum:name: nginxstate: present- name: Start Nginx serviceservice:name: nginxstate: startedenabled: 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 Confighosts: web_serversbecome: truetasks:- name: Copy Nginx config filecopy:src: nginx.confdest: /etc/nginx/nginx.conf- name: Restart Nginx serviceservice:name: nginxstate: 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 Apphosts: web_serversbecome: truetasks:- name: Install Python and pipyum:name:- python3- python3-pipstate: present- name: Create application directoryfile:path: /opt/flask_appstate: directory- name: Copy application codecopy:src: ./flask_app/dest: /opt/flask_app- name: Install application dependenciespip:requirements: /opt/flask_app/requirements.txt- name: Start Flask applicationshell: 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 自动化的深度与广度。