Ansible安装多实例mariadb10.2.23

堡垒机配置

root家目录下放置mariadb二进制包

[Mon Apr 29 19:52
 root@ansible-centos7 ~]# ls
 -rw-r--r--  1 root root 456950538 Apr 26 08:16 mariadb-10.2.23-linux-x86_64.tar.gz

在/data目录下创建ansible目录,内部创建roles文件夹

[Mon Apr 29 20:05
 root@ansible-centos7 /data/ansible] # ll
drwxr-xr-x 5 root root 4096 Apr 29 09:40 roles

在roles目录下创建需要用到的目录

[Mon Apr 29 19:54
 root@ansible-centos7 /data/ansible/roles]# mkdir mariadb/{tasks,templates,vars} -pv

查看当前目录结构

[Mon Apr 29 20:05
 root@ansible-centos7 /data/ansible/roles]# tree mariadb/
mariadb/
|-- tasks
|-- templates
|-- vars

创建数据库管理账户组.yml:

[Mon Apr 29 20:16
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/tasks/group.yml
  - name: create group                                                                                                           group: name=mysql system=yes gid=336

创建数据库管理账户.yml:

[Mon Apr 29 20:06
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/tasks/user.yml
  - name: create user                                                                                                          
    user: name=mysql uid=336 system=yes group=mysql home=/data/mysql create_home=no

创建多实例所需存储目录.yml:

[Mon Apr 29 20:17
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/tasks/mkdir.yml
 - name: mkdir /data/mysql/...
   shell: mkdir -pv /data/mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid}

修改存储目录权限.yml:

[Mon Apr 29 20:20
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/tasks/chown.yml
 - name: change /data/mysql owner
   shell: chown -R mysql.mysql /data/mysql 

解压mariadb包到被控端主机/usr/local/下.yml:

[Mon Apr 29 20:20
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/tasks/unarchive.yml
 - name: unarchive mariadb.tar
   unarchive: src=/root/{{package}} dest=/usr/local/
 - name: create link
   file: src=/usr/local/{{package1}} path=/usr/local/mysql state=link

生成数据库内容.yml:

[Mon Apr 29 20:27
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/tasks/scp.yml
 - name: ctreate the database
   shell: cd /usr/local/mysql/; ./scripts/mysql_install_db --datadir=/data/mysql/{{item}}/data  --user=mysql           
   with_items:
    - 3306
    - 3307
    - 3308

拷贝my.cnf.j2生成my.cnf配置文件.yml:

[Mon Apr 29 20:30
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/tasks/config.yml
 - name: copy config1                                                                                              
   template: src=my.cnf.j2 dest=/data/mysql/{{port1}}/etc/my.cnf
 - name: copy config2
   template: src=my1.cnf.j2 dest=/data/mysql/{{port2}}/etc/my.cnf
 - name: copy config3
   template: src=my2.cnf.j2 dest=/data/mysql/{{port3}}/etc/my.cnf

拷贝模板文件生成启动服务文件.yml:

[Mon Apr 29 20:31
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/tasks/mysqld.yml
 - name: copy service1                                                                                          
   template: src=mysqld.j2 dest=/data/mysql/{{port1}}/bin/mysqld mode=754
 - name: copy service2
   template: src=mysqld1.j2 dest=/data/mysql/{{port2}}/bin/mysqld1 mode=754
 - name: copy service3
   template: src=mysqld2.j2 dest=/data/mysql/{{port3}}/bin/mysqld2 mode=754

写主文件.yml:

[Mon Apr 29 20:31
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/tasks/main.yml
 - include: group.yml                                                                                              
 - include: user.yml
 - include: mkdir.yml
 - include: unarchive.yml
 - include: scp.yml
 - include: chown.yml
 - include: config.yml
 - include: mysqld.yml

拷贝需要用到的模板文件

[Mon Apr 29 20:37
 root@ansible-centos7 /data/ansible/roles]# cp /etc/my.cnf mariadb/templates/my.cnf.j2

修改my.cnf.j2模板文件,此文件需要拷贝复制三份在当前目录,命名为my1.cnf.j2,my2,cnf.j2,分别对应变量{{port1}},{{port2}},{{port3}}
my.cnf.j2

[Mon Apr 29 20:38
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/templates/my.cnf.j2
[mysqld]                                                                                                               
port={{port1}}
datadir=/data/mysql/{{port1}}/data
socket=/data/mysql/{{port1}}/socket/mysql.sock

[mysqld_safe]
log-error=/data/mysql/{{port1}}/log/mariadb.log
pid-file=/data/mysql/{{port1}}/pid/mariadb.pid
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

my1.cnf.j2

[Mon Apr 29 20:43
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/templates/my1.cnf.j2
[mysqld]
port={{port2}}
datadir=/data/mysql/{{port2}}/data
socket=/data/mysql/{{port2}}/socket/mysql.sock

[mysqld_safe]
log-error=/data/mysql/{{port2}}/log/mariadb.log
pid-file=/data/mysql/{{port2}}/pid/mariadb.pid                                                                         
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

my2.cnf.j2

[Mon Apr 29 20:41
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/templates/my2.cnf.j2
 [mysqld]
port={{port3}}
datadir=/data/mysql/{{port3}}/data
socket=/data/mysql/{{port3}}/socket/mysql.sock

[mysqld_safe]
log-error=/data/mysql/{{port3}}/log/mariadb.log
pid-file=/data/mysql/{{port3}}/pid/mariadb.pid                                                                         
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

服务启动脚本,此脚本也要复制3份放到templates目录内,命名为mysqld.j2,mysqld1.j2,mysqld2.j2:内部需要更改的有端口port,变量自动生成

[Mon Apr 29 20:47
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/templates/mysqld.j2
#!/bin/bash                                                                                                            

port={{port1}}
mysql_user="root"
mysql_pwd=""
cmd_path="/usr/local/mysql/bin"
mysql_basedir="/data/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"

function_start_mysql()
{
    if [ ! -e "$mysql_sock" ];then
      printf "Starting MySQL...\n"
      ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf  &> /dev/null  &
    else
      printf "MySQL is running...\n"
      exit
    fi
}

function_stop_mysql()
{
    if [ ! -e "$mysql_sock" ];then
       printf "MySQL is stopped...\n"
       exit
    else
       printf "Stoping MySQL...\n"
       ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
   fi
}

function_restart_mysql()
{
    printf "Restarting MySQL...\n"
    function_stop_mysql
    sleep 2
    function_start_mysql
}

case $1 in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
*)
    printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac                                                        

上述用到的变量在vars目录内定义

[Mon Apr 29 20:43
 root@ansible-centos7 /data/ansible/roles]# vim mariadb/vars/main.yml
package: mariadb-10.2.23-linux-x86_64.tar.gz                      
package1: mariadb-10.2.23-linux-x86_64
port1: 3306
port2: 3307
port3: 3308

在anslible目录下创建主脚本mariadb.yml

[Mon Apr 29 20:52
 root@ansible-centos7 /data/ansible]# vim mariadb.yml
---                                                                                                                    
 - hosts: 172.16.36.112
   remote_user: root
   roles:
    - role: mariadb

最后的目录结构:

|-- mariadb
    |   |-- tasks
    |   |   |-- chown.yml
    |   |   |-- config.yml
    |   |   |-- group.yml
    |   |   |-- main.yml
    |   |   |-- mkdir.yml
    |   |   |-- mysqld.yml
    |   |   |-- scp.yml
    |   |   |-- unarchive.yml
    |   |   `-- user.yml
    |   |-- templates
    |   |   |-- my1.cnf.j2
    |   |   |-- my2.cnf.j2
    |   |   |-- my.cnf.j2
    |   |   |-- mysqld1.j2
    |   |   |-- mysqld2.j2
    |   |   `-- mysqld.j2
    |   `-- vars
    |       `-- main.yml

脚本跑完之后

ansbile 172.16.36.112 -m shell -a 'echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mariadb.sh;source /etc/profile.d/mariadb.sh'

由于是使用多实例生成的数据库,启动可能稍有不便
在172.16.36.112主机上使用下列命令启动,ss -tnlp 可以看到三个端口启动成功和对应的mysqld服务

# bash /data/mysql/3306/bin/mysqld start
# bash /data/mysql/3307/bin/mysqld1 start
# bash /data/mysql/3308/bin/mysqld2 start
[root@node2-centos7 ~]# ss -tnlp
State       Recv-Q Send-Q              Local Address:Port                             Peer Address:Port              
LISTEN      0      128                             *:111                                         *:*                   users:(("rpcbind",pid=6100,fd=4),("systemd",pid=1,fd=81))
LISTEN      0      128                             *:22                                          *:*                   users:(("sshd",pid=6456,fd=3))
LISTEN      0      100                     127.0.0.1:25                                          *:*                   users:(("master",pid=6618,fd=13))
LISTEN      0      80                             :::3306                                       :::*                   users:(("mysqld",pid=10667,fd=20))
LISTEN      0      80                             :::3307                                       :::*                   users:(("mysqld",pid=10792,fd=20))
LISTEN      0      80                             :::3308                                       :::*                   users:(("mysqld",pid=10907,fd=20))
LISTEN      0      128                            :::111                                        :::*                   users:(("rpcbind",pid=6100,fd=6),("systemd",pid=1,fd=83))
LISTEN      0      128                            :::22                                         :::*                   users:(("sshd",pid=6456,fd=4))
LISTEN      0      100                           ::1:25                                         :::*                   users:(("master",pid=6618,fd=14))