当前位置: 首页 > news >正文

【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 服务。

步骤
  1. 准备配置文件
    在本地创建一个名为 nginx.conf 的 Nginx 配置文件。

  2. 编写 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 应用。

步骤
  1. 准备应用代码
    将 Python Flask 应用的代码放在本地的一个目录中。

  2. 编写 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 主从复制集群,需自动化完成以下任务:​

  1. 安装 MySQL 服务​
  2. 配置主库(Master)与从库(Slave)参数​
  3. 初始化主从复制关系
步骤​
        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_errorsfailed_when 等关键字处理任务执行过程中的错误。

3.3 安全注意事项

  • 权限管理:使用 become 关键字控制任务的执行权限,避免使用不必要的超级用户权限。
  • 加密敏感信息:使用 Ansible Vault 对敏感信息(如密码、密钥)进行加密存储。

四、尾言

Ansible 可高效应对数据库集群搭建、安全策略部署、用户管理等复杂场景。

实践中可结合以下扩展:​

变量化配置:将敏感信息(如密码)、端口号等提取为变量,通过 group_vars 或 host_vars 动态赋值。​

错误回滚:使用 block/rescue 结构实现任务失败时的自动回滚(如数据库配置错误时恢复默认参数)。​

监控集成:结合 Ansible 与 Prometheus 等工具,自动化部署监控客户端并配置数据采集规则。​

这些案例与扩展思路可帮助运维人员进一步提升 Ansible 自动化的深度与广度。

相关文章:

  • 未来七轴机器人会占据主流?深度解析具身智能方向当前六轴机器人和七轴机器人的区别,七轴力控机器人发展会加快吗?
  • AndroidStudio编译报错 Duplicate class kotlin
  • Uniapp: 修改启动时的端口号
  • 聊透多线程编程-线程池-9.C# 线程同步实现方式
  • Windows系统docker desktop安装(学习记录)
  • C++23 新特性:[[assume(expression)]] 属性
  • FileWriter 详细解析与记忆方法
  • 用 Deepseek 写的uniapp血型遗传查询工具
  • VRoid-Blender-Unity个人工作流笔记
  • 相机内外参
  • 苍穹外卖3
  • 某车企面试备忘
  • 打造AI应用基础设施:Milvus向量数据库部署与运维
  • PyTorch梯度:深度学习的引擎与实战解析
  • Git报错remote: Verify fatal: Authentication failed for ***
  • 比特币不是solidity编写吗,比特币不是基于 Solidity
  • 【项目管理】第15章 项目风险管理-- 知识点整理
  • ASP.NET Core 性能优化:分布式缓存
  • ubunut24.04 bash和zsh同时使用conda
  • cocosCreator安卓隐私弹窗(链接版)
  • 外媒:初步结果显示,菲律宾前总统杜特尔特当选达沃市市长
  • 美国三大指数全线高开:纳指涨逾4%,大型科技股、中概股大涨
  • 中国一直忽视欧盟经贸问题关切?外交部:事实证明中欧相互成就,共同发展
  • 瑞士联邦主席凯勒-祖特尔、联邦副主席帕姆兰会见何立峰
  • 巴总理召开国家指挥当局紧急会议
  • 5天完成1000多万元交易额,“一张手机膜”畅销海内外的启示