首页 > 数据库 >工具: Ansible Playbook 安装 Mysql 并配置主从复制

工具: Ansible Playbook 安装 Mysql 并配置主从复制

时间:2022-08-28 17:55:12浏览次数:104  
标签:主从复制 shell name ansible Ansible master Playbook mysql role

准备工作

主机信息

IP 名称 角色
192.168.114.133 node1 master
192.168.114.134 node2 slave
192.168.114.135 node3 slave

安装ansible

Ansible 是一个自动化运维管理的工具, 可以支持同时管理多台节点,ansible playbook 支持 编写 yml 格式的配置,来管理多个主机节点。

ansible软件 不需要每个节点都安装, 只需要指定其中一个节点作为主节点就可以,在此示例中,我们选择 node1 作为我们的管理节点来安装ansible

自动化安装脚本
  • 脚本安装ansible

  • 脚本配置免密登录

    配置免密登录手续 首先需要每个服务器的密码, 这里我们三天主机的密码 统一设置成 一个 放在 配置文件 ssh_password下

  • 解析 config.ini , 并生成 ansible 认识的 hosts 文件

配置文件 config.ini
[ssh_password]
halou

[mysql]
192.168.114.133 master
192.168.114.134 slave
192.168.114.135 slave
脚本 auto_install_ansible.sh
#!/bin/bash

#auto insall ansible
#自动化安装ansible软件


CUR_PATH=$(readlink -f $(dirname $0))

#打印日志
function result_echo
{
    if [ $? -eq 0 ]; then 
        echo "$1" | tee -a $CUR_PATH/log.log
    else
        echo "$2" | tee -a $CUR_PATH/log.log
        exit 1
    fi
}

HOST_LIST=`sed -n '/\[mysql\]/,/\[.*\]/p' ./config.ini | grep -v "\[.*\]" | grep -v ^$ | grep -v ^# | awk '{print $1}'`
SSH_PASSWORD=`sed -n '/\[ssh_password\]/,/\[.*\]/p' ./config.ini | grep -v "\[.*\]" | grep -v ^$ | grep -v ^# `

yum repolist | grep epel &> /dev/null

if [ $? -ne 0 ];then
    yum install epel-release -y
    yum makecache
fi

yum install sshpass ansible -y

#生成秘钥,并发送给各个节点执行
echo -e "y\n" | ssh-keygen -t rsa -q -N "" -f ~/.ssh/id_rsa


for host in $HOST_LIST;do
    sshpass -p$SSH_PASSWORD ssh-copy-id -o StrictHostKeyChecking=no root@$host &> /dev/null
    ssh -o StrictHostKeyChecking=no root@$host 'ls -al' &> /dev/null

    result_echo "Ok... No password login is success" "Failed...Use no password login failed, please check!!!"
    
done	



#使用ansible管理主机节点

if [ -e $CUR_PATH/hosts ]; then
    rm -f $CUR_PATH/hosts
fi

echo "[mariadb_hosts]" >> $CUR_PATH/hosts
for host in $HOST_LIST;do
    echo $host >> $CUR_PATH/hosts
done

安装 mariadb

使用ansible-playbook 编写安装脚本 yaml

注意事项

  • 自定义主机操作列表 hosts 文件

    [mariadb_hosts]
    192.168.114.133 server_id='1' mysql_role=master
    192.168.114.134 server_id='2' mysql_role=salve
    192.168.114.135 server_id='3' mysql_role=salve
    
  • 定义需要应用的变量,位置 根目录/group_vars/all.yml

    MYSQL_DATA_DIR: /www/mysql/data_dir
    MASTER_IP:  192.168.114.133
    
  • 安装脚本主题 auto_install_mariadb.yml

    - hosts: mariadb_hosts
    
      tasks:
        - name: "if repo list exists"
          shell: "yum repolist | grep epel &> /dev/null"
          register: repolist_result
          failed_when: false
          when: mysql_role == "master"
    
        - name: "install epel_release"
          shell: " yum install epel-release -y"
          when: 
            - mysql_role == "master"
            - repolist_result.rc != 0
           
    
        - name: "stop firewalld"
          shell: systemctl stop firewalld && systemctl disable firewalld
        
        - name: setenforce zero
          shell: getenforce | grep Disabled &> /dev/null || setenforce 0
        
        - name: stop SeLinux
          lineinfile: path=/etc/sysconfig/selinux regexp="^SELINUX=" line="SELINUX=disabled"
    
        - name: delete data dir if exists
          shell: "rm -rf {{ MYSQL_DATA_DIR }}"
        
        - name: mkdir data dir
          shell: "[[ -d {{ MYSQL_DATA_DIR }} ]] || mkdir -p {{ MYSQL_DATA_DIR }}"
    
        - name: yum install mariadb
          shell: yum install mariadb mariadb-server -y
    
        - name: set datadir
          lineinfile: path=/etc/my.cnf regexp="^datadir" line="datadir={{ MYSQL_DATA_DIR }}" insertafter="\[mysqld\]"
    
        - name: server_id
          lineinfile: path=/etc/my.cnf line="server_id={{ server_id }}" insertafter="\[mysqld\]"
        
        - name: set master 
          lineinfile: path=/etc/my.cnf regexp="^log-bin" line="log-bin=master-bin" insertafter="^\[mysqld\]"
          when: mysql_role == "master"
        - name: set slave
          lineinfile: path=/etc/my.cnf line="relay-log=slave-log" insertafter="^\[mysqld\]"
          when: mysql_role == "salve"
    
        - name: chown mysql dir
          shell: chown -R mysql:mysql {{ MYSQL_DATA_DIR }} 
    
        - name: restart mariadb
          shell: systemctl restart mariadb
    
        - name: grant slave user
          shell: mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'demo_pass'"
          when: mysql_role == "master"
    
        - name: master bin log name
          shell: "mysql -e \"show master status\\G;\" | grep File | awk -F: '{print $2}' | awk '{gsub(/^\\s+|\\s+$/, \"\");print}' > ~/master_name"
          when: mysql_role == "master"
    
        - name: master bin position
          shell: "mysql -e \"show master status\\G;\" | grep Position | awk -F: {'print $2'} | awk '{gsub(/^\\s+|\\s+$/, \"\");print}' > ~/postion_name"
          
          when: mysql_role == "master"
    
        - name: copy master name
          ansible.builtin.copy:
            src: ~/master_name
            dest: ~/master_name
        - name: copy postion
          ansible.builtin.copy:
            src: ~/postion_name
            dest: ~/postion_name
    
        - name: cat master name
          shell: cat ~/master_name
          register: master_name
    
        - name: cat postion 
          shell: cat ~/postion_name
          register: master_postion
    
        - name: reset slave
          shell: mysql -e "reset slave "
          when: mysql_role == "salve"
        
        - name: change master
          shell: mysql -e "CHANGE MASTER TO master_host='{{ MASTER_IP }}', master_user='slave_user', master_password='demo_pass', master_log_file='{{ master_name.stdout }}',master_log_pos={{ master_postion.stdout }} "
          when: mysql_role == "salve"
         
        
        - name: start slave
          shell: mysql -e "start slave "
          when: mysql_role == "salve"
    

参考资料:

https://github.com/ansible/ansible-examples/blob/master/mongodb/playbooks/testsharding.yml 【ansible 安装mongodb示例】

https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html 【ansible 变量引用】

https://www.cnblogs.com/haloujava/p/16561883.html 【一键安装Mysql并配置主从复制】

标签:主从复制,shell,name,ansible,Ansible,master,Playbook,mysql,role
From: https://www.cnblogs.com/haloujava/p/16633245.html

相关文章

  • ansible 001 ansible介绍 原理
    ansible自动化运维ansible部署应用程序(在操作系统层面之上)系统初始化过程主机名,yun源,网络,服务,时间同步,内核参数(可以在pxe这里完成)ansible可以方便100多台......
  • redis-主从复制
    一、主从复制的建立1.在slave机器上运行replicaofmaster的ipmaster的ip(Redis5.0之前使用slaveof)2.启动redis时redis-server/etc/redis.conf--replicaof192.168.......
  • mysql主从复制
    主配置[mysqld]#主数据库端ID号server_id=1#开启二进制日志log-bin=mysql-bin#需要复制的数据库名,如果复制多个数据库,重复设置这......
  • msyql 主从复制
    我们分别创建两台mysql  注意需要在同一网段     一台是阿里云服务器一台是本地虚拟机  都是安装在docker中 主库我们定位本地虚拟机为主库 从库为......
  • ansible ansible-playbook参数
    ansibleansible-playbook参数1.1语法详情Options:--ask-vault-pass#askforvaultpassword#加密playbook文件时提示输入密码......
  • ansible 的安装及常见模块使用
    ansible 基础keys的ssh协议配置的 特性:幂等性:一个任务执行1遍和执行n遍效果一样。ansible是个管理软件不是服务,不需要长期运行 一、通过epel源安装ansible,1、下载......
  • ansible unarchive模块
    ansibleunarchive模块解压复制远程主机上的压缩文件1.1ansibleunarchive模块creates:一个文件名,当它已经存在时,这个步骤将不会被运行。copy:默认为yes,拷贝的文件从ans......
  • ansible block模块
    ansibleblock模块block模块:将多个任务组合成一个块,并且可以对这个块做条件判断,以及当块里面的任务失败时,进行失败处理1.1ansibleblock模块-block:#定义块......
  • Redis 主从复制
    概述主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器,前者称为主节点,后者称为从节点一个主节点可以有零个或多个从节点,但每个从节点只能有一个主节点......
  • MySQL传统主从复制
    MySQL传统主从复制为什么要做主从复制做主从复制的目的,并不是为了备份为了解决主库的单点故障为了减少主库的压力(读写分离)复制是MySQL的一项功能,允许服务器将更改从......