使用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, 1673B3. 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"的方式定义。
