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

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

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

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

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

  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 自动化的深度与广度。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佳腾_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值