ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2022-08-28 18:03:56  阅读:261  来源: 互联网

标签:主从复制 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

配置文件 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	



安装 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
来源: https://www.cnblogs.com/haloujava/p/16633245.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有