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

如果觉得看的觉得有点累也可以去码云复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值