saltstack部署MySQL主从
1. 目录结构
[root@master mysql]# pwd
/srv/salt/prod/mysql
[root@master prod]# tree mysql/
mysql/
├── files
│ ├── master.cnf
│ ├── my.cnf.j2
│ ├── mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz
│ ├── mysql.server
│ ├── mysql.service
│ ├── mysql.sh
│ └── slave.cnf
├── main.sls
├── master.sls
└── slave.sls
[root@master bbs]# pwd
/srv/salt/prod/bbs
[root@master prod]# tree bbs/
bbs/
├── files
│ └── start_slave.sh
├── grant-mysql.sls
├── master_mysql.sls
└── slave-mysql.sls
2. 编写状态文件
2.1 main.sls文件内容
{% if grains['osmajorrelease'] == 8 %} //如果是8版本的系统就安装这个包
ncurses-compat-libs:
pkg.installed
{% endif %}
{% if grains['osmajorrelease'] == 7 %} //如果是7版本的系统就安装这个包
libaio-devel:
pkg.installed
{% endif %}
unzip_pkg: //解压mysql的包
archive.extracted:
- name: /usr/local
- source: salt://mysql/files/mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz
user-mysql: // 创建MySQL属主
user.present:
- name: mysql
- shell: /sbin/nologin
- createhome: false
- system: true
/usr/local/mysql: //创建软链接
file.symlink:
- target: /usr/local/mysql-5.7.34-linux-glibc2.12-x86_64
mysql-create: //设置mysql的属主和属组
file.directory:
- name: /usr/local/mysql
- user: mysql
- group: mysql
- mode: 755
- recurse:
- user
- group
varable: // 环境变量的脚本,让系统能找到MySQL命令
file.managed:
- name: /etc/profile.d/mysql.sh
- source: salt://mysql/files/mysql.sh
- user: root
- group: root
- mode: 644
mysql.server: //提供service文件使用systemctl控制MySQL
file.managed:
- name: /usr/local/mysql/support-files/mysql.server
- source: salt://mysql/files/mysql.server
- user: root
- group: root
- mode: 755
create-directory: //创建数据库目录
file.directory:
- name: /opt/data
- user: mysql
- group: mysql
- mode: 755
- makedirs: true
- recurse:
- user
- group
/etc/my.cnf.d: //创建目录
file.directory:
- user: mysql
- group: mysql
- mode: 755
- makedirs: true
- recurse:
- user
- group
mysql.service: //将service文件传到对端
file.managed:
- name: /usr/lib/systemd/system/mysql.service
- source: salt://mysql/files/mysql.service
initialization-mysql: //初始化数据库
cmd.run:
- name: "/usr/local/mysql/bin/mysqld --initialize-insecure --user mysql --datadir /opt/data/"
- require:
- archive: unzip_pkg
- user: user-mysql
- file: create-directory
- unless: test $(ls -l /opt/data | wc -l) -gt 1 //为了让初始化数据库具有幂等性,如果/opt/data下没有文件的话就初始化数据库
/etc/my.cnf: //提供MySQL的配置文件
file.managed:
- source: salt://mysql/files/my.cnf.j2
- user: root
- group: root
- mode: 644
- template: jinja
start-mysql: //启动MySQL服务
service.running:
- name: mysql
- enable: true
- reload: true
- watch:
- file: /etc/my.cnf // 如果/etc/my.cnf文件内容发生改变就重新加载服务或重启服务
2.2 master.sls的文件内容
/etc/my.cnf.d/master.cnf: //提供master的端的配置文件
file.managed:
- source: salt://mysql/files/master.cnf
- user: root
- group: root
- mode: 644
restart_mysql: //重启MySQL服务
service.running:
- name: mysql
- enable: true
- reload: true
- watch:
- file: /etc/my.cnf.d/master.cnf
2.3 slave.sls文件内容
include: //包含mysql目录下的main.sls文件
- mysql.main
/etc/my.cnf.d/slave.cnf: //提供从服务器上的配置文件
file.managed:
- source: salt://mysql/files/slave.cnf
- user: root
- group: root
- mode: 644
restart-mysql-slave: //重启MySQL服务
service.running:
- name: mysql
- reload: true
- watch:
- file: /etc/my.cnf
- file: /etc/my.cnf.d/slave.cnf
2.4 grant-mysql.sls文件内容
master-grant:
cmd.run: //给从库授权
- name: /usr/local/mysql/bin/mysql -e "grant replication slave,super on *.* to 'repl'@'192.168.182.131' identified by '123';flush privileges;"
2.5 master_mysql.sls文件内容
include: //包含mysql目录下面的main.sls、master和bbs目录下的grant-mysql.sls文件
- mysql.main
- mysql.master
- bbs.grant-mysql
2.6 slave.sls文件内容
[root@master bbs]# cat slave-mysql.sls
include:
- mysql.slave
salt://bbs/files/start_slave.sh: //到对端执行start_slave.sh脚本
cmd.script
3. 配置文件
3.1 master.cnf文件内容
[mysqld]
server-id = 10
log-bin = mysql-bin
3.2 my.cnf.j2文件内容
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
!includedir /etc/my.cnf.d
3.3 mysql.server文件内容
// 此文件的内容就是当你解压mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz包时会自动生成,此文件在解压目录下的support-files目录下
只需要修改两行内容:
basedir=/usr/local/mysql
datadir=/opt/data
3.4 mysql.service文件内容
[Unit]
Description=mysql server daemon
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/mysql/support-files/mysql.server start
ExecStop=/usr/local/mysql/support-files/mysql.server stop
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
3.5 mysql.sh文件内容
export PATH=/usr/local/mysql/bin:$PATH
3.6 slave.cnf文件内容
[mysqld]
server-id = 20
relay-log = mysql_relay
3.7 start_slave.sh文件内容
#!/bin/bash
master_ip=192.168.182.142
mysql=/usr/local/mysql/bin/mysql
repl_user=repl
repl_pass=123
log_file=$($mysql -u$repl_user -p$repl_pass -h$master_ip -e 'show master status;' 2>/dev/null | grep -v File | awk '{print $1}')
log_pos=$($mysql -u$repl_user -p$repl_pass -h$master_ip -e 'show master status;' 2>/dev/null | grep -v Position | awk '{print $2}')
$mysql -e "change master to master_host='$master_ip',master_user='$repl_user',master_password='$repl_pass',master_log_file='$log_file',master_log_pos=$log_pos;start slave;show slave status\G"
4. 执行顺序
先执行master_mysql.sls文件,再执行slave-mysql.sls
如果觉得看的觉得有点累
也可以去码云复制代码