一、为什么需要自动化运维?

传统手动运维面临重复劳动人为错误效率低下等问题,自动化运维的价值在于:

  • 一致性:确保所有服务器配置统一。
  • 可追溯性:通过版本控制管理脚本与配置变更。
  • 快速响应:秒级完成数百台服务器的任务执行。

二、Shell脚本:自动化基础工具

1. 基础语法与实战示例

场景:批量清理服务器日志文件(保留最近7天)。

#!/bin/bash  
LOG_DIR="/var/log/app"  
find $LOG_DIR -name "*.log" -type f -mtime +7 -exec rm -f {} \;  
echo "$(date): 清理完成" >> /var/log/clean.log  

关键命令

  • find:查找文件并执行操作。
  • -mtime +7:匹配修改时间超过7天的文件。
2. 脚本调试与错误处理
  • 调试模式bash -x script.sh(显示执行过程)。
  • 错误中断set -e(任何命令失败则终止脚本)。
  • 日志记录:重定向输出到文件(>>tee)。

三、Ansible:无Agent的自动化引擎

1. Ansible核心概念
  • Inventory文件:定义服务器分组与连接信息(默认路径/etc/ansible/hosts)。

    [web_servers]  
    web1 ansible_host=192.168.1.101 ansible_user=root  
    web2 ansible_host=192.168.1.102 ansible_user=admin  
    
    [db_servers]  
    db1 ansible_host=192.168.1.201  
    
  • Ad-Hoc命令:快速执行单条命令。

    ansible web_servers -m ping  # 测试连通性  
    ansible db_servers -m shell -a "free -m"  # 查看内存  
    
2. Playbook:声明式自动化脚本

场景:批量部署Nginx并配置防火墙规则。

---  
- name: 部署Nginx服务  
  hosts: web_servers  
  become: yes  # 提权执行  

  tasks:  
    - name: 安装Nginx  
      apt:  
        name: nginx  
        state: latest  
      when: ansible_os_family == "Debian"  

    - name: 启动服务并设置开机自启  
      systemd:  
        name: nginx  
        enabled: yes  
        state: started  

    - name: 放行HTTP/HTTPS端口  
      ufw:  
        rule: allow  
        port: "{{ item }}"  
      loop:  
        - 80  
        - 443  
3. Roles:模块化复用配置

目录结构

roles/  
  nginx/  
    tasks/  
      main.yml  
    templates/  
      nginx.conf.j2  
    handlers/  
      main.yml  

调用Role

- hosts: web_servers  
  roles:  
    - nginx  

四、Ansible与Shell脚本对比

维度 Shell脚本 Ansible
适用场景 单机简单任务、快速原型开发 多机协同、复杂配置管理
可读性 依赖注释与命名规范 YAML语法结构化,易于理解
幂等性 需手动实现(如检查文件是否存在) 内置幂等性(自动判断状态是否变更)
扩展性 有限,依赖脚本复杂度 模块化设计,支持自定义模块与插件

五、实战:自动化部署WordPress集群

1. 架构设计
  • 负载均衡层:Nginx反向代理(Ansible配置)。
  • 应用层:2台Web服务器(Apache + PHP)。
  • 数据层:MySQL主从复制。
2. Playbook分解
  • Web服务器任务:安装Apache、PHP、部署代码。
  • 数据库任务:配置主从同步、创建WordPress数据库。
  • 负载均衡任务:生成Nginx配置模板并分发。
3. 执行与验证
ansible-playbook site.yml --limit web_servers  # 分步执行  
ansible-playbook site.yml --tags "db_setup"    # 按标签执行  

六、Ansible高级技巧

  1. 动态Inventory

    • 从云平台API或CMDB动态获取服务器列表。
    • 示例:使用aws_ec2插件生成AWS主机清单。
  2. 变量加密(Vault)

    ansible-vault encrypt vars/secrets.yml  # 加密敏感数据  
    ansible-playbook playbook.yml --ask-vault-pass  # 运行时解密  
    
  3. 错误处理与重试

    tasks:  
      - name: 下载文件  
        get_url:  
          url: http://example.com/file.tar.gz  
          dest: /tmp/  
        retries: 3  
        delay: 10  
        ignore_errors: yes  # 忽略失败继续执行  
    

七、总结与预告

本文通过Ansible与Shell脚本的对比与实践,展示了自动化运维的核心方法。下期预告:《监控体系构建:从Zabbix到Prometheus》,将深入讲解监控指标设计、告警策略与可视化大屏搭建。

互动环节

  • 你在编写Ansible Playbook时遇到过哪些挑战?欢迎分享解决方案!
  • 作业:编写一个Shell脚本,实现日志文件的自动压缩与归档(保留30天)。

资源推荐


拥抱自动化,让运维工作化繁为简! 🤖⚙️

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐