在这个剧本中,我们首先使用yum模块安装mysql-server软件包,并将结果记录在变量result中。然后,我们使用debug模块输出安装结果。接下来,我们使用service模块启动MySQL服务,并将结果记录在service_result变量中。如果MySQL服务被启动,我们将使用debug模块输出“MySQL服务已启动”的消息,否则我们将输出“MySQL服务已安装,并已启动”的消息。接下来,我们使用mysql_user模块设置MySQL root用户的密码,并使用mysql_query模块获取主服务器的server_id。然后,我们使用mysql_user模块配置主从复制的repl用户,并使用mysql_replication模块对从服务器进行配置。最后,我们使用mysql_query模块获取主服务器的binlog文件和位置,并使用mysql_query模块获取从服务器的复制状态信息。
需要注意以下几点:
在剧本中使用了变量mysql_root_password和mysql_repl_password,请根据实际情况修改这些变量的值。
剧本中使用了mysql_user模块和mysql_replication模块,请确保已经安装了MySQL官方的Python驱动程序(python3-mysql或python2-mysql)。
在剧本中使用了when语句来进行条件判断,以便只在必要时才执行任务。
剧本中使用了register关键字来将结果存储在变量中,以便后续操作使用。
请确保您的目标服务器已正确配置SSH访问权限。
---
- name: 安装MySQL和主从复制配置
hosts: db_servers
become: true
vars:
mysql_root_password: your_password_here
mysql_repl_password: your_password_here
tasks:
- name: 安装MySQL
yum:
name: mysql-server
state: present
register: result
- name: 输出安装结果信息
debug:
msg: "{{ result.stdout_lines }}"
- name: 启动MySQL服务
service:
name: mysqld
state: started
enabled: true
when: result.changed
register: service_result
- name: 输出启动结果信息
debug:
msg: "MySQL服务已启动"
when: service_result.changed
- name: 输出不需要启动信息
debug:
msg: "MySQL服务已安装,并已启动"
when: not service_result.changed
- name: 设置MySQL root密码
mysql_user:
login_password: ""
user: root
password: "{{ mysql_root_password }}"
host_all: yes
when: result.changed
- name: 获取master服务器id
mysql_query:
login_user: root
login_password: "{{ mysql_root_password }}"
query: "show global variables like 'server_id'"
register: get_server_id
when: result.changed
- name: 配置master服务器
mysql_user:
login_user: root
login_password: "{{ mysql_root_password }}"
login_host: "{{ inventory_hostname }}"
login_port: 3306
user: repl
password: "{{ mysql_repl_password }}"
priv: "*.*: REPLICATION SLAVE"
state: present
host_all: yes
when: result.changed
- name: 输出配置完成信息
debug:
msg: "MySQL主服务器已配置"
- name: 暂停slave服务器
mysql_replication:
login_user: root
login_password: "{{ mysql_root_password }}"
mode: pause
when: result.changed
- name: 获取slave服务器id
mysql_query:
login_user: root
login_password: "{{ mysql_root_password }}"
query: "show global variables like 'server_id'"
register: get_slave_server_id
when: result.changed
- name: 配置slave服务器
mysql_replication:
login_user: root
login_password: "{{ mysql_root_password }}"
master_host: "{{ master_host }}"
master_port: 3306
master_user: repl
master_password: "{{ mysql_repl_password }}"
mode: changemaster
master_log_file: "{{ mysql_master_log_file.stdout_lines[0] }}"
master_log_pos: "{{ mysql_master_log_pos.stdout_lines[0] }}"
when: result.changed
- name: 启动slave服务器
mysql_replication:
login_user: root
login_password: "{{ mysql_root_password }}"
mode: start
when: result.changed
- name: 输出配置完成信息
debug:
msg: "MySQL从服务器已配置"
- name: 获取master服务器binlog文件和位置
mysql_query:
login_user: root
login_password: "{{ mysql_root_password }}"
query: "show master status"
register: mysql_master_status
when: result.changed
- name: 输出master服务器binlog文件和位置信息
debug:
msg: "MySQL master服务器 binlog 文件为 {{ mysql_master_status.stdout_lines[0].split('\t')[0] }}, 位置为 {{ mysql_master_status.stdout_lines[0].split('\t')[1] }}"
- name: 获取slave服务器复制状态
mysql_query:
login_user: root
login_password: "{{ mysql_root_password }}"
query: "show slave status"
register: mysql_slave_status
when: result.changed
- name: 输出slave服务器复制状态
debug:
msg: "MySQL从服务器复制状态为 {{ mysql_slave_status.stdout_lines[0].split('\t')[10] }}"
- name: 恢复slave服务器
mysql_replication:
login_user: root
login_password: "{{ mysql_root_password }}"
mode: resume
when: result.changed