使用role完成中间件的搭建,可以使用apt、二进制、rdb包的方式

1. Mysql的安装

- name: 更新 apt 软件包缓存
  ansible.builtin.apt:
    update_cache: yes
    cache_valid_time: 3600
- name: 安装所需的依赖项
  ansible.builtin.apt:
    name:
      - libaio1
      - libmecab2
      - debconf-utils
    state: present

- name: 获取所有服务
  ansible.builtin.service_facts:

- name: 定义持久目录用于存放 MySQL DEB 包
  ansible.builtin.set_fact:
    mysql_deb_dest_dir: "/opt/mysql_installer_debs"

- name: 创建持久目录
  ansible.builtin.file:
    path: "{{ mysql_deb_dest_dir }}"
    state: directory
    mode: '0755'

- name: Preseed MySQL root password for debconf
  ansible.builtin.debconf:
    name: mysql-community-server
    question: "{{ item.question }}"
    value: "{{ item.value }}"
    vtype: "{{ item.vtype }}"
  loop:
    - { question: 'mysql-community-server/root-pass', value: "{{db_password}}", vtype: 'password' }
    - { question: 'mysql-community-server/re-root-pass', value: "{{db_password}}", vtype: 'password' }
  when: "'mysql.service' not in ansible_facts.services"

- name: 解压 MySQL DEB 包
  ansible.builtin.unarchive:    
  src: mysql-server_8.4.4-1ubuntu22.04_amd64.deb-bundle.tar
    dest: "{{ mysql_deb_dest_dir }}"
    remote_src: no
  when: "'mysql.service' not in ansible_facts.services"

- name: 安装 MySQL 基础组件 (mysql-common)
  ansible.builtin.apt:
    deb: "{{ mysql_deb_dest_dir }}/mysql-common_8.4.4-1ubuntu22.04_amd64.deb"
    state: present
  when: "'mysql.service' not in ansible_facts.services"

- name: 安装 MySQL 客户端组件
  ansible.builtin.apt:
    deb: "{{ item }}"
    state: present
  loop:
    - "{{ mysql_deb_dest_dir }}/mysql-community-client-plugins_8.4.4-1ubuntu22.04_amd64.deb"
    - "{{ mysql_deb_dest_dir }}/mysql-community-client-core_8.4.4-1ubuntu22.04_amd64.deb"
    - "{{ mysql_deb_dest_dir }}/mysql-community-client_8.4.4-1ubuntu22.04_amd64.deb"
    - "{{ mysql_deb_dest_dir }}/mysql-client_8.4.4-1ubuntu22.04_amd64.deb"
  when: "'mysql.service' not in ansible_facts.services"

- name: 安装 MySQL 服务器组件
  ansible.builtin.apt:
    deb: "{{ item }}"
    state: present
  loop:
    - "{{ mysql_deb_dest_dir }}/mysql-community-server-core_8.4.4-1ubuntu22.04_amd64.deb"
    - "{{ mysql_deb_dest_dir }}/mysql-community-server_8.4.4-1ubuntu22.04_amd64.deb"
    - "{{ mysql_deb_dest_dir }}/mysql-server_8.4.4-1ubuntu22.04_amd64.deb"
  when: "'mysql.service' not in ansible_facts.services"

- name: 清理已复制的 tar 包
  ansible.builtin.file:
    path: "{{ mysql_deb_dest_dir }}"
    state: absent
- name: 更新 apt 软件包缓存
  ansible.builtin.apt:
    update_cache: yes
    cache_valid_time: 3600
  when: ansible_os_family == "Debian"

- name: 安装 pip3 工具(确保 pip 可用)
  ansible.builtin.apt:
    name: python3-pip
    state: present
    update_cache: yes
  when: ansible_os_family == "Debian"

- name: 安装 PyMySQL 依赖库
  ansible.builtin.pip:
    name: PyMySQL

- name: 检查数据库 'ruoyi-vue-pro' 是否存在
  community.mysql.mysql_query:
    query: "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'ruoyi-vue-pro';"
    login_user: root
    login_password: "{{ db_password }}"
  register: db_exists_check

# 创建数据库(仅当不存在时)
- name: 创建数据库 'ruoyi-vue-pro'(如不存在)
  community.mysql.mysql_db:
    name: ruoyi-vue-pro
    state: present
    login_user: root
    login_password: "{{ db_password }}"
  when: db_exists_check.rowcount is defined and db_exists_check.rowcount[0] == 0
  register: db_created

# 检查表是否存在(当数据库已存在时)
- name: 检查 'ruoyi-vue-pro' 数据库中的 'system_users' 表是否存在
  community.mysql.mysql_query:
    query: "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'ruoyi-vue-pro' AND TABLE_NAME = 'system_users';"
    login_user: root
    login_password: "{{ db_password }}"
  register: table_exists_check
  when: db_exists_check.rowcount is defined and db_exists_check.rowcount[0] > 0

# 判断是否需要导入 SQL
- name: 设置是否需要导入 SQL 的标志位
  ansible.builtin.set_fact:
    should_import_sql: >-
      {{ (db_created is defined and db_created.changed) or
         (table_exists_check is defined and table_exists_check.rowcount[0] == 0) }}

# 复制 SQL 文件到远程服务器
- name: 复制初始化 SQL 文件
  ansible.builtin.copy:
    src: files/ruoyi-vue-pro.sql
    dest: /tmp/ruoyi-vue-pro.sql
    mode: '0644'
  when: should_import_sql

# 导入 SQL 数据
- name: 导入初始化 SQL 到数据库 'ruoyi-vue-pro'
  community.mysql.mysql_db:
    name: ruoyi-vue-pro
    state: import
    target: /tmp/ruoyi-vue-pro.sql
    login_user: root
    login_password: "{{ db_password }}"
    when: should_import_sql

# 清理 SQL 文件
- name: 清理导入后的 SQL 文件
  ansible.builtin.file:
    path: /tmp/ruoyi-vue-pro.sql
    state: absent
  when: should_import_sql

- name: Create root@% user for remote access via mysql CLI
  ansible.builtin.shell: |
    mysql -uroot -p'{{ db_password }}' -e "
    CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED WITH caching_sha2_password BY '{{ db_password }}';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;"

2. Redis的安装

- name: 获取系统服务状态
  ansible.builtin.service_facts:

- name: 如果 Redis 未运行,则执行离线安装流程
  block:
    - name: 创建临时目录用于存放 .deb 包
      ansible.builtin.tempfile:
        state: directory
        suffix: redis_debs
      register: temp_deb_dir

    - name: 复制 Redis .deb 包到目标机器
      ansible.builtin.copy:
        src: "{{ item }}"
        dest: "{{ temp_deb_dir.path }}/"
        mode: '0644'
      loop:
        - files/redis_7.4.4.deb
        - files/redis-server_7.4.4.deb
        - files/redis-tools_7.4.4.deb

    - name: 离线安装所有 Redis .deb 包
      ansible.builtin.apt:
        deb: "{{ temp_deb_dir.path }}/{{ item }}"
        state: present
      loop:
        - redis-tools_7.4.4.deb
        - redis-server_7.4.4.deb
        - redis_7.4.4.deb

    - name: 清理临时 .deb 包目录
      ansible.builtin.file:
        path: "{{ temp_deb_dir.path }}"
        state: absent

    - name: 确保 Redis 服务已启动并设置为开机自启
"/etc/ansible/roles/db/tasks/redis_install.yml" 53L, 1673B

3. Nacos的安装

- name: 获取系统服务状态
  ansible.builtin.service_facts:

- name: 如果 nacos未运行,则执行离线安装流程
  block:
    - name: 确保目标机器已安装 unzip 工具
      ansible.builtin.apt: # 或者 yum/dnf 模块,取决于你的 Linux 发行版
        name:
          - unzip
          - openjdk-21-jdk
        state: present
      retries: 3 # 最多重试10次
      delay: 10 # 每次重试前等待15秒

    - name: 定义持久目录用于存放nacos的目录
      ansible.builtin.set_fact:
        nacos_dir: "/opt/"

    - name: 解压nacos 包
      ansible.builtin.unarchive:
        src: nacos-server-2.5.1.zip
        dest: "{{ nacos_dir }}"
        remote_src: no

    - name: 复制nodejs安装包
      copy:
        src: nacos.service
        dest: /etc/systemd/system/

    - name: 重新加载 systemd 管理器配置
      ansible.builtin.systemd:
        daemon_reload: yes

    - name: 启动并设置 Nacos 开机自启
      ansible.builtin.systemd:
        name: nacos
        state: started
        enabled: yes
  when: "'nacos.service' not in ansible_facts.services"

注意:

Mysql包与Nacos和Redis的deb安装包需放进roles的files文件下,同时group_vars/db_pass.yml文件需要定义数据库密码,主要以db_password: "123456"的方式定义。

搭建成功:

以他人的幸福为幸福,以他人的享乐为享乐。