roles(难点)
1、介绍
roles(⻆⾊): 就是通过分别将variables, tasks及handlers等放置于单独的⽬录中,并可以便捷地调⽤它们的⼀种机制。假设我们要写⼀个playbook来安装管理lamp环境,那么这个playbook就会写很⻓。所以我们希望把这个很⼤的⽂件分成多个功能拆分, 分成apache管理,php管理,mysql管理,然后在需要使⽤的时候直接调⽤就可以了,以免重复写。就类似编程⾥的模块化的概念,以
2、创建roles的目录结构
files:⽤来存放由copy模块或script模块调用的⽂件。
tasks:⾄少有⼀个main.yml⽂件,定义各tasks。
handlers:有⼀个main.yml⽂件,定义各handlers。
templates:⽤来存放jinjia2模板。
vars:有⼀个main.yml⽂件,定义变量。
meta:有⼀个main.yml⽂件,定义此⻆⾊的特殊设定及其依赖关系。
注意: 在每个⻆⾊的目录中分别创建files,tasks,handlers,templates,vars和meta目录,用不到的目录可以创建为空目录。
3、通过roles实现l a mp(需定制三个 角色 : httpd,mysql,php)
第1步: 创建roles 目录 及 文件 ,并确认 目录 结构
root@m0 \~\]# cd /etc/ansible/roles/
\[root@m0 roles\]#mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
\[root@m0 roles\]#touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml
\[root@m0 \~\]#yum install tree -y
\[root@m0 \~\]#mkdir /etc/ansible/roles/httpd
\[root@m0 \~\]#tree /etc/ansible/roles/
/etc/ansible/roles/
├── httpd
├── files
├── handlers
│ └── main.yml
├── meta
└── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
###### ****第2步: 准备httpd服务器的主⻚⽂件,php测试⻚和配置**** ****文件**** ****等****
\[root@m0 \~\]#echo "test main page" \> /etc/ansible/roles/httpd/files/index.html
\[root@m0 \~\]#echo -e "\" \> /etc/ansible/roles/httpd/files/test.php
按需求修改配置⽂件后,拷⻉到httpd⻆⾊⽬录⾥的files⼦⽬录
\[root@m0 \~\]#vim /etc/httpd/conf/httpd.conf
\[root@m0 \~\]#cp /etc/httpd/conf/httpd.conf /etc/ansible/roles/httpd/files/
****第3步: 编写httpd**** ****角色**** ****的main.yml**** ****文件****
\[root@m0 \~\]#vim /etc/ansible/roles/httpd/tasks/main.yml
> ---
>
> - name: 安装httpd
>
> yum: name=httpd,httpd-devel state=present
>
> - name: 同步httpd配置⽂件
>
> copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf
>
> notify: restart httpd
>
> - name: 同步主⻚⽂件
>
> copy:
>
> src=/etc/ansible/roles/httpd/files/index.html dest=/var/www/html/index.html
>
> - name: 同步php测试⻚
>
> copy: src=/etc/ansible/roles/httpd/files/test.php dest=/var/www/html/test.php
>
> - name: 启动httpd并开机⾃启动
>
> service: name=httpd state=started enabled=yes
****第4步: 编写httpd角色里的handler****
> \[root@m0 \~\]#vim /etc/ansible/roles/httpd/handlers/main.yml
>
> ---
>
> - name: restart httpd
>
> service: name=httpd state=restarted
****第5步: 编写mysql⻆⾊的main.yml文件****
> ---
>
> - name: 安装mysql
>
> yum: name=mariadb,mariadb-server,mariadb-devel state=present
>
> - name: 启动mysql并开机⾃启动
>
> service: name=mariadb state=started enabled=yes
****第6步: 编写php⻆⾊的main.yml文件****
\[root@m0 \~\]#vim /etc/ansible/roles/php/tasks/main.yml
> ---
>
> - name: 安装php及依赖包
>
> yum: name=php,php-gd,php-ldap,php-odbc,phppear,php-xml,php-xmlrpc,php-mbstring,php-smp,phpsoap,curl,curl-devel,php-bcmath,php-mysql state=present
>
> notify: restart httpd
****第7步:编写lnmp的playbook文件调用前面定义好的三个角色****
\[root@m0 \~\]#vim /etc/ansible/playbook/lamp.yaml
> ---
>
> - hosts: group1
>
> remote_user: root
>
> roles:
>
> - httpd
>
> - mysql
>
> - php
****第8步: 安装mariadb,命令行形式创建数据库和表****
\[root@m0 \~\]#vim /etc/ansible/playbook/lamp.yaml
> ---
>
> - hosts: group1
>
> remote_user: root
>
> roles:
>
> - httpd
>
> - mysql
>
> - php
****第9步: 执行lnmp的playbook⽂件****
\[root@m0 \~\]#ansible-playbook /etc/ansible/playbook/lamp.yaml
#### ****练习:请使⽤role来实现lnmp****
###### ****1、nginx端口修改为8080****
\[root@m0 \~\]# vim /etc/ansible/playbook/nginx.yml
> ---
>
> - hosts: s
>
> remote_user: root
>
> tasks:
>
> - name: 卸载httpd
>
> yum: name=httpd state=absent
>
> - name: 安装nginx
>
> yum: name=nginx state=present
>
> - name: 修改资源文件
>
> shell: echo 'i am nginx,port is 80' \> /usr/share/nginx/html/index.html
>
> - name: 修改端口
>
> command: sed -i '/listen/ s/80/8080/g' /etc/nginx/nginx.conf
>
> notify:
>
> - restart nginx
>
> - name: 启动服务
>
> service: name=nginx state=started enabled=yes
>
> handlers:
>
> - name: restart nginx
>
> service: name=nginx state=restarted
\[root@m0 \~\]# ansible-playbook /etc/ansible/playbook/nginx.yml
\[root@m0 \~\]# yum -y remove \*mariadb\*
\[root@m0 \~\]# yum -y install mariadb
\[root@m0 \~\]# yum -y install mariadb-server.x86_64
\[root@m0 \~\]# yum -y install mariadb-devel.x86_64
\[root@m0 \~\]# systemctl start mariadb
\[root@m0 \~\]# mysql
MariaDB \[(none)\]\> quit
Bye
****2、mariadb中创建eleme数据库****
\[root@m0 \~\]# mysql \<\
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/db01-master.err
log-bin=/usr/local/mysql/data/binlog
server-id=10
character_set_server=utf8mb4
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency
root@s1 \~\]# mysql -proot //启动主的mysql服务 > mysql\> create user 'slave0'@'%' identified by 'slave0'; ****//创建一个slave0用户,%表示在每个主机上都可以使用slave登录到该主机上**** > > Query OK, 0 rows affected (0.01 sec) > > mysql\> grant replication slave on \*.\* to 'slave0'@'%'; ****//将所有的数据库的所有表的replication slave操作权限给到slave0用户**** > > Query OK, 0 rows affected (0.00 sec) > > mysql\> flush privileges; //重新加载权限表 > > Query OK, 0 rows affected (0.01 sec) > > mysql\> create user 'slave1'@'%' identified by 'slave1'; ****//创建一个slave1用户,%表示在每个主机上都可以使用slave登录到该主机上**** > > Query OK, 0 rows affected (0.00 sec) > > mysql\> grant replication slave on \*.\* to 'slave1'@''%'; ****//将所有的数据库的所有表的replication slave操作权限给到slave0用户**** > > Query OK, 0 rows affected (0.00 sec) > > mysql\> flush privileges; > > Query OK, 0 rows affected (0.00 sec) > > mysql\> set @@global.read_only=ON; ****//配置只读模式(因为是基于gtids模式的主从复制)**** > > Query OK, 0 rows affected (0.00 sec) > > mysql\> exit > > Bye > > \[root@s1 \~\]# service mysql57 stop > > Shutting down MySQL.. SUCCESS! 做同步: > \[root@s1 \~\]# rm -rf /usr/local/mysql/data/auto.cnf > > \[root@s1 \~\]# yum -y install rsync ****//将主服务器的data文件同步到从服务器上**** > > \[root@s1 \~\]# yum list installed\|grep rsync > > rsync.x86_64 3.1.2-12.el7_9 @updates > > \[root@s1 \~\]# rsync -av /usr/local/mysql/data [[email protected]:/usr/local/mysql/](mailto:[email protected]:/usr/local/mysql/) # 从服务器(192.168.2.207)的配置 > \[root@m0 \~\]# ls > > mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz > > mysql57.tar.gz > > \[root@m0 \~\]# tar -xvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz > > \[root@m0 \~\]# cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql/ > > \[root@m0 \~\]# ls /usr/local/mysql/ > > ****bin**** include LICENSE README support-files > > docs lib man share > > \[root@m0 \~\]# mkdir /usr/local/mysql/mysql-files > > \[root@m0 \~\]# useradd -r -s /sbin/nologin mysql > > \[root@m0 \~\]# chown mysql:mysql /usr/local/mysql/mysql-files/ > > \[root@m0 \~\]# chmod 750 /usr/local/mysql/mysql-files/ > > \[root@m0 \~\]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql57 > > \[root@m0 \~\]# chkconfig --add mysql57 > > \[root@m0 \~\]# chkconfig mysql57 on > > \[root@m0 \~\]# vim /usr/local/mysql/my.cnf ****//查看配置文件(基于gtids模式)**** > > \[mysqld
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3310
log-error=/usr/local/mysql/data/db01-slave.err
relay-log=/usr/local/mysql/data/relaylog
server-id=11
character_set_server=utf8mb4
log-bin=/usr/local/mysql/data/binlog
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency
skip-slave-start
root@m0 \~\]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql8 \[root@m0 \~\]# sed -i '$aexport PATH=/usr/local/mysql/bin:$PATH' /etc/profile \[root@m0 \~\]# source /etc/profile \[root@m0 \~\]# service mysql57 start Starting MySQL.Logging to '/usr/local/mysql/data/m0.err'. ERROR! The server quit without updating PID file (/usr/local/mysql/data/m0.pid). ****//此时启动失败,无data文件**** \[root@m0 \~\]# yum -y install rsync \[root@m0 \~\]# ls /usr/local/mysql/data auto.cnf ib_logfile0 binlog.000001 ib_logfile1 binlog.000002 ibtmp1 binlog.index mysql ca-key.pem performance_schema ca.pem private_key.pem client-cert.pem public_key.pem client-key.pem s1.pid db01-master.err server-cert.pem ib_buffer_pool server-key.pem ibdata1 sys \[root@m0 \~\]# service mysql57 start //启动从服务器,密码跟主服务器一致 Starting MySQL.Logging to '/usr/local/mysql/data/db01-slave.err'. SUCCESS! \[root@m0 \~\]# mysql -P3310 -proot
主从复制的实现
主服务器:
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
mysql> create database if not exists abc charset utf8;
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock
mysql> show master status; //显示主服务器当前二进制日志的状态信息,
+---------------+----------+--------------+------------------+-------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------------------------------+
| binlog.000003 | 194 | | | 29bcc498-5ec5-11ef-a93f-000c2927b393:1-11 |
+---------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)
File:当前正在写入的二进制日志文件的名称。
Position:当前写入的位置(偏移量)在二进制日志文件中的位置。
从服务器:
root@mysql-slave \~\]# mysql -P3310 -proot //登录到从的数据库中 mysql\> set @@global.read_only=ON; ****//配置只读模式(因为是基于gtids模式的主从复制)**** Query OK, 0 rows affected (0.00 sec) mysql\> change master to -\> master_host='192.168.2.206', //指定主服务器的主机地址 -\> master_user='slave0', //指定用于连接主服务器进行复制的用户名 -\> master_password='slave0', //指定对应的密码 -\> master_port=3306, //指定主服务器的端口 -\> master_log_file='binlog.000003', //指定从哪个二进制日志文件开始复制 -\> master_log_pos=194; //指定在指定的二进制日志文件中的起始位置 -\> master_auto_position=1; //基于gtids模式的主从复制 Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql\> start slave; Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> show slave status\G //查看主从是否同步
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 10.0.0.57
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000003
Read_Master_Log_Pos: 1178
Relay_Log_File: relaylog.000002
Relay_Log_Pos: 323
Relay_Master_Log_File: binlog.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
在主mysql中添加eleme数据库设置为utf8mb4、添加表t_user、添加2行记录
root@s1\~\]# mysql -p'root' mysql\> create database if not exists eleme charset utf8mb4; Query OK, 1 row affected (0.00 sec) mysql\> show databases; +--------------------+ \| Database \| +--------------------+ \| information_schema \| \| eleme \| \| mysql \| \| performance_schema \| \| sys \| +--------------------+ 6 rows in set (0.00 sec) mysql\> create table eleme.t_user( -\> id int not null primary key, -\> name varchar(32) not null, -\> username varchar(32) not null, -\> password varchar(32) not null, -\> remark varchar(32) not null -\> ); Query OK, 0 rows affected (0.01 sec) mysql\> desc eleme.t_user; +----------+--------------+------+-----+---------+-------+ \| Field \| Type \| Null \| Key \| Default \| Extra \| +----------+--------------+------+-----+---------+-------+ \| id \| int(11) \| NO \| PRI \| NULL \| \| \| name \| varchar(32) \| NO \| \| NULL \| \| \| username \| varchar(32) \| NO \| \| NULL \| \| \| password \| varchar(32) \| NO \| \| NULL \| \| \| remark \| varchar(32) \| NO \| \| NULL \| \| +----------+--------------+------+-----+---------+-------+ 5 rows in set (0.02 sec) mysql\> insert into eleme.t_user values(1,'超级管理员','admin','admin','超级管理员'),(2,'普通用户','guest','guest','普通用户'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql\> select \* from eleme.t_user; +----+-----------------+----------+----------+-----------------+ \| id \| name \| username \| password \| remark \| +----+-----------------+----------+----------+-----------------+ \| 1 \| 超级管理员 \| admin \| admin \| 超级管理员 \| \| 2 \| 普通用户 \| guest \| guest \| 普通用户 \| +----+-----------------+----------+----------+-----------------+ 2 rows in set (0.00 sec)
2)基于mycat读写分离(需要jdk环境的支持)实现数据库的负载均衡:
设置防火墙规则
root@mycat \~\]# systemctl stop firewalld
\[root@mycat \~\]# systemctl disable firewalld
\[root@mycat \~\]# ls
anaconda-ks.cfg Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
jdk-8u192-linux-x64.tar.gz
# 下载并安装jdk、mycat
\[root@mycat \~\]# tar -xf jdk-8u192-linux-x64.tar.gz
\[root@mycat \~\]# tar -xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
\[root@mycat \~\]# cp -r jdk1.8.0_192/ /usr/local/jdk
\[root@mycat \~\]# cp -r mycat/ /usr/local/
\[root@mycat \~\]# ls /usr/local/jdk/
bin lib src.zip
COPYRIGHT LICENSE THIRDPARTYLICENSEREADME-JAVAFX.txt
include man THIRDPARTYLICENSEREADME.txt
javafx-src.zip README.html
jre release
# 添加环境变量
\[root@mycat \~\]# sed -i '$aexport JAVA_HOME=/usr/local/jdk' /etc/profile
\[root@mycat \~\]# source /etc/profile
\[root@mycat \~\]# $JAVA_HOME
-bash: /usr/local/jdk: 是一个目录
\[root@mycat \~\]# sed -i '$aexport PATH=$PATH:$JAVA_HOME/bin' /etc/profile
\[root@mycat \~\]# source /etc/profile
\[root@mycat \~\]# $PATH
-bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/jdk/bin: 没有那个文件或目录
\[root@mycat \~\]# javac -version
javac 1.8.0_192
\[root@mycat \~\]# ls /usr/local/mycat/
bin catlet conf lib logs version.txt
\[root@mycat \~\]# ll /usr/local/mycat/
总用量 12
drwxr-xr-x. 2 root root 190 8月 15 15:19 bin
drwxr-xr-x. 2 root root 6 8月 15 15:19 catlet
drwxr-xr-x. 4 root root 4096 8月 15 15:19 conf
drwxr-xr-x. 2 root root 4096 8月 15 15:19 lib
drwxr-xr-x. 2 root root 6 8月 15 15:19 logs
-rwxr-xr-x. 1 root root 219 8月 15 15:19 version.txt
# 修改mycat的两个配置文件
\[root@mycat \~\]# ls /usr/local/mycat/bin/mycat
\[root@mycat \~\]# vim /usr/local/mycat/conf/server.xml
# user标签设置对外的账号和密码,以及数据库名称, 如果只是代理⼀个主从,就注释其他的user标签
> \