簡介
通過ansible-playbook批量編譯安裝mysql-5.6.22並進行初始化,后續我們只需要啟動數據庫進行建庫即可。
ansible-playbook配置思路:
1.通過vars中的main.yml配置變量,主要為源碼存放目錄及安裝目錄
2.通過tasks中的copy.yml將源碼文件傳輸到異地服務器上源碼存放目錄
3.通過tasks中的install.yml調用模板mysql_install.sh,將mysql安裝到變量中定義的安裝目錄
4.通過tasks中的main.yml調用copy模塊和install模塊
5.通過mysql.yml調用劇本(playbook):mysql_install
playbook的目錄結構
[root@test ansible]# cd /etc/ansible/ [root@test ansible]# mkdir -p roles/mysql_install/{files,handlers,meta,tasks,templates,vars} [root@test ansible]# tree /etc/ansible ├── ansible.cfg ├── hosts ├── mysql.yml ├── roles │ └── mysql_install │ ├── files │ │ ├── my.cnf │ │ └── mysql-5.6.22.tar.gz │ ├── handlers │ ├── meta │ ├── tasks │ │ ├── copy.yml │ │ ├── install.yml │ │ └── main.yml │ ├── templates │ │ └── mysql_install.sh │ └── vars │ └── main.yml
說明:
files:存放需要同步到異地服務器的源碼文件及配置文件;
handlers:當資源發生變化時需要進行的操作,若沒有此目錄可以不建或為空;
meta:角色定義可留空;
tasks:mysql安裝過程成需要進行的執行的任務;
templates:用於執行mysql安裝的模板文件,一般為腳本;
vars:本次安裝定義的變量
具體操作
1.創建mysql角色文件,用於調用mysql_install
[root@test ansible]# vim mysql.yml
- hosts: test remote_user: root gather_facts: False roles: - mysql_install
2.創建變量文件
#創建變量 [root@test ansible]# cd /etc/ansible/roles/mysql_install/vars vim mail.yml mysql_version: mysql-5.6.22 source_dir: /home/ap/src install_dir: /home/ap/mysql data_dir: /home/ap/mysql/data
3.創建任務文件
[root@test ansible]# cd /etc/ansible/roles/mysql_install/tasks [root@test ansible]# vim copy.yml #復制源碼至目標服務器 - name: copy mysql source code to client copy: src={{mysql_version}}.tar.gz dest={{source_dir}} owner=root group=root #復制配置文件至目標服務器 - name: copy my.cnf to client copy: src=my.cnf dest=/etc/my.cnf owner=root group=root #復制模板文件至目標服務器 - name: copy mysql install script to client template: src=mysql_install.sh dest={{source_dir}} owner=root group=root mode=0775 [root@test ansible]# vim install.yml #執行模板文件進行安裝 - name: install mysql shell: bash {{source_dir}}/mysql_install.sh [root@test ansible]# vim main.yml #引用copy、install模塊 - include: copy.yml - include: install.yml
注意:
a.copy如果復制目錄,需要加上遞歸參數,recurse;
b.copy如果復制目錄,沒有目錄將會在目標服務器上創建;
c.copy如果復制文件到目標服務器的某一個目錄下,需要在dest參數上加上/home/ap/src/,而不是/home/ap/src,否則ansible將會把文件復制為src,而不是放在src目錄下。
4.編寫模板腳本
#!/bin/bash INSTALL_DIR={{install_dir}} DATADIR={{data_dir}} INNODB_DIR=$DATADIR/innodb VERSION='{{mysql_version}}' SOURCE_DIR={{source_dir}} #export LANG=zh_CN.UTF-8 #Source function library. . /etc/init.d/functions #camke install mysql5.6.X install_mysql(){ #read -p "please input a password for root: " PASSWD PASSWD='core2017' if [ ! -d $DATADIR ];then mkdir -p $DATADIR fi if [ ! -d $INNODB_DIR ];then mkdir -p $INNODB_DIR fi yum install cmake make gcc gcc-c++ ncurses-devel bison-devel -y id mysql &>/dev/null if [ $? -ne 0 ];then useradd mysql -s /sbin/nologin -M fi #useradd mysql -s /sbin/nologin -M #change datadir owner to mysql chown -R mysql.mysql $DATADIR cd $SOURCE_DIR tar xf $VERSION.tar.gz cd $VERSION cmake . -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR \ -DMYSQL_DATADIR=$DATADIR \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_FEDERATED_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DEXTRA_CHARSETS=all \ -DMYSQL_TCP_PORT=3306 make && make install if [ $? -ne 0 ];then action "install mysql is failed!" /bin/false exit $? fi sleep 2 #copy config and start file #/bin/cp /usr/local/mysql/support-files/my-small.cnf /etc/my.cnf #modify /etc/my.cnf sed -i "s:mysqld =:mysqld = $INSTALL_DIR/bin/mysqld_safe:g" /etc/my.cnf sed -i "s:mysqladmin =:mysqladmin = $INSTALL_DIR/bin/mysqladmin:g" /etc/my.cnf sed -i "s:datadir =:datadir = $DATADIR:g" /etc/my.cnf sed -i "s:slow_query_log_file=:slow_query_log_file=$DATADIR:g" /etc/my.cnf sed -i "s:log-error=:log-error=$DATADIR:g" /etc/my.cnf sed -i "s:innodb_data_home_dir =:innodb_data_home_dir = $INNODB_DIR:g" /etc/my.cnf sed -i "s:innodb_log_group_home_dir =:innodb_log_group_home_dir = $INNODB_DIR:g" /etc/my.cnf cp $INSTALL_DIR/support-files/mysql.server /etc/init.d/mysqld chmod 700 /etc/init.d/mysqld #init mysql $INSTALL_DIR/scripts/mysql_install_db --basedir=$INSTALL_DIR --datadir=$DATADIR --user=mysql if [ $? -ne 0 ];then action "install mysql is failed!" /bin/false exit $? fi #check mysql /etc/init.d/mysqld start if [ $? -ne 0 ];then action "mysql start is failed!" /bin/false exit $? fi chkconfig --add mysqld chkconfig mysqld on $INSTALL_DIR/bin/mysql -e "update mysql.user set password=password('$PASSWD') where host='localhost' and user='root';" $INSTALL_DIR/bin/mysql -e "update mysql.user set password=password('$PASSWD') where host='127.0.0.1' and user='root';" #$INSTALL_DIR/bin/mysql -e "delete from mysql.user where password='';" $INSTALL_DIR/bin/mysql -e "flush privileges;" #/usr/local/mysql/bin/mysql -e "select version();" >/dev/null 2>&1 if [ $? -eq 0 ];then echo "+---------------------------+" echo "+------mysql安裝完成--------+" echo "+---------------------------+" fi #/etc/init.d/mysqld stop #add path echo "export PATH=$PATH:$INSTALL_DIR/bin" >> /etc/profile source /etc/profile } install_mysql
此腳本除了編譯安裝mysql,還初始化mysql數據庫,對已經參數留空的配置文件my.cnf進行相應的修改,設置密碼並啟動數據庫等系列操作。
5.定制安裝
后續可根據實際情況,通過修改vars/main.yml中的相關參數,進行定制安裝。
執行playbook
#檢查文件 [root@test ansible]# ansible-playbook -C mysql.yml #執行playbook [root@test ansible]# ansible-playbook mysql.yml