ansible怎么一键离线部署mysql keepalived?

文章导读
Ansible 可以实现离线部署,但前提是需要提前准备好所有依赖包和本地源,适合内网隔离环境。
📋 目录
  1. 前期准备:离线包下载
  2. 目录结构规划
  3. 主机清单 Inventory
  4. 完整 Playbook 实现
  5. Keepalived 配置模板
  6. 验证步骤
  7. 常见坑与风险排查
A A

Ansible 可以实现离线部署,但前提是需要提前准备好所有依赖包和本地源,适合内网隔离环境。

先说结论:通过 Ansible 批量分发离线包并执行安装脚本是可行方案,但“一键”仅代表执行阶段,前期包准备工作量较大。

  • 适合:网络隔离、无法连接公网 yum/apt 源的生产环境
  • 先准备:收集 MySQL、Keepalived 及其所有依赖的 rpm/deb 包,建议使用 yumdownloader `--resolve` 自动解决依赖
  • 验收:检查服务状态、VIP 漂移及数据库连接是否正常
  • 安全:敏感密码建议使用 ansible-vault 加密,避免明文存储

前期准备:离线包下载

在有网的机器上使用 yumdownloader 下载所需包及其依赖。确保架构一致(如 x86_64),并将所有 rpm 包放入同一目录。

# CentOS 示例,`--resolve` 会自动下载依赖
yumdownloader `--resolve` mysql-community-server keepalived libaio libnl

注意:不要手动删除依赖包,否则离线安装会报错。

目录结构规划

规范的目录结构有助于 Playbook 管理文件和模板。

offline_deploy/
├── inventory.ini          # 主机清单
├── group_vars/            # 变量文件(建议用 ansible-vault 加密)
│   └── all.yml
├── packages/              # 存放 rpm 包
├── templates/             # 存放配置文件模板
│   └── keepalived.conf.j2
└── playbook.yml           # 主执行文件

主机清单 Inventory

定义主节点和备节点,通过变量区分 Keepalived 的 MASTER/BACKUP 角色及优先级。

[mysql_servers]
db1 ansible_host=192.168.1.10 role=master priority=100
db2 ansible_host=192.168.1.11 role=backup priority=90

完整 Playbook 实现

以下 Playbook 涵盖了依赖安装、MySQL 初始化(含临时密码处理)、Keepalived 配置及服务启动。

- name: Offline Deploy MySQL and Keepalived
  hosts: mysql_servers
  become: yes
  vars:
    mysql_root_password: "YourSecurePassword123!"
    vip_address: "192.168.1.100"
    interface: "eth0"
  tasks:
    - name: Copy offline packages
      copy:
        src: packages/
        dest: /tmp/offline_packages/
        mode: '0644'

    - name: Install rpm packages
      rpm:
        path: "/tmp/offline_packages/{{ item }}"
        state: present
      loop: "{{ lookup('fileglob', 'packages/*.rpm', wantlist=True) | map('basename') | list }}"
      ignore_errors: yes

    - name: Start MySQL service
      systemd:
        name: mysqld
        state: started
        enabled: yes

    - name: Get MySQL temporary password
      shell: grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}'
      register: mysql_temp_pass
      changed_when: false

    - name: Update MySQL root password
      command: >
        mysql -u root -p'{{ mysql_temp_pass.stdout }}' 
        -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '{{ mysql_root_password }}'; FLUSH PRIVILEGES;"
      when: mysql_temp_pass.stdout != ""
      no_log: true

    - name: Deploy Keepalived config
      template:
        src: templates/keepalived.conf.j2
        dest: /etc/keepalived/keepalived.conf
      notify: Restart Keepalived

    - name: Start Keepalived service
      systemd:
        name: keepalived
        state: started
        enabled: yes

  handlers:
    - name: Restart Keepalived
      systemd:
        name: keepalived
        state: restarted

Keepalived 配置模板

保存为 templates/keepalived.conf.j2,根据 inventory 中的 role 变量动态生成 MASTER 或 BACKUP 配置。

global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_mysql {
    script "/usr/bin/mysqladmin -u root -p'{{ mysql_root_password }}' ping"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state {{ role | upper }}
    interface {{ interface }}
    virtual_router_id 51
    priority {{ priority }}
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        {{ vip_address }}
    }
    track_script {
        chk_mysql
    }
}

验证步骤

1. 检查服务状态

systemctl status mysqld
systemctl status keepalived

2. 检查 VIP 绑定

在 Master 节点执行 ip addr,确认虚拟 IP 是否绑定在网卡上。

3. 检查数据库连接

mysql -u root -p -h {{ vip_address }} -e "SELECT 1;"

4. 模拟故障切换

ansible怎么一键离线部署mysql keepalived?

停止 Master 节点的 keepalived 服务,观察 VIP 是否漂移到 Backup 节点,并确保数据库仍可连接。

常见坑与风险排查

1. 依赖缺失

离线包最容易漏掉间接依赖。建议在联网环境使用 yumdownloader `--resolve` 完整下载后再校验,不要手动挑选 rpm 包。

2. SELinux 和防火墙

离线环境通常安全策略较严,需确认端口 3306 和 VRRP 协议(协议号 112)是否放行。临时测试可先 setenforce 0。

3. MySQL 临时密码自动化

新版 MySQL 初始化会生成临时密码。Playbook 中必须包含获取临时密码并修改的逻辑,否则后续任务会因认证失败而中断。

4. 密码安全风险

Playbook 中的 mysql_root_password 不应明文存储。生产环境请使用 ansible-vault 加密变量文件,并在执行时输入密码。

5. Keepalived 脑裂

确保两台服务器之间心跳网络通畅,防火墙需放行 VRRP 协议。若出现双 VIP,检查防火墙是否拦截了组播包。