ansible 部署二进制MySQL
# 进到/usr/src目录
[root@localhost src]# pwd
/usr/src
# 创建MySQL目录
[root@localhost src]# mkdir mysql
# 进到MySQL目录里面,复制配置文件到当前目录下、写清单文件
[root@localhost mysql]# cp /etc/ansible/ansible.cfg .
[root@localhost mysql]# vim inventory
[dbservers]
database
# 创建files目录放MySQL安装包
[root@localhost mysql]# mkdir files
# 下载MySQL安装包
[root@localhost files]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz
[root@localhost files]# ls
mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz
# 创建vars目录存放变量
[root@localhost mysql]# mkdir vars
# 写关闭防火墙的playbook 、需要关闭防火墙就引用到主文件里去
[root@localhost mysql]# cat off_firewalld.yml
- name: stop firewalld
service:
name: firewalld
state: stopped
enabled: no
# 写关闭SElinux playbook 、需要关闭SElinux就引用到主文件里去
[root@localhost mysql]# cat off_selinux.yml
- name: stop
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: SELINUX=disabled
files目录内容
[root@localhost files]# ls
initialize.sh.j2 my.cnf.j2 mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz mysqld mysql.service.j2 mysql.sh.j2
# initialize.sh.j2 内容
[root@localhost files]# cat initialize.sh.j2
{{ mysql_install_dir }}/bin/mysqld --initialize --user=mysql --datadir=/opt/data 2>&1 | tee /opt/pass
# my.cnf.j2 内容
[root@localhost files]# cat my.cnf.j2
[mysqld]
basedir = {{ mysql_install_dir }}
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
sql-mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# mysqld 来源
# 从受控主机复制到files目录、再改名为mysqld
[root@localhost mysql]# scp database:/usr/local/mysql/support-files/mysql.server files/
[root@localhost mysql]# cd files/
[root@localhost files]# mv mysql.server mysqld # 改名为mysqld
# mysql.service.j2 内容
[root@localhost files]# cat mysql.service.j2
[Unit]
Description=mysql server daemon
After=network.target sshd-keygen.target
[Service]
Type=forking
ExecStart={{ mysql_install_dir }}/support-files/mysqld start
ExecStop={{ mysql_install_dir }}/support-files/mysqld stop
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
# mysql.sh.j2 内容
[root@localhost files]# cat mysql.sh.j2
#!/bin/bash
cd /usr/local
tar xf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.37-linux-glibc2.12-x86_64 mysql
chown -R mysql.mysql mysql
cd
echo 'export PATH={{ mysql_install_dir }}/bin:$PATH' > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
ln -s {{ mysql_install_dir }}/include /usr/include/mysql
echo 'MANDATORY_MANPATH {{ mysql_install_dir }}/man' >> /etc/man_db.conf
echo '{{ mysql_install_dir }}/lib' > /etc/ld.so.conf.d/mysql.conf
mkdir /opt/data
chown -R mysql.mysql /opt/data
vars 目录内容
# mysql.yml 内容
[root@localhost mysql]# ls vars/
mysql.yml
[root@localhost mysql]# cat vars/mysql.yml
mysql_install_dir: /usr/local/mysql
编写主文件、playbook
# main.yml 内容
[root@localhost mysql]# cat main.yml
---
- hosts: dbservers
vars_files: # 定义变量
- vars/mysql.yml
tasks:
- include_tasks: off_firewalld.yml # 关闭防火墙
- include_tasks: off_selinux.yml # 关闭SElinux
- name: create user # 创建用户
user:
name: mysql
state: present
system: yes
create_home: on
shell: /sbin/nologin
- name: provide soft pkgs # 提供MySQL软件包
copy:
src: files/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz
dest: /usr/local/
- name: install soft pkg # 下载依赖包
yum:
name: ncurses-compat-libs
state: present
- name: test {{ mysql_install_dir }} is exists # 这个目录是否存在,判断
command: test -d {{ mysql_install_dir }} # 这个执行的结果传到mysql_result
register: mysql_result # 结果传到这
ignore_errors: yes # 忽略错误
- name: provide template mysql.sh.j2 # 把MySQL脚本传到受控机,然后执行
template:
src: files/mysql.sh.j2
dest: /opt/mysql.sh
owner: root
group: root
mode: 0755
- name: exec script # 执行受控机的脚本
shell: /opt/mysql.sh
when: mysql_result['rc'] != 0 # 执行条件为非0
ignore_errors: yes # 忽略错误
- name: test /opt/pass is exists 判断目录是否存在
command: test -f /opt/pass # 执行结果传到pass_result
register: pass_result # 结果
ignore_errors: yes # 忽略错误
- name: provide initialize.sh.j2 # 把初始化数据库脚本传到受控机
template:
src: files/initialize.sh.j2
dest: /opt/initialize.sh
owner: root
group: root
mode: 0755
- name: initialize DB # 执行受控机的初始化脚本
shell: /opt/initialize.sh
register: print_result
when: pass_result['rc'] != 0 # 执行条件为非0
ignore_errors: yes # 忽略错误
- debug: var=print_result # 打印信息
- name: provide my.cnf.j2 # 提供配置文件
template:
src: files/my.cnf.j2
dest: /etc/my.cnf
- name: provide mysqld # 提供mysqld 文件、为了能执行service文件,就是开机自启
copy:
src: files/mysqld
dest: "{{ mysql_install_dir}}/support-files/"
owner: mysql
group: mysql
mode: 0755
- name: provide service file # 提供service文件,目录设置开机自启
template:
src: files/mysql.service.j2
dest: /usr/lib/systemd/system/mysqld.service
- name: start mysql # 设置开机自启
service:
name: mysqld
state: started
enabled: yes
- name: set password
shell: mysql -uroot -p$(cat /opt/pass | awk 'NR==9{print $NF}') --connect-expired-password -e "set password = password('123456')"
MySQL 整体架构
[root@localhost src]# tree mysql
mysql # MySQL目录
├── ansible.cfg # 配置文件
├── files # 放文件目录
│ ├── initialize.sh.j2 # 初始化模板
│ ├── my.cnf.j2 # 配置模板
│ ├── mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz # MySQL安装包
│ ├── mysqld
│ ├── mysql.service.j2 # service模板
│ └── mysql.sh.j2 # 脚本模板
├── inventory # 清单文件
├── main.yml # 主文件
├── off_firewalld.yml # 关闭防火墙
├── off_selinux.yml # 关闭SElinux
└── vars # 变量目录
└── mysql.yml
2 directories, 12 files