0%

Shell函数应用

什么是函数

​ 函数其实就是一堆命令的合集,用来完成特定功能的代码块,你可以对它进行自定义命令,并且可以在脚本中任意位置使用这个函数,要使用定义的函数,只需要填写函数名称就可以了。

函数的作用

1.使用函数可以让代码模块化,便于代码的复用,同时增加脚本的可读性。
2.函数和变量类似,必须先定义才可使用,如果定义不调用则不会被执行。

函数基本的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
01. 如何定义Shell函数,可以通过如下两种方式进行定义。


#方式一

函数名() {
command1
command2
...
commandN
}

#方式二

function 函数名 {
command1
command2
...
commandN
}
------------------------------------------------------------------------------------------

02. 如何调用Shell函数,直接使用函数名调用即可。在函数内部也可以使用$1$2..$n的方式传递参数。


#1.命令行定义函数
[root@qiudao /scripts]# fun1() { echo "hello world"; }

#2.命令行调用函数
[root@qiudao /scripts]# fun1
hello world

#给函数传递参数
[root@qiudao /scripts]# fun2() { echo "hello $1"; }
[root@qiudao /scripts]# fun2 linux
hello linux

#4.给函数传递多个参数{$*,接收所有的参数传递}
[root@qiudao /scripts]# fun3() { echo "hello $*"; }
[root@qiudao /scripts]# fun3 zhangsan lisi wangwu
hello zhangsan lisi wangwu

函数参数传递

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
01. 函数传参示例,使用变量方式传递固定值


[root@qiudao /scripts]# cat fun-1.sh
#!/bin/bash
fun_1() {
echo "$num"
}
num=10 #传递参数
fun_1 #调用函数

#执行脚本
[root@qiudao /scripts]# sh fun-1.sh
10

------------------------------------------------------------------------------------------

02. 函数传参示例,使用变量方式传递可变的值


[root@qiudao /scripts]# cat fun-2.sh
#!/bin/bash
fun_1() {
echo "$num"
}
num=$1 #将脚本的第一个位置参数传递给变量num
fun_1 #调用函数

#执行脚本
[root@qiudao /scripts]# sh fun-2.sh 20
20

------------------------------------------------------------------------------------------

03. 函数传参示例,传递多个位置参数


[root@qiudao /scripts]# cat fun-3.sh
#!/bin/bash
fun_1() {
echo "$1" #接收执行函数是传递的第一个参数
}
fun_1 $1 #接收脚本第一个位置参数,传入函数中算第一个参数
fun_1 $2 #接收脚本第二个位置参数,传入函数中算第一个参数
fun_1 $3 #接收脚本第三个位置参数,传入函数中算第一个参数

#执行脚本
[root@qiudao /scripts]# sh fun-3.sh 10 20 30
10
20
30

[root@qiudao /scripts]# cat fun-3.sh
#!/bin/bash
fun_1() {
echo "$1"
}
fun_1 $1 $2 $3
fun_1 $2
fun_1 $3

[root@qiudao shell]# sh fun.sh 1 2 3
1
2
3

------------------------------------------------------------------------------------------

04. 函数传参示例,传递多个函数参数


[root@qiudao /scripts]# cat fun-4.sh
#!/bin/bash
fun_1() {
echo "$1" "$2" "$3" #函数接收传递三个参数
}
#rc=$(fun_1 10 20 30) #传递固定的值
rc=$(fun_1 $1 $2 $3) #传递可变的值
echo "传递参数的值为,$rc"

#执行脚本
[root@qiudao /scripts]# sh fun-4.sh 10 20 30
传递参数的值为,10 20 30

------------------------------------------------------------------------------------------

05. 函数传参示例,将脚本的位置参数与函数的位置参数发生联动。


[root@qiudao /scripts]# cat fun-5.sh
#!/bin/bash
fun_1() {
echo "$num1" "$num2" "$num3"
}
num1=$1 #将脚本位置参数一的值传递给变量num1
num2=$2 #将脚本位置参数二的值传递变量给num2
num3=$3 #将脚本位置参数二的值传递变量给num3

rc=$(fun_1) #将函数执行的结果保存至rc变量中,便于后续echo输出

echo "传递参数的值为,$rc"

#执行脚本
[root@qiudao /scripts]# sh fun-5.sh 10 20 30
传递参数的值为,10 20 30

函数状态返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#Shell的函数返回值,也算是退出的状态。在Shell中只有echo、return两种方式。

1.使用return返回值:只能返回0-255的整数,函数使用return返回值,通常只是用来供其他地方调用获取状态,因此通常仅返回0或1;0表示成功,1表示失败。

2.使用echo返回值:使用echo可以返回任何字符串结果,通常用于返回数据,比如一个字符串值或者列表值。

01. Shell函数echoreturn返回值示例

[root@qiudao /scripts]# cat fun_echo_return.sh
#!/bin/bash
fun_echo_return() {
echo 100 #返回函数执行后的数据
return 1 #返回函数执行后的状态码(放置最后)
}

result=`fun_echo_return`

echo "函数的状态码是:$? "
echo "函数的返回值是:$result "

#执行脚本
[root@qiudao /scripts]# sh fun_echo_return.sh
函数的状态码是:1
函数的返回值是:100

------------------------------------------------------------------------------------------

02. Shell函数return返回值使用场景示例

#return示例一:
[root@qiudao /scripts]# cat fun_return.sh
#!/bin/bash
file=/etc/passwd #定义文件
t_file() {
if [ -f $file ];then
return 0
else
return 1
fi
}
#调用函数,并根据函数返回状态码进行输出
t_file && echo "该文件存在 $file" || echo "该文件不存在 $file"

#执行脚本
[root@qiudao /scripts]# sh fun_return.sh
该文件存在 /etc/passwd

#return示例二:(了解即可)
[root@qiudao /scripts]# cat fun_nginx_run.sh
#!/bin/bash
this_pid=$$
is_nginx_running() {
ps -ef|grep nginx |grep -v grep |grep -v $this_pid &>/dev/null
if [ $? -eq 0 ];then
return 0
else
return 1
fi
}
#调用函数,并根据函数返回状态码进行输出
is_nginx_running && echo "Nginx is running" || echo "Nginx is stoped"

函数场景示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#系统初始化版本

[root@qiudao /scripts]# cat system.sh
#!/bin/bash
#1.显示系统版本
check_system_version() {
awk '{print $(NF-1)}' /etc/redhat-release
}

#2.更新yum源
check_yum() {
tt=$(awk '{print $(NF-1)}' /etc/redhat-release)
if [ ${tt%%.*} -eq "6" ];then
mkdir -p /etc/yum.repos.d/backup
\mv /etc/yum.repos.d/.*repo /etc/yum.repos.d/backup/
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
elif [ ${tt%%.*} -eq "7" ];then
mkdir -p /etc/yum.repos.d/backup
\mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
fi
yum clean all && yum makecache
}

#3.安装基础软件包
package_install() {
yum install -y net-tools vim tree htop iftop \
iotop lrzsz wget unzip telnet nmap nc ntpdate \
bash-completion bash-completion-extra sysstat rsync nfs-utils -y
}

#4.关闭selinux
disable_selinux() {
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
setenforc 0 &> /dev/null
}

#5.关闭firewalld
disable_firewalld() {
systemctl stop firewalld.service
systemctl disable firewalld.service
}

#6.配置sshd服务
ssh_config() {
sed -i 's/#UseDNS yes/UseDNS no/g' /etc/ssh/sshd_config
sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' /etc/ssh/sshd_config
}
#7.加大文件描述符
limit_conf() {
echo '* - nofile 65535 ' >>/etc/security/limits.conf
}
#8.时间同步
date_time() {
echo '*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' >/var/spool/cron/root
}
menu() {
cat <<EOF
##########################################
## 1、操作系统发行版本 ##
## 2、部署yum源 ##
## 3、安装系统软件包 ##
## 4、关闭Selinux ##
## 5、关闭Firewalld ##
## 6、配置SSHD服务 ##
## 7、加大文件描述符 ##
## 8、同步系统时间 ##
## 9、打印菜单 ##
## q、退出程序 ##
##########################################
EOF
}
#打印菜单
menu
while true
do
read -p "您想干什么?就请输入上面对应的字符:" n
case $n in
1)
check_system_version
;;
2)
check_yum &>/dev/null
echo $? &>/dev/null && echo "yum源更新完成" || echo "yum源更新失败"
;;
3)
echo "安装软件包需要一部分时间,请耐心等待,正在安装中......."
package_install &>/dev/null
echo $? &>/dev/null && echo "基础软件包安装完成" || echo "基础软件包安装报错"
;;
4)
disable_selinux &>/dev/null
echo $? &>/dev/null && echo "Selinux 关闭成功" || echo "Selinux 关闭失败"
;;
5)
disable_firewalld &>/dev/null
echo $? &>/dev/null && echo "Firewalld 关闭成功" || echo "Firewalld 关闭失败"
;;
6)
ssh_config &>/dev/null
echo $? &>/dev/null && echo "sshd服务配置完成" || echo "sshd服务配置报错"
;;
7)
limit_conf &>/dev/null
echo $? &>/dev/null && echo "文件描述符数量修改成功" || echo "文件描述符数量修改失败"
;;
8)
date_time &>/dev/null
echo $? &>/dev/null && echo "定时任务添加成功" || echo "定时任务添加失败"
;;
9)
clear
menu
;;
q)
echo "您即将退出程序!"
exit 1
esac
done

数据库备份管理:逻辑和物理备份

  • [一.备份的原因]
  • [二.备份的类型]
  • [三.备份的方式]
  • [四.备份策略]
  • [五.备份工具]

备份的原因

1)备份就是为了恢复。
2)尽量减少数据的丢失(公司的损失)

备份的类型

冷备份:
这些备份在用户不能访问数据时进行,因此无法读取或修改数据。这些脱机备份会阻止执行任何使用数据的活动。这些类型的备份不会干扰正常运行的系统的性能。但是,对于某些应用程序,会无法接受必须在一段较长的时间里锁定或完全阻止用户访问数据。

温备份:
这些备份在读取数据时进行,但在多数情况下,在进行备份时不能修改数据本身。这种中途备份类型的优点是不必完全锁定最终用户。但是,其不足之处在于无法在进行备份时修改数据集,这可能使这种类型的备份不适用于某些应用程序。在备份过程中无法修改数据可能产生性能问题。

热备份:
这些动态备份在读取或修改数据的过程中进行,很少中断或者不中断传输或处理数据的功能。使用热备份时,系统仍可供读取和修改数据的操作访问。

备份方式

1.逻辑备份

  • binlog
  • mysqldump
  • into outfile
  • replication
  • mysqlbinlog

2.物理备份

  • cp data
  • Xtrabackup(percona公司)

备份策略

1.全量备份

2.增量备份

3.差异备份

逻辑备份工具-mysqldump

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
mysqldump
-u:指定用户
-p:指定密码
-h:指定主机域
-P:指定端口
-S:指定socket文件

#-A(--all-databases):全库备份
[root@db01 mysql]# mysqldump -uroot -p1 -A > /tmp/full.sql

#-B:指定库备份(可以备份多个库)
[root@db01 mysql]# mysqldump -uroot -p1 -B world > /tmp/world.sql
[root@db01 mysql]# mysqldump -uroot -p1 -B world test > /tmp/world_test.sql

#什么都不加:备份表(只能备份表,不能备份多个库)
[root@db01 mysql]# mysqldump -uroot -p1 world > /tmp/world_1.sql
#单表备份
[root@db01 mysql]# mysqldump -uroot -p1 world city > /tmp/world_2.sql

#-F (--flush-logs):备份的同时刷新binlog 有多少个库,刷新多少个binlog
[root@db01 mysql]# mysqldump -uroot -p1 -A -F > /tmp/full_F.sql

#--master-data=2 (打点备份,温备)
2:打点备份并且注释change master to
1:打点备份不注释change master to
0:相当于不开启,等于没写

#--single-transaction(快照备份)
[root@db01 ~]# mysqldump -uroot -p1 -A --master-data=2 --single-transaction > /tmp/f.sql

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000030', MASTER_LOG_POS=20550;
mysqlbinlog --start-position=20550 --stop-position=25058

#-R:备份存储过程和函数
[root@db01 ~]# mysqldump -uroot -p1 -A -R --master-data=2 --single-transaction > /tmp/f.sql

#--triggers:备份触发器
[root@db01 ~]# mysqldump -uroot -p1 -A -R --triggers --master-data=2 --single-transaction > /tmp/f.sql

#gzip 压缩备份
#终极备份语句
[root@db01 ~]# mysqldump -uroot -p1 -A -R --triggers --master-data=2 --single-transaction|gzip > /tmp/full_$(date +%F).sql.gz

####了解即可
#-d:仅备份表结构
#-t:仅备份数据
#-x:锁表备份

#恢复压缩数据
[root@db01 tmp]# zcat /tmp/full_2019-11-13.sql.gz | mysql -uroot -p1

注意:

1)mysqldump在备份和恢复时都需要MySQL实例启动为前提
2)一般数据量级100G以内,大约15-30分钟可以恢复(PB、EB就需要考虑别的方式:物理备份)
3)mysqldump是以覆盖的形式恢复数据的

企业故障恢复案例

背景:
正在运行的网站系统,MySQL数据库,数据量25G,日业务增量10-15M。

备份策略:
每天23:00,计划任务调用mysqldump执行全备脚本

故障时间点:
上午10点开发人员误删除一个核心业务表,如何恢复?

思路:

1.停库,停止业务(避免二次伤害数据)

1
[root@db01 tmp]# /etc/init.d/mysqld stop

2.准备新环境

  • 多实例(物理服务器)
  • 再买一台云主机

3.将昨天晚上23点做的全备导入新环境

1
zcat full_2019-11-12.sql |mysql -uroot -p1

4.根据binlog截取昨晚23点到今天上午10点的数据

1
2
3
4
[root@db01 tmp]# zcat /tmp/full_2019-11-13.sql|head -25
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000030', MASTER_LOG_POS=1010290;

mysqlbinlog --start-position=1010290 --stop-position=xxx /application/mysql/data/mysql-bin.000030 > /tmp/inc_23_10.sql

5.将截取出来的数据发送到新环境

1
scp /tmp/inc_23_10.sql 172.16.1.52:/tmp

6.导入新增数据

1
2
set sql_log_bin=0
mysql -uroot -p1 < /tmp/inc_23_10.sql

7.恢复生产业务

  • 应用割接(修改连接数据库的代码)

  • 导出核心业务表,恢复到旧生产环境

    1
    2
    3
    mysqldump -uroot -p1 db1 tb1 > /tmp/tb1.sql
    scp /tmp/tb1.sql 172.16.1.51:/tmp
    mysql -uroot -p1 db1 < /tmp/tb1.sql

以上两种方式都可以,选择速度最快的一种方式

改代码:

1).开发提交gitlab,从gitlab拉取,上线

2).开发写好了配置文件

8.开启业务

1
/etc/init.d/mysqld start

故障模拟恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql -uroot -p1

mysql> create database backup;

mysql> use backup

mysql> create table full select * from world.city;

mysql> create table full_1 select * from world.city;


mysql> show tables;
+------------------+
| Tables_in_backup |
+------------------+
| full |
| full_1 |
+------------------+

到时候了:23:00全备

1
[root@db01 mysql]# mysqldump -uroot -p1 -A -R --triggers --master-data=2 --single-transaction|gzip > /tmp/full_$(date +%F).sql.gz

模拟数据变化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@db01 mysql]# mysql -uroot -p1

mysql> use backup

mysql> create table inc select * from mysql.user;

mysql> create table inc_1 select * from mysql.user;

mysql> show tables;
+------------------+
| Tables_in_backup |
+------------------+
| full |
| full_1 |
| inc |
| inc_1 |
+------------------+

mysql> insert into full_1 select * from world.city;
mysql> commit;

模拟删除核心业务表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
mysql> drop table backup.full_1;

mysql> show tables;
+------------------+
| Tables_in_backup |
+------------------+
| full |
| inc |
| inc_1 |
+------------------+

mysql> drop database backup;

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| OD |
| QLS |
| ZLS |
| ageofoldboy |
| binlog |
| blog |
| db1 |
| db2 |
| linux5 |
| mysql |
| mysqldump |
| od |
| performance_schema |
| qwe |
| test |
| test1 |
| test2 |
| test3 |
| wordpress |
| world |
| xxx |
| zls1 |
| zls2 |
+--------------------+

恢复数据

mysqlbinlog –base64-output=decode-rows -vvv /application/mysql/data/mysql-bin.000032 |grep -i -B 5 ‘drop database shell’|sed -rn ‘s#.at (.)#\1#gp’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#1.停业务
#停止连接数据库的服务(php,tomcat,python)*****
[root@db01 mysql]# /etc/init.d/mysqld stop
Shutting down MySQL. SUCCESS!

#2.准备新的环境(初始化一个新的数据库实例,二进制安装MySQL)
[root@db02 scripts]# ./mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/application/mysql/data
[root@db02 scripts]# /etc/init.d/mysqld start
. SUCCESS!

[root@db02 mysql]# mysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+

#3.将全备的数据导入新环境
[root@db01 mysql]# scp /tmp/full_2019-11-14.sql.gz 172.16.1.52:/tmp/
[root@db02 mysql]# zcat /tmp/full_2019-11-14.sql.gz |mysql
mysql> show tables from backup;
+------------------+
| Tables_in_backup |
+------------------+
| full |
| full_1 |
+------------------+

mysql> select count(*) from backup.full_1;
+----------+
| count(*) |
+----------+
| 4079 |
+----------+

#4.截取binlog
[root@db02 mysql]# zcat /tmp/full_2019-11-14.sql.gz |head -25
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000031', MASTER_LOG_POS=268002;

[root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv /application/mysql/data/mysql-bin.000031|less
#搜索DROP
410758

[root@db01 data]# mysqlbinlog --start-position=268002 --stop-position=410758 /application/mysql/data/mysql-bin.000031 > /tmp/inc23_10.sql

#5.发送并导入sql文件
[root@db01 data]# scp /tmp/inc23_10.sql 172.16.1.52:/tmp/
[root@db02 mysql]# mysql < /tmp/inc23_10.sql

mysql> use backup

mysql> show tables;
+------------------+
| Tables_in_backup |
+------------------+
| full |
| full_1 |
| inc |
| inc_1 |
+------------------+

mysql> select count(*) from full_1;
+----------+
| count(*) |
+----------+
| 8158 |
+----------+

#6.恢复生产业务
- 1.修改代码
- 2.导出核心业务表,恢复到生产库

[root@db02 mysql]# mysqldump -B backup > /tmp/backup.sql
[root@db02 mysql]# scp /tmp/backup.sql 172.16.1.51:/tmp/

[root@db01 data]# /etc/init.d/mysqld start
[root@db01 data]# mysql -uroot -p1 < /tmp/backup.sql
#7.启动服务
tomcat php ...

结合:mysqldump全备+binlog增备 恢复数据。

物理备份-Xtrabackup

1
[root@db01 ~]# yum localinstall percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm -y

1)对于非innodb表(比如myisam)是直接锁表cp数据文件,属于一种温备。
2)对于innodb的表(支持事务),不锁表,cp数据页最终以数据文件方式保存下来,并且把redo和undo一并备走,属于热备方式。
3)备份时读取配置文件/etc/my.cnf

全量备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@db01 ~]# mkdir /backup
[root@db01 ~]# innobackupex --user=root --password=1 /backup
completed OK!
#记录binlog名字和位置点
-rw-r----- 1 root root 21 Nov 15 00:29 xtrabackup_binlog_info
#
-rw-r----- 1 root root 119 Nov 15 00:29 xtrabackup_checkpoints
#备份类型(全备)
backup_type = full-backuped
#从哪个日志版本号开始
from_lsn = 0
#备份到哪个日志版本号
to_lsn = 1025046494
#最新的日志版本号
last_lsn = 1025046494
compact = 0
recover_binlog_info = 0

-rw-r----- 1 root root 466 Nov 15 00:29 xtrabackup_info
-rw-r----- 1 root root 2560 Nov 15 00:29 xtrabackup_logfile

恢复数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#1.先停库
/etc/init.d/mysqld stop

#2.清空data目录或者备份data目录
[root@db01 mysql]# mv /application/mysql/data/ /tmp/

#3.先做redo和undo 模拟CSR
[root@db01 mysql]# innobackupex --user=root --password=1 --apply-log /backup/2019-11-15_00-35-57

#4.恢复data 在my.cnf里面必须有datadir
[root@db01 mysql]# innobackupex --copy-back /backup/2019-11-15_00-35-57

#5.授权
[root@db01 mysql]# chown -R mysql.mysql /application/mysql/data

增量备份

备份方式

1)基于上一次备份进行增量
2)增量备份无法单独恢复,必须基于全备进行恢复
3)所有增量必须要按顺序合并到全备当中

1
2
3
4
5
6
7
8
9
10
[root@db01 ~]# innobackupex --user=root --password=1 --no-timestamp /backup/full

#1.第一次增量备份
[root@db01 backup]# innobackupex --user=root --password=1 --no-timestamp --incremental --incremental-basedir=/backup/full /backup/inc1

#2.第二次增量备份
[root@db01 backup]# innobackupex --user=root --password=1 --no-timestamp --incremental --incremental-basedir=/backup/inc1 /backup/inc2

#3.第三次增量备份
[root@db01 backup]# innobackupex --user=root --password=1 --no-timestamp --incremental --incremental-basedir=/backup/inc2 /backup/inc3

恢复数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1.增量备份无法单独恢复,必须基于全备进行恢复
2.所有增量必须要按顺序合并到全备当中
3.分步骤进行--apply-log

full + inc1 + inc2 + inc3
1)给全备,只做redo,不做undo
[root@db01 backup]# innobackupex --apply-log --redo-only /backup/full/
backup_type = log-applied
from_lsn = 0
to_lsn = 1025119769

2)将inc1合并到full中 只做redo 不做undo
[root@db01 backup]# innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full/
from_lsn = 0
to_lsn = 1025140919

3)将inc2合并到full中 只做redo 不做undo
[root@db01 backup]# innobackupex --apply-log --redo-only --incremental-dir=/backup/inc2 /backup/full/

4)将inc3合并到full中 redo 和 undo 都做
[root@db01 backup]# innobackupex --apply-log --incremental-dir=/backup/inc3 /backup/full/
backup_type = full-prepared
from_lsn = 0
to_lsn = 1025168949

5)将整个full目录模拟一次CSR
[root@db01 backup]# innobackupex --apply-log /backup/full/

6)copy back
[root@db01 backup]# rm -fr /application/mysql/data/*
[root@db01 backup]# innobackupex --copy-back /backup/full/
[root@db01 backup]# chown -R mysql.mysql /application/mysql/data/

差异备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@db01 backup]# innobackupex --user=root --password=1 --no-timestamp /backup/full_1
backup_type = full-backuped
from_lsn = 0
to_lsn = 1025176220

#1.第一次差异备份
[root@db01 backup]# innobackupex --user=root --password=1 --no-timestamp --incremental --incremental-basedir=/backup/full_1 /backup/chayi1
[root@db01 backup]# cat chayi1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1025176220
to_lsn = 1025202474

#2.第二次差异备份
[root@db01 backup]# innobackupex --user=root --password=1 --no-timestamp --incremental --incremental-basedir=/backup/full_1 /backup/chayi2
backup_type = incremental
from_lsn = 1025176220
to_lsn = 1025208985

#3.第三次差异备份
[root@db01 backup]# innobackupex --user=root --password=1 --no-timestamp --incremental --incremental-basedir=/backup/full_1 /backup/chayi3

#4.第四次差异备份
[root@db01 backup]# innobackupex --user=root --password=1 --no-timestamp --incremental --incremental-basedir=/backup/full_1 /backup/chayi4
backup_type = incremental
from_lsn = 1025176220
to_lsn = 1025234244

恢复数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#1.停数据库
[root@db01 backup]# /etc/init.d/mysqld stop

#2.删除data目录或者备份
[root@db01 backup]# rm -fr /application/mysql/data/*

#3.模拟CSR合并数据
full_1 + chayi1 + chayi2 + chayi3 + chayi4
1)full_1只做redo 不做undo
[root@db01 backup]# innobackupex --apply-log --redo-only /backup/full_1/
2)将chayi4合并到full_1 redo undo 都做
[root@db01 backup]# innobackupex --apply-log --incremental-dir=/backup/chayi4 /backup/full_1/
3)将full_1 redo undo 都做
[root@db01 backup]# innobackupex --apply-log /backup/full_1/

#4.copy back
[root@db01 backup]# innobackupex --copy-back /backup/full_1/
[root@db01 backup]# chown -R mysql.mysql /application/mysql/data/
1
2
3
4
5
6
#!/bin/bash

while true;do
mysql -uroot -p1 -e 'insert into mysqldump.mysqldump values(1);commit;'
sleep 2
done

优点:

1.备份的时候,方便

2.恢复的时候,也方便

缺点:

重复数据多,占用磁盘空间大

Nginx-LNMP架构搭建

Nginx和fastcgi之间的故事

1566179108056

1)发起一个!1566179108056](C:\Users\86152\Desktop\typora-user-images\1566179108056.png)动态请求,连接到服务器找到nginx

2)nginx来判断请求,找到相应location

1
2
3
location ~ \.php$ {
fastcgi_pass 127.0.0.1;
}

3)通过fastcgiphp-fpm管理进程建立连接

4)php-fpm调用wrapper对动态请求进行解析

php-fpm.conf:配置php进程相关的

php.ini:配置php工作请求相关的

5)如果需要用到数据库,php代码连接 数据库

nginx->fastcgi->php-fpm->wrapper->php.ini->php解析器->mysql

部署LNMP

部署nginx

1)更换nginx的官方源

1
2
3
4
5
6
[root@web01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

2)安装nginx

1
[root@web01 ~]# yum install -y nginx

3)创建nginx启动用户

1
2
[root@web01 ~]# groupadd www -g 666
[root@web01 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M

4)修改nginx的启动用户

1
2
3
#修改nginx的配置文件
[root@web01 ~]# vim /etc/nginx/nginx.conf
user www;

5)启动nginx并加入开机自启

1
2
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx

6)打开浏览器查看nginx是否启动成功

http://10.0.0.7

1566181245191

部署PHP

1)更改PHP源

1
2
3
4
5
[root@web02 ~]# vim /etc/yum.repos.d/php.repo 
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0

2)安装PHP

1
[root@web02 ~]# yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb

3)修改PHP的启动用户

1
2
3
[root@web01 conf.d]# vim /etc/php-fpm.d/www.conf
user = www
group = www

4)启动php加入开机自启

1
2
[root@web01 conf.d]# systemctl start php-fpm
[root@web01 conf.d]# systemctl enable php-fpm

5)配置nginx通过fastcgi连接php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@web01 conf.d]# vim php.conf
server {
listen 80;
server_name localhost;

location / {
root /usr/share/nginx/html;
index index.html;
}
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

6)打开浏览器访问

1566182781238

部署数据库

1)安装mariadb

1
[root@web01 ~]# yum install -y mariadb-server

2)启动并加入开机自启

1
2
[root@web01 ~]# systemctl start mariadb
[root@web01 ~]# systemctl enable mariadb

3)设置数据库密码

1
[root@web01 ~]# mysqladmin -uroot password 'Zls123.com'

4)连接数据库

1
[root@web01 ~]# mysql -uroot -pZls123.com

5)测试php连接数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$servername = "localhost";
$username = "root";
$password = "Zls123.com";

// 创建连接
$conn = mysqli_connect($servername, $username, $password);

// 检测连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "小哥哥,php可以连接MySQL...";
?>

<img style='width:100%;height:100%;' src=https://www.driverzeng.com/zenglaoshi/php_mysql.png>

1566186558517

6)连接数据库,创建库

1
2
3
4
5
6
7
8
9
10
11
12
13
#查看有哪些数据库
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
#创建数据库
MariaDB [(none)]> create database wordpress;
Query OK, 1 row affected (0.00 sec)

1566188109395

1566188157026

mysql-day01

数据库管理员:

1.用户管理

  • 用户名
  • 密码

2.权限管理

1
grant all on *.* to root@'%' identified by '123';

3.数据管理

  • 备份\恢复

4.集群管理

  • 主从复制
    • 异步复制
    • 半同步复制
    • 延时复制
    • 过滤复制
  • 读写分离
    • mycat
    • atlas
    • mysql-proxy
  • 高可用
    • MMM
    • MHA
    • 双主+keepalived
    • MGR
  • 监控
    • shell
    • zabbix
    • percona

MySQL安装选择

mysql官网

1572398449570

1572398466007

1572398490014

1572398508063

MySQL版本选择的潜规则:

MySQL5.6版本:GA 6-12个月 ,小版本是偶数版本

1572398840189

MySQL5.7版本:GA 6-12个月 ,小版本是偶数版本,选择MySQL5.7.17以上版本 (MGR)

源码:mysql-5.6.44.tar.gz

1572399210091

二进制:mysql-5.6.44-linux-glibc2.12-x86_64.tar.gz

1572399269196

什么是数据?

数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的的原始素材。
数据可以是连续的值,比如声音、图像,称为模拟数据。也可以是离散的,如符号、文字,称为数字数据。
在计算机系统中,数据以二进制信息单元0,1的形式表示。

为什么不把数据放到 word这些工具里面?

1.安全性

2.集群

什么是数据库管理系统

DBMS(database management system)

1.管理数据

2.存储数据

数据库的种类

1.关系型数据库(RDBMS)

典型产品:MySQL,Oracle,MSSQL(SQLserver)t-sql

img

表与表之间是由关联的(连表查询)

2.非关系型数据库(NoSQL)

img

不使用SQL语句

json(key:value)

MongoDB、Redis、elasticsearch

关系型数据库非关系型数据库功能对比

img

关系型和非关系型特点对比:

关系型数据库(RDBMS)的特点:

  • 1.二维表
  • 2.典型产品Oracle传统企业,MySQL互联网企业
  • 3.数据存取是通过SQL(Structured Query Language结构化查询语言)
  • 4.最大特点数据安全性方面强(ACID)

非关系型数据库(NoSQL:Not only SQL)的特点:

  • 1.不是否定关系型数据库,而是做关系型数据库的补充。

时代特点对比

    1. web1.0时代
    • 1.1 企业提供内容,用户浏览,所以关系型数据库够用,并发并不高,所以不需要nosql。
    1. web2.0时代
    • 2.1 核心是企业提供平台,用户参与提供内容,这个时代关系型数据库无法满足需求了。
    1. 2003NoSQL出现
    • 3.1 memcache的诞生,关注的点是性能,但是针对安全性能关注比较低,随着安全性能需求不断提升,所以有了redis。
    1. redis的特点
    • 4.1 依然高性能高并发
    • 4.2 数据持久化功能
    • 4.3 支持多数据类型,主从复制和集群
    • 4.4 管理不再使用SQL了

NoSQL的分类、特点、典型产品

  • 1.键值(KV)存储:memcached、redis
  • 2.列存储(column-oriented):HBASE(新浪、360)Cassandra(200台服务器集群)
  • 3.文档数据库(document-oriented):MongoDB(最接近关系型数据库的NoSQL)
  • 4.图形存储(Graph):Neo4j
大版本 经典版本号
7 7.3.4
8i(internet) 8.1.7
9i 9.2.0.8
10g(grid) 10.2.0.4
11g 11.2.0.3、11.2.0.4
12c(cloud) None
18c None

源码安装MySQL

  • 解压
  • 生成
  • 编译
  • 安装

0.安装依赖包

1
[root@db01 mysql-5.6.44]# yum install -y cmake ncurses-devel autoconf

1.下载安装包

1
wget https://downloads.mysql.com/archives/get/file/mysql-5.6.44.tar.gz

2.解压

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[root@db01 ~]# tar xf mysql-5.6.44.tar.gz
[root@db01 ~]# cd mysql-5.6.44
[root@db01 mysql-5.6.44]# ll
total 252
drwxr-xr-x 2 7161 31415 4096 Mar 15 2019 BUILD
drwxr-xr-x 2 7161 31415 4096 Mar 15 2019 client
drwxr-xr-x 4 7161 31415 4096 Mar 15 2019 cmake
-rw-r--r-- 1 7161 31415 23415 Mar 15 2019 CMakeLists.txt
drwxr-xr-x 3 7161 31415 21 Mar 15 2019 cmd-line-utils
-rw-r--r-- 1 7161 31415 19838 Mar 15 2019 config.h.cmake
-rw-r--r-- 1 7161 31415 40929 Mar 15 2019 configure.cmake
-rw-r--r-- 1 7161 31415 17987 Mar 15 2019 COPYING
drwxr-xr-x 2 7161 31415 312 Mar 15 2019 dbug
drwxr-xr-x 2 7161 31415 80 Mar 15 2019 Docs
-rw-r--r-- 1 7161 31415 65958 Mar 15 2019 Doxyfile-perfschema
drwxr-xr-x 4 7161 31415 229 Mar 15 2019 extra
drwxr-xr-x 4 7161 31415 4096 Mar 15 2019 include
-rw-r--r-- 1 7161 31415 333 Mar 15 2019 INSTALL
drwxr-xr-x 3 7161 31415 224 Mar 15 2019 libmysql
drwxr-xr-x 3 7161 31415 204 Mar 15 2019 libmysqld
drwxr-xr-x 2 7161 31415 221 Mar 15 2019 libservices
drwxr-xr-x 2 7161 31415 4096 Mar 15 2019 man
drwxr-xr-x 10 7161 31415 305 Mar 15 2019 mysql-test
drwxr-xr-x 2 7161 31415 4096 Mar 15 2019 mysys
drwxr-xr-x 2 7161 31415 300 Mar 15 2019 mysys_ssl
drwxr-xr-x 9 7161 31415 113 Mar 15 2019 packaging
drwxr-xr-x 11 7161 31415 187 Mar 15 2019 plugin
-rw-r--r-- 1 7161 31415 2496 Mar 15 2019 README
drwxr-xr-x 2 7161 31415 4096 Mar 15 2019 regex
drwxr-xr-x 2 7161 31415 4096 Mar 15 2019 scripts
drwxr-xr-x 2 7161 31415 6 Mar 15 2019 source_downloads
drwxr-xr-x 4 7161 31415 12288 Mar 15 2019 sql
drwxr-xr-x 5 7161 31415 4096 Mar 15 2019 sql-bench
drwxr-xr-x 2 7161 31415 155 Mar 15 2019 sql-common
drwxr-xr-x 13 7161 31415 169 Mar 15 2019 storage
drwxr-xr-x 2 7161 31415 4096 Mar 15 2019 strings
drwxr-xr-x 5 7161 31415 4096 Mar 15 2019 support-files
drwxr-xr-x 2 7161 31415 4096 Mar 15 2019 tests
drwxr-xr-x 5 7161 31415 70 Mar 15 2019 unittest
-rw-r--r-- 1 7161 31415 88 Mar 15 2019 VERSION
drwxr-xr-x 3 7161 31415 298 Mar 15 2019 vio
drwxr-xr-x 2 7161 31415 32 Mar 15 2019 win
drwxr-xr-x 11 7161 31415 4096 Mar 15 2019 zlib

3.创建需要安装的路径

1
[root@db01 mysql-5.6.44]# mkdir /application

4.生成 ./configure –prefix=/usr/local/nginx-1.16.0 cmake 、gmake

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.44 \
-DMYSQL_DATADIR=/application/mysql-5.6.44/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.44/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DWITH_SSL=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0

5.编译

1
[root@db01 mysql-5.6.44]# make

6.安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@db01 mysql-5.6.44]# make install
[root@db01 mysql-5.6.44]# ll /application/mysql-5.6.44/
total 44
drwxr-xr-x 2 root root 4096 Oct 30 16:18 bin
-rw-r--r-- 1 root root 17987 Mar 15 2019 COPYING
drwxr-xr-x 3 root root 18 Oct 30 16:17 data
drwxr-xr-x 2 root root 55 Oct 30 16:17 docs
drwxr-xr-x 3 root root 4096 Oct 30 16:17 include
drwxr-xr-x 3 root root 291 Oct 30 16:17 lib
drwxr-xr-x 4 root root 30 Oct 30 16:17 man
drwxr-xr-x 10 root root 4096 Oct 30 16:18 mysql-test
-rw-r--r-- 1 root root 2496 Mar 15 2019 README
drwxr-xr-x 2 root root 30 Oct 30 16:18 scripts
drwxr-xr-x 28 root root 4096 Oct 30 16:18 share
drwxr-xr-x 4 root root 4096 Oct 30 16:18 sql-bench
drwxr-xr-x 2 root root 136 Oct 30 16:18 support-files

[root@db01 mysql-5.6.44]# ll /application/mysql-5.6.44/data/
total 0
drwxr-xr-x 2 root root 20 Oct 30 16:17 test

—————————————————华丽的分割线—————————————————

7.创建用户

1
[root@db01 mysql-5.6.44]# useradd mysql -s /sbin/nologin -M

8.拷贝启动脚本

1
2
[root@db01 support-files]# cd /application/mysql-5.6.44/support-files/
[root@db01 support-files]# cp mysql.server /etc/init.d/mysqld

9.拷贝配置文件

1
2
[root@db01 support-files]# cp my-default.cnf /etc/my.cnf
cp: overwrite ‘/etc/my.cnf’? y(覆盖)

10.创建socket文件存放目录

1
mkdir /application/mysql-5.6.44/tmp

11.软链接

1
[root@db01 scripts]# ln -s /application/mysql-5.6.44 /application/mysql

12.给MySQL目录授权

1
[root@db01 scripts]# chown -R mysql.mysql /application/*

13.初始化数据库

1
2
[root@db01 scripts]# cd /application/mysql-5.6.44/scripts
[root@db01 scripts]# ./mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/application/mysql/data

1572425444772

14.启动MySQL

1
2
[root@db01 scripts]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!

15.添加环境变量

1
2
3
4
5
6
7
8
9
10
11
[root@db01 scripts]# vim /etc/profile.d/mysql.sh
export PATH="/application/mysql/bin:$PATH"
#加载环境变量
[root@db01 scripts]# source /etc/profile
#查看所有的环境变量
[root@db01 scripts]# echo $PATH
/application/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

#检查端口
[root@db01 scripts]# netstat -lntup
tcp6 0 0 :::3306 :::* LISTEN 34209/mysqld

二进制安装MySQL

解压开就能使用,绿色安装

1.下载

1
wget https://downloads.mysql.com/archives/get/file/mysql-5.6.44-linux-glibc2.12-x86_64.tar.gz

2.解压

1
[root@db02 ~]# tar xf mysql-5.6.44-linux-glibc2.12-x86_64.tar.gz

3.创建MySQL用户

1
[root@db02 ~]# useradd mysql -s /sbin/nologin -M

4.创建MySQL安装目录

1
[root@db02 ~]# mkdir /application

5.移动MySQL到安装目录下

1
[root@db02 ~]# mv mysql-5.6.44-linux-glibc2.12-x86_64 /application/mysql-5.6.44

6.做软链接

1
[root@db02 ~]# ln -s /application/mysql-5.6.44 /application/mysql

7.拷贝启动脚本

1
[root@db02 support-files]# cp mysql.server /etc/init.d/mysqld

8.拷贝配置文件

1
2
[root@db02 support-files]# cp my-default.cnf /etc/my.cnf
cp: overwrite ‘/etc/my.cnf’? y(覆盖)

9.初始化

1
[root@db02 scripts]# ./mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data --user=mysql

10.授权MySQL目录

1
[root@db02 scripts]# chown -R mysql.mysql /application/mysql*

11.修改mysql启动脚本和程序

1
[root@db02 scripts]# sed -i 's#/usr/local#/application#g' /etc/init.d/mysqld /application/mysql/bin/mysqld_safe

12.启动

1
[root@db02 scripts]# /etc/init.d/mysqld start

13.添加环境变量

1
2
[root@db02 scripts]# vim /etc/profile.d/mysql.sh
export PATH="/application/mysql/bin:$PATH"

Nginx

状态码(重点)

200:正常访问

301:永久重定向

307:内部重定向


客户端报错(nginx/apache)

401:用户名密码认证失败

403:找不到主页,权限不足,selinux没有关

404:找不到页面


后端代码程序,php,java… MySQL ,redis

500:内部错误

502:bad gateway

503:服务器过载

504:请求超时


咱们班总共38人,一人两台设备,访问www.123.xxx 就会发起10次请求,访问两次

PV:38*2*2*10

UV:38*2

IP:1

SOA:松耦合架构


Nginx

两种部署方式:

1)yum安装

更改官方源:

1
2
3
4
5
6
[root@web ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

安装依赖包

1
yum install -y gcc gcc-c++ autoconf pcre pcre-devel openssl-devel make automake

安装nginx-1.16.0

1
yum install -y nginx

2)源码安装

解压

1
2
3
4
tar xf nginx-1.16.0.tar.gz
#创建www用户
groupadd www -g 666
useradd www -u 666 -g 666 -s /sbin/nologin -M

生成

1
2
3
4
5
6
./configure --prefix=/usr/local/nginx-1.16.0 \
--user=www \
--group=www \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-stream

编译

1
make

安装

1
make install

如何升级nginx或者添加功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ln -s /usr/local/nginx-1.16.0 /usr/local/nginx

#升级版本
./configure --prefix=/usr/local/nginx-1.17.2 \
--user=www \
--group=www \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-stream \
--with-http_mp4_module

#重新软链接
rm -f /usr/local/nginx && ln -s /usr/local/nginx-1.17.2 /usr/local/nginx
-----------------------------------------------------------------------------------------
#添加模块
./configure --prefix=/usr/local/nginx_new-1.16.0 \
--user=www \
--group=www \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-stream \
--with-http_mp4_module

#重新软链接
rm -f /usr/local/nginx && ln -s /usr/local/nginx_new-1.16.0 /usr/local/nginx

Ansible,SaltStack

先源码安装,然后打rpm包,放到yum仓库,然后yum安装

使用systemd管理nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

nginx相关配置文件

1.Nginx主配置文件

路径 类型 作用
/etc/nginx/nginx.conf 配置文件 nginx主配置文件
/etc/nginx/conf.d/default.conf 配置文件 默认网站配置文件

2.Nginx代理相关参数文件

路径 类型 作用
/etc/nginx/fastcgi_params 配置文件 Fastcgi代理配置文件
/etc/nginx/scgi_params 配置文件 scgi代理配置文件
/etc/nginx/uwsgi_params 配置文件 uwsgi代理配置文件

3.Nginx编码相关配置文件

路径 类型 作用
/etc/nginx/win-utf 配置文件 Nginx编码转换映射文件
/etc/nginx/koi-utf 配置文件 Nginx编码转换映射文件
/etc/nginx/koi-win 配置文件 Nginx编码转换映射文件
/etc/nginx/mime.types 配置文件 Content-Type与扩展名

4.Nginx管理相关命令

路径 类型 作用
/usr/sbin/nginx 命令 Nginx命令行管理终端工具
/usr/sbin/nginx-debug 命令 Nginx命令行与终端调试工具

4.Nginx日志相关目录与文件

路径 类型 作用
/var/log/nginx 目录 Nginx默认存放日志目录
/etc/logrotate.d/nginx 配置文件 Nginx默认的日志切割

nginx的配置文件详解

Nginx主配置文件整体分为三块进行学习,分别是CoreModule(核心模块)EventModule(事件驱动模块)HttpCoreModule(http内核模块)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}来表示开始与结束。

Nginx主配置文件整体分为三块进行学习,分别是CoreModule(核心模块),EventModule(事件驱动模块),HttpCoreModule(http内核模块)

CoreModule核心模块

user www; #Nginx进程所使用的用户
worker_processes 1; #Nginx运行的work进程数量(建议与CPU数量一致或auto)
error_log /log/nginx/error.log #Nginx错误日志存放路径
pid /var/run/nginx.pid #Nginx服务运行后产生的pid进程号
EventModule(事件驱动模块)

events {
worker_connections 25535; #每个worker进程支持的最大连接数
use epoll; #事件驱动模型, epoll默认
}
HttpCoreModule(http内核模块)

#http层开始
http {
#包含资源类型文件
include /etc/nginx/mime.types;
#默认以下载方式传输给浏览器(前提是该资源在mime.types中无法找到)
default_type application/octet-stream;
#日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#访问日志
access_log /var/log/nginx/access.log main;
#高效文件传输
sendfile on;
#搭配sendfile使用
#tcp_nopush on;
#长连接超时时间
keepalive_timeout 65;
#是否开启压缩
#gzip on;

#使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机)
'server' {
listen 80; #监听端口, 默认80
server_name driverzeng.com; #提供的域名
access_log access.log; #该网站的访问日志
#控制网站访问路径
'location' / {
root /usr/share/nginx/html; #存放网站源代码的位置
index index.html index.htm; #默认返回网站的文件
}
}
...
#第二个虚拟主机配置
'server' {
...
}

include /etc/nginx/conf.d/*.conf; #包含/etc/nginx/conf.d/目录下所有以.conf结尾的文件
} #http结束层

手写虚拟主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@web01 conf.d]# vim game.conf
server {
listen 80;
server_name localhost;

location / {
root /code;
index index.html;
}
}

#创建站点目录
[root@web01 conf.d]# mkdir /code
#授权www用户给站点目录
[root@web01 conf.d]# chown -R www.www /code
#手动创建index
[root@web01 code]# echo game > /code/index.html

1565755012533

1
2
3
4
5
6
7
[root@web01 code]# ll /code/
total 18860
-rw-r--r-- 1 root root 19304923 Aug 14 11:36 h5_games.zip
-rw-r--r-- 1 www www 5 Aug 14 11:51 index.html
[root@web01 code]# pwd
/code
[root@web01 code]# unzip h5_games.zip

虚拟主机

1
2
3
4
5
6
7
检查配置 nginx -t
立即生效配置 nginx -s reload
方式一、基于主机多IP方式

方式二、基于端口的配置方式

方式三、基于多个hosts名称方式(多域名方式)

MySQL-day9 日志管理

img

错误日志

作用:记录MySQL的报错信息,一般正常信息

默认是否开启:开启

默认路径:$datadir

默认日志名:${hostname}.err

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#编辑配置文件
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
log_error=/application/mysql/data/$hostname.err

[root@db01 ~]# ll /application/mysql/data/zls.err
-rw-rw---- 1 mysql mysql 7265 Nov 12 16:55 /application/mysql/data/zls.err

mysql> show variables like 'log_error';
+---------------+----------------------------------------+
| Variable_name | Value |
+---------------+----------------------------------------+
| log_error | /application/mysql-5.6.44/data/zls.err |
+---------------+----------------------------------------+

一般查询日志

作用:
记录mysql所有执行成功的SQL语句信息,可以做审计用,但是我们很少开启。

默认是否开启:关闭

默认位置:$datadir

默认名字:${hostname}.log

开启方式:

1
2
3
[mysqld]
general_log=1
general_log_file=/application/mysql/data/mysql.log

查看方式:

1
2
3
4
5
6
7
mysql> show variables like '%gen%';
+------------------+-----------------------------------------+
| Variable_name | Value |
+------------------+-----------------------------------------+
| general_log | ON |
| general_log_file | /application/mysql-5.6.44/data/db01.log |
+------------------+-----------------------------------------+

binlog 日志(二进制日志)

作用:
记录已提交的DML事务语句,并拆分为多个事件(event)来进行记录
记录所有DDL、DCL等语句
总之,二进制日志会记录所有对数据库发生修改的操作

默认是否开启:关闭

默认位置:$datadir

默认名字:mysql-bin

1
2
3
mysql-bin.000001
mysql-bin.000002
mysql-bin.000003

二进制日志模式:
statement:语句模式,上图中将update语句进行记录(默认模式)。
row:行模式,即数据行的变化过程,上图中Age=19修改成Age=20的过程事件。
mixed:以上两者的混合模式。
企业推荐使用row模式

如何开启二进制日志?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#在MySQL5.6中
[mysqld]
log-bin=/application/mysql/data/zls-bin
binlog_format=

#在MySQL5.7中
[mysqld]
server_id=1
log-bin=/application/mysql/data/zls-bin
binlog_format=

mysql> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+

statement:语句模式(默认)
row:行级模式(企业推荐使用)
记录数据行的变化过程
mixed:混合模式,把语句模式和行级模式混合使用

总结:
语句模式优点:通俗易懂,占用磁盘空间相对较少
语句模式缺点:不严谨,容易丢数据

行级模式优点:严谨,不易丢数据
行级模式缺点:看不懂,占用磁盘空间较大

mysql> create table binlog(id int);#DDL
mysql> insert into binlog values(1),(2),(3);#DML

#查看binlog
[root@db01 data]# mysqlbinlog zls-bin.000001
#查看行级模式的binlog
[root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv zls-bin.000002

binlog的作用:
1)如果我拥有数据库搭建开始所有的二进制日志,那么我可以把数据恢复到任意时刻
2)数据的备份恢复
3)数据的复制(主从)

事件介绍

1)在binlog中最小的记录单元为event
2)一个事务会被拆分成多个事件(event)

1
2
3
4
5
6
7
8
#查看总共的binlog
mysql> show binary logs;
+----------------+-----------+
| Log_name | File_size |
+----------------+-----------+
| zls-bin.000001 | 901 |
| zls-bin.000002 | 1767 |
+----------------+-----------+

事件(event)特性

1)每个event都有一个开始位置(start position)和结束位置(stop position)。
2)所谓的位置就是event对整个二进制的文件的相对位置。
3)对于一个二进制日志中,前120个position是文件格式信息预留空间。
4)MySQL第一个记录的事件,都是从120开始的。

行级模式回复数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> create database binlog;
Query OK, 1 row affected (0.01 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 220 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> use binlog
mysql> create table binlog(id int);

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 325 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> insert into binlog values(1);
mysql> insert into binlog values(2);
mysql> commit;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 612 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> update binlog set id=10 where id=1;
mysql> commit;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 814 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> delete from binlog where id=2;
mysql> commit;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1010 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> drop table binlog;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1133 | | | |
+------------------+----------+--------------+------------------+-------------------+

mysql> drop database binlog;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1222 | | | |
+------------------+----------+--------------+------------------+-------------------+

#状态一:
1
2

#状态二:
10
2

#状态三:
10

恢复数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#查看binlog日志
[root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv /application/mysql/data/mysql-bin.000001

start-position=120
stop-position=814

#截取binlog
[root@db01 data]# mysqlbinlog --start-position=120 --stop-position=814 /application/mysql/data/mysql-bin.000001 > /tmp/a.sql

#导入数据
[root@db01 data]# mysql -uroot -p1 < /tmp/a.sql

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| binlog |
+--------------------+

mysql> use binlog

mysql> show tables;
+------------------+
| Tables_in_binlog |
+------------------+
| binlog |
+------------------+

mysql> select * from binlog;
+------+
| id |
+------+
| 10 |
| 2 |
+------+

指定数据库恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
mysql> create database db1;

mysql> insert into binlog.binlog values(4);
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> use db1

mysql> create table tb1(id int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into tb1 values(1),(2);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> use db2
Database changed

mysql> create table tb2(id int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into tb2 values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from db1.tb1;
+------+
| id |
+------+
| 1 |
| 2 |
+------+


mysql> select * from db2.tb2;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+

mysql> insert into binlog.binlog values(10);
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables from db1;
Empty set (0.00 sec)

恢复

1
2
3
4
5
6
7
[root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv /application/mysql/data/mysql-bin.000001

mysqlbinlog -d db1 --start-position=1916 --stop-position=2576 /application/mysql/data/mysql-bin.000001 > /tmp/b.sql

[root@db01 data]# mysql -uroot -p1 < /tmp/b.sql

## -d 指定只查看某个库的binlog

删除、刷新binlog

1
2
3
4
5
#1.刷新binlog
mysql> flush logs;
#2.当重启数据库的时候,binlog会刷新
/etc/init.d/mysqld restart
#3.当binlog 大小达到1G的时候自动刷新
1
2
3
4
5
6
7
8
9
10
11
12
#1.删除binlog(临时,保留7天的)
mysql> SET GLOBAL expire_logs_days = 7;
#2.永久保存
[root@db01 data]# vim /etc/my.cnf
[mysqld]
expire_logs_days = 7
#3.删除3天之前的binlog
PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day;
#4.指定binlog名字删除,删除该binlog之前的所有binlog
PURGE BINARY LOGS TO 'mysql-bin.000010';
#5.清除所有binlog
mysql> reset master;

慢查询日志slow-log

1)是将mysql服务器中影响数据库性能的相关SQL语句记录到日志文件
2)通过对这些特殊的SQL语句分析,改进以达到提高数据库性能的目的

默认是否开启:关闭

默认位置:$datadir

默认名字:${hostname}-slow.log

开启方式:

1
2
3
4
5
6
7
8
9
10
#指定是否开启慢查询日志
slow_query_log = 1 ON
#指定慢日志文件存放位置(默认在data)
slow_query_log_file=/application/mysql/data/slow.log
#设定慢查询的阀值(默认10s)
long_query_time=0.05
#不使用索引的慢查询日志是否记录到索引
log_queries_not_using_indexes
#查询检查返回少于该参数指定行的SQL不被记录到慢查询日志
min_examined_row_limit=100(鸡肋)
1
mysql> create table city_1 select * from city;

NFS 共享存储

Rsync

备份,基于ssh协议

备份的方式

全备:备份所有的(完整的)数据

增备:基于上一次备份,增量的数据

Rsync的三种工作模式

1.本地模式

类似于cp命令

1
2
3
4
5
6
#拷贝文件
[root@backup ~]# rsync /etc/passwd ./

#拷贝目录
[root@backup ~]# rsync -avz /etc/ ./
[root@backup ~]# rsync -avz /etc /tmp

加/和不加/的区别

加/:拷贝目录下的所有文件

不加/:拷贝目录本身及目录下的所有文件

2.远程模式

类似于scp

1
2
3
4
5
#推:push
[root@backup ~]# rsync -avz /root/zls root@172.16.1.7:/root

#拉:pull
[root@web01 ~]# rsync -avz root@172.16.1.41:/root/zls /root

3.守护进程

服务端:172.16.1.41

1)安装Rsync

1
yum install -y rsync

2)配置rsync

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[zls]
comment = welcome to oldboyedu backup!
path = /backup

3)创建系统用户

1
useradd rsync -s /sbin/nologin -M

4)创建backup目录

1
2
mkdir /backup
chown -R rsync.rsync /backup

5)创建虚拟用户的密码文件

1
2
echo 'rsync_backup:123' > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd

6)启动服务

1
2
systemctl start rsyncd
systemctl enable rsyncd

7)检测启动是否成功

1
2
ps -ef|grep rsyncd
netstat -lntup

客户端:172.16.1.7

1)安装rsync

1
yum install -y rsync

2)配置密码文件

1
2
echo '123' > /etc/pass
chmod 600 /etc/pass

3)免密的两种方式

1
2
3
4
5
#指定密码文件
--password-file=/etc/pass

#添加环境变量
export RSYNC_PASSWORD=123
主机名 作用 外网IP 内网IP
web01 客户端 10.0.0.7 172.16.1.7
backup 服务端 10.0.0.41 172.16.1.41

客户端需求:

1.客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02

1
2
3
4
5
6
7
8
9
10
11
12
13
mkdir -p /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F)

#!/bin/bash

PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
H=`hostname`
I=`ifconfig eth1|awk 'NR==2{print $2}'`
D=`date +%F`
S=${H}_${I}_${D}
BD=/backup
export RSYNC_PASSWORD=123

mkdir -p ${BD}/${S}

2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@web01 ~]# tar zcf /backup/nfs_172.16.1.31_2018-09-02/conf.tar.gz /etc/passwd 

#!/bin/bash

PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
H=`hostname`
I=`ifconfig eth1|awk 'NR==2{print $2}'`
D=`date +%F`
S=${H}_${I}_${D}
BD=/backup
export RSYNC_PASSWORD=123

mkdir -p ${BD}/${S}

tar zcf ${BD}/${S}/conf.tar.gz /etc/passwd

3.客户端最后将备份的数据进行推送至备份服务器

1
2
export RSYNC_PASSWORD=123
rsync -az ${BD}/ rsync_backup@172.16.1.41::zls

4.客户端每天凌晨1点定时执行该脚本

1
2
3
[root@web01 ~]# crontab -e
#每天凌晨一点备份重要数据 By:zls At:2019-08-02
00 01 * * * /bin/sh /root/rsync.sh &>/dev/null

5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
find ${BD} -type d -mtime +7|xargs rm -fr

#!/bin/bash

PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
H=`hostname`
I=`ifconfig eth1|awk 'NR==2{print $2}'`
D=`date +%F`
S=${H}_${I}_${D}
BD=/backup
export RSYNC_PASSWORD=123

mkdir -p ${BD}/${S}

tar zcf ${BD}/${S}/conf.tar.gz /etc/passwd

rsync -az ${BD}/ rsync_backup@172.16.1.41::zls

find ${BD} -type d -mtime +7|xargs rm -fr

客户端脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@web01 ~]# vim rsync.sh 
#!/bin/bash
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
H=`hostname`
I=`ifconfig eth1|awk 'NR==2{print $2}'`
D=`date +%F`
S=${H}_${I}_${D}
BD=/backup
export RSYNC_PASSWORD=123
mkdir -p ${BD}/${S}
tar zcf ${BD}/${S}/conf.tar.gz /etc/passwd &>/dev/null
md5sum ${BD}/${S}/conf.tar.gz > /backup/${I}.txt
rsync -az ${BD}/ rsync_backup@172.16.1.41::zls
find ${BD} -type d -mtime +7|xargs rm -fr

服务端需求:

1.服务端部署rsync,用于接收客户端推送过来的备份数据

2.服务端需要每天校验客户端推送过来的数据是否完整

3.服务端需要每天校验的结果通知给管理员

1
2
3
4
5
6
7
8
9
#!/bin/bash
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
H=`hostname`
I=`ifconfig eth1|awk 'NR==2{print $2}'`
D=`date +%F`
S=${H}_${I}_${D}
BD=/backup

md5sum -c ${BD}/*.txt|mail -s "${D}:校验结果" 133411023@qq.com

4.服务端仅保留6个月的备份数据,其余的全部删除

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
H=`hostname`
I=`ifconfig eth1|awk 'NR==2{print $2}'`
D=`date +%F`
S=${H}_${I}_${D}
BD=/backup

md5sum -c ${BD}/*.txt|mail -s "${D}:校验结果" 133411023@qq.com
find ${BD} -type d -mtime +180|xargs rm -fr

NFS

共享存储,文件服务器

NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS,ceph

为什么要使用共享存储

1.实现多台服务器之间数据共享

2.实现多台服务器之间数据一致

集群没有共享存储的情况

1.A用户上传图片经过负载均衡,负载均衡将上传请求调度至WEB1服务器上。

2.B用户访问A用户上传的图片,此时B用户被负载均衡调度至WEB2上,因为WEB2上没有这张图片,所以B用户无法看到A用户传的图片。

img

集群有共享存储

1.A用户上传图片无论被负载均衡调度至WEB1还是WEB2, 最终数据都被写入至共享存储

2.B用户访问A用户上传图片时,无论调度至WEB1还是WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源了

img

NFS的工作原理

1.用户进程访问NFS客户端,使用不同的函数对数据进行处理

2.NFS客户端通过TCP/IP的方式传递给NFS服务端。

3.NFS服务端接收到请求后,会先调用portmap进程进行端口映射。

4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端。

5.Rpc.mount进程判断客户端是否有对应的权限进行验证。

6.idmap进程实现用户映射和压缩7.最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件。

img

NFS部署

1.环境准备

主机名 角色 外网IP 内网IP
backup nfs的客户端 10.0.0.41 172.16.1.41
nfs nfs的服务端 10.0.0.31 172.16.1.31
web01 nfs的客户端 10.0.0.7 172.16.1.7

2.关闭防火墙和selinux

1
2
3
4
5
6
7
#1.关闭Firewalld防火墙
[root@nfs ~]# systemctl disable firewalld
[root@nfs ~]# systemctl stop firewalld

#2.关闭selinux防火墙
[root@nfs ~]# sed -ri '#^SELINUX=#cSELINUX=Disabled' /etc/selinux/config
[root@nfs ~]# setenforce 0

3.部署nfs服务端

1
yum -y install nfs-utils rpcbind

4.启动rpcbind

1
2
3
4
5
6
7
8
9
#启动rpcbind
[root@nfs01 ~]# systemctl start rpcbind
[root@web01 ~]# systemctl start rpcbind
[root@backup ~]# systemctl start rpcbind

#添加开机自启
[root@nfs01 ~]# systemctl start rpcbind
[root@web01 ~]# systemctl enable rpcbind
[root@backup ~]# systemctl start rpcbind

1564974331033

5.检测端口和进程

1
2
3
4
5
6
7
8
9
[root@nfs01 ~]# ps -ef|grep rpc
rpc 11746 1 0 01:12 ? 00:00:00 /sbin/rpcbind -w
root 11750 11421 0 01:15 pts/1 00:00:00 grep --color=auto rpc

[root@nfs01 ~]# netstat -lntup|grep 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd
udp6 0 0 :::111 :::* 1/systemd

6.编辑配置文件

1
2
[root@nfs01 ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)

6.1创建/data目录

1
2
[root@nfs01 data]# mkdir /data
[root@nfs01 data]# chown -R nfsnobody.nfsnobody /data

6.2启动NFS

1
[root@nfs01 ~]# systemctl start nfs-server

7.部署NFS客户端

1
yum install -y rpcbind nfs-utils

8.启动rpcbind

1
2
3
#只启动rpcbind
[root@web01 ~]# systemctl start rpcbind
[root@backup ~]# systemctl start rpcbind

9.查看可挂载点

1
[root@backup ~]# showmount -e 172.16.1.31

10.挂载目录

1
[root@backup ~]# mount -t nfs 172.16.1.31:/data /backup

统一web、nfs、backup的用户权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#创建www用户和组
[root@backup html]# groupadd www -g 666
[root@backup html]# useradd www -u 666 -g 666

---------------------------------WEB-----------------------------------
#修改httpd的配置文件
vim /etc/httpd/conf/httpd.conf
User www
Group www

[root@web01 html]# systemctl restart httpd

------------------------------------NFS--------------------------------------
#修改nfs的配置文件
[root@nfs01 data]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

[root@nfs01 data]# systemctl restart rpcbind nfs-server

#重新授权
[root@nfs01 data]# chown -R www.www /data

代码部署步骤

1.安装服务,httpd(apache)和php

1
yum install -y httpd php

2.查找httpd的站点目录

1
2
3
4
[root@web01 html]# rpm -ql httpd|grep html
[root@web01 html]# rz windows-提交作业代码.zip
[root@web01 html]# yum install -y unzip
[root@web01 html]# unzip windows-提交作业代码.zip

3.修改上传目录

1
2
[root@backup ~]# vim /var/www/html/upload_file.php
$wen="/var/www/html/tupian";

4.启动服务

1
systemctl start httpd

Ansible 变量

定义变量的方式

1.命令行

2.playbook

3.主机清单

如何定义变量

1.在playbook中定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#方法一:
- hosts: db02
vars:
pkg:
- MySQL-python
- mariadb-server
tasks:
- name:
yum:
name: "{{ pkg }}"
state: present

#方法二:
- hosts: db01
vars:
web_pkg: httpd
db_pkg:
- unzip
- vsftpd
php_pkg:
- php-fpm
- php
- php-mysql

2.使用vars_file定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#定义阶段
[root@m01 project]# vim vars_file.yml
web_pkg: httpd
db_pkg: mariadb-server
php_pkg: php

#调用阶段
[root@m01 project]# vim httpd.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install httpd
yum:
name: "{{ db_pkg }}"
state: present

3.使用Ansible内置变量

1
2
3
4
5
6
7
8
vim mkdri.yml
- hosts: web_group
tasks:
- name: MKDIR
file:
path: /backup/{{ ansible_fqdn }}_{{ ansible_default_ipv4['address'] }}_{{ ansible_date_time['date'] }}
state: directory
recurse: yes

4.使用主机清单定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#定义阶段
[web_group]
zls_web01 ansible_ssh_host=172.16.1.7
zls_web02 ansible_ssh_host=172.16.1.8

[web_group:vars]
web_pkg=nginx

[backup_group]
backup ansible_ssh_host=172.16.1.41

[db_group]
db01 ansible_ssh_host=172.16.1.51
db02 ansible_ssh_host=172.16.1.52

[nfs_group]
nfs ansible_ssh_host=172.16.1.31

[rsync_server:children]
web_group
backup_group

[rsync_server:vars]
web_pkg=httpd

[nfs_server:children]
web_group
nfs_group

#调用阶段
- hosts: zls_web01
tasks:
- name: Install web server
yum:
name: "{{ web_pkg }}"
state: present

5.官方推荐方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#定义阶段
#创建主机组变量定义目录
mkdir group_vars
[root@m01 ~]# vim group_vars/webs
web_pkg: httpd

#定义阶段
[root@m01 ~]# cat group_vars/webs
web_pkg: httpd
#定义阶段
[root@m01 ~]# cat host_vars/zls_web01
web_pkg: nginx

[root@m01 ~]# vim web.yml
- hosts: webs
tasks:
- name: Install web server
yum:
name: "{{ web_pkg }}"
state: present

6.命令行定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#调用阶段
[root@m01 ~]# !vim
vim web.yml
- hosts: webs
tasks:
- name: Install httpd Server
yum:
name:
- "{{ web_pkg }}"

- name: Install mariadb Server
yum:
name:
- "{{ db_pkg }}"


#定义阶段
[root@m01 ~]# ansible-playbook web.yml -e "web_pkg=vsftpd" -e "db_pkg=unzip"

Ansible变量优先级测试

1
2
3
4
5
6
7
8
9
- hosts: webs
vars:
dir: playbook_vars
vars_files: ./vars_file.yml
tasks:
- name: Create Dir
file:
path: /opt/{{ dir }}
state: directory
1
2
[root@m01 ~]# vim vars_file.yml
dir: vars_file
1
2
[root@m01 ~]# vim host_vars/zls_web01
dir: host_vars
1
2
[root@m01 ~]# vim group_vars/webs
dir: group_vars

测试阶段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#1.
[root@m01 ~]# ansible-playbook test.yml -e "dir=command_vars"
[root@web01 ~]# ll /opt/
total 0
drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars

#2.
[root@m01 ~]# ansible-playbook test.yml
[root@web01 ~]# ll /opt/
total 0
drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars
drwxr-xr-x 2 root root 6 Sep 19 16:50 vars_file

#3.
[root@m01 ~]# vim test.yml
- hosts: webs
vars:
dir: playbook_vars
tasks:
- name: Create Dir
file:
path: /opt/{{ dir }}
state: directory

[root@m01 ~]# ansible-playbook test.yml
[root@web01 ~]# ll /opt/
total 0
drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars
drwxr-xr-x 2 root root 6 Sep 19 16:52 playbook_vars
drwxr-xr-x 2 root root 6 Sep 19 16:50 vars_file

#4.
- hosts: webs
tasks:
- name: Create Dir
file:
path: /opt/{{ dir }}
state: directory

[root@m01 ~]# ansible-playbook test.yml

命令行 > vars_file > playbook vars > host_vars > group_vars

ansible层级定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#编辑变量文件
[root@m01 ~]# vim vars_file.yml
lamp:
framework:
web_package: httpd
db_package: mariadb-server
php_package: php

lnmp:
framework:
web_package: nginx
db_package: mysql
php_package: php

lnmt:
framework:
web_package: nginx
db_package: mysql
java_package: tomcat

#编辑playbook文件
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: "{{ lamp.framework.web_package }}"

- name: Install LAMP mariadb-server
yum:
name: "{{ lamp.framework.db_package }}"

- name: Install LAMP php
yum:
name: "{{ lamp.framework.php_package }}"

#官方推荐写法
[root@m01 ~]# vim test.yml
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: "{{ lamp['framework']['web_package'] }}"

- name: Install LAMP mariadb-server
yum:
name: "{{ lamp['framework']['db_package'] }}"

- name: Install LAMP php
yum:
name: "{{ lamp['framework']['php_package'] }}"

#执行playbook
[root@m01 ~]# ansible-playbook test.yml

PLAY [web_group] *****************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web01]
ok: [web02]

TASK [Install LAMP httpd] ********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]

TASK [Install LAMP mariadb-server] ***********************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]

TASK [Install LAMP php] **********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]

PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1
2
3
4
5
6
7
- hosts: webs
tasks:
- name: mem
file:
path: /opt/{{ ansible_facts['fqdn'] }}
#path: /root/{{ ansible_fqdn }}
state: directory

关闭facts

1
2
3
4
[root@m01 ~]# vim facts.yml
- hosts: web_group
gather_facts: no #关闭信息采集
tasks:

自动化运维工具-Ansible基础

什么是Ansible

Ansible是一个自动化统一配置管理工具

同类型软件对比

1.puppet 学习难,安装ruby环境难,没有远程执行功能
2.ansible 轻量级,大规模环境下只通过ssh会很慢,串行的
3.saltstack 一般选择salt会使用C/S结构的模式,salt-mastersalt-minion,并行的,大规模批量操作的情况下,会比Ansible速度快一些,底层使用的是zero-MQ消协队列

Ansible使用的是python2

saltstack即有python2也有python3

Ansible的功能及优点

1.远程执行
批量执行远程命令,可以对多台主机进行远程操作

2.配置管理
批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停

3.事件驱动
通过Ansible的模块,对服务进行不同的事件驱动
比如:
1)修改配置后重启
2)只修改配置文件,不重启
3)修改配置文件后,重新加载
4)远程启停服务管理

4.管理公有云
通过API接口的方式管理公有云,不过这方面做的不如saltstack.
saltstack本身可以通过saltcloud管理各大云厂商的云平台。

5.二次开发
因为语法是Python,所以便于运维进行二次开发。

6.任务编排
可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署

7.跨平台,跨系统
几乎不受到平台和系统的限制,比如安装apache和启动服务

在Ubuntu上安装apache服务名字叫apache2
在CentOS上安装apache服务名字叫httpd

在CentOS6上启动服务器使用命令:/etc/init.d/nginx start
在CentOS7上启动服务器使用命令:systemctl start nginx

Ansible的架构

1568165740284

Ansible的执行流程

1.Ansible读取playbook剧本,剧本中会记录对哪些主机执行哪些任务。
2.首先Ansible通过主机清单找到要执行的主机,然后调用具体的模块。
3.其次Ansible会通过连接插件连接对应的主机并推送对应的任务列表。
4.最后被管理的主机会将Ansible发送过来的任务解析为本地Shell命令执行。

安装Ansible

1.环境准备

主机名 wanIP lanIP 角色
m01 10.0.0.61 172.16.1.61 Ansible控制端
web01 10.0.0.7 172.16.1.7 Ansible被控端
web02 10.0.0.8 172.16.1.8 Ansible被控端

2.安装ansible

1
[root@m01 ~]# yum install -y ansible

3.查看ansible模块及版本

1
2
3
4
5
6
7
[root@m01 ~]# ansible --version
ansible 2.8.4
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

4.ansible参数

1
2
3
4
5
6
7
8
9
10
# ansible <host-pattern> [options]
--version #ansible版本信息
-v #显示详细信息
-i #主机清单文件路径,默认是在/etc/ansible/hosts
-m #使用的模块名称,默认使用command模块
-a #使用的模块参数,模块的具体动作
-k #提示输入ssh密码,而不使用基于ssh的密钥认证
-C #模拟执行测试,但不会真的执行
-T #执行命令的超时
ansible-doc #帮助

5.ansible配置文件读取顺序

1
2
3
4
5
6
7
8
9
10
11
[root@m01 ~]# vim /etc/ansible/ansible.cfg
# nearly all parameters can be overridden in ansible-playbook
# or with command line flags. ansible will read ANSIBLE_CONFIG,
# ansible.cfg in the current working directory, .ansible.cfg in
# the home directory or /etc/ansible/ansible.cfg, whichever it
# finds first

1、$ANSIBLE_CONFIG
2、./ansible.cfg
3、~/.ansible.cfg
4、/etc/ansible/ansible.cfg

ansible配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#inventory      = /etc/ansible/hosts      #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
host_key_checking = False #跳过检查主机指纹
log_path = /var/log/ansible.log #ansible日志

#普通用户提权操作
[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

ansible Inventory(主机清单文件)

场景一:密码方式连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@m01 ~]# cat /etc/ansible/hosts

#方式一、IP+端口+用户+密码
[webs]
10.0.0.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
10.0.0.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'

#方式二、主机名+密码
[webs]
web0[1:2] ansible_ssh_pass='123456'

#方式三、主机+密码
[webs]
web0[1:2]
[webs:vars]
ansible_ssh_pass='123456'

注意:方式二和方式三,都需要做hosts解析

场景二:密钥方式连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#创建密钥对
[root@m01 ~]# ssh-keygen
#推送公钥
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8

#方式一:
[web_group]
172.16.1.7
172.16.1.8

#方式二:
[webs]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8

场景三:主机组定义方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[web_group]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8

[db_group]
db01 ansible_ssh_host=172.16.1.51
lb01 ansible_ssh_host=172.16.1.5
[db_group:vars]
ansible_ssh_pass='1'

[nfs_group]
nfs ansible_ssh_host=172.16.1.31

[nfs_server:children]
web_group
nfs_group

[lnmp:children]
web_group
db_group


[root@m01 ~]# ansible 'all' --list-host
hosts (5):
nfs
web01
web02
db01
lb01
[root@m01 ~]# ansible 'web_group' --list-host
hosts (2):
web01
web02
[root@m01 ~]# ansible 'db_group' --list-host
hosts (2):
db01
lb01
[root@m01 ~]# ansible 'lnmp' --list-host
hosts (4):
web01
web02
db01
lb01

ad-hoc模式命令使用

1568174302939

结果返回颜色

1
2
3
绿色: 代表被管理端主机没有被修改
黄色: 代表被管理端主机发现变更
红色: 代表出现了故障,注意查看提示

ansible常用模块

1.command

1
2
3
4
5
6
7
8
9
10
[root@m01 ~]# ansible 'web_group' -m command -a 'free -m'
web02 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 972 140 489 7 342 658
Swap: 1023 0 1023

web01 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 972 113 412 13 446 669
Swap: 1023 0 1023

2.shell

1
2
3
4
5
6
7
8
[root@m01 ~]# ansible 'web_group' -m shell -a 'ps -ef|grep nginx'
web02 | CHANGED | rc=0 >>
root 12584 12583 0 20:16 pts/1 00:00:00 /bin/sh -c ps -ef|grep nginx
root 12586 12584 0 20:16 pts/1 00:00:00 grep nginx

web01 | CHANGED | rc=0 >>
root 14575 14570 0 12:16 pts/1 00:00:00 /bin/sh -c ps -ef|grep nginx
root 14577 14575 0 12:16 pts/1 00:00:00 grep nginx

1)command不支持特殊符号

2)shell模块支持特殊符号

3)不指定-m 默认使用的是command模块

3.script

1
2
3
4
5
6
7
[root@m01 ~]# vim vsftpd.sh 
#!/usr/bin/bash
mkdir /tmp/zls

[root@m01 ~]# ansible 'web01' -m script -a '/root/vsftpd.sh'

[root@m01 ~]# ansible 'web01' -m shell -a 'ls -l /tmp'

4.yum

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@m01 ~]# ansible 'web_group' -m yum -a 'name=vsftpd state=present'
#相当于:yum install -y vsftpd

[root@m01 ~]# ansible 'web_group' -m yum -a 'name=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm state=present'
#相当于:yum install -y https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm

[root@m01 ~]# ansible 'web_group' -m yum -a 'name=file:///root/nagios-4.4.3-1.el7.x86_64.rpm state=present'
#相当于:yum localinstall -y nagios-4.4.3-1.el7.x86_64.rpm

[root@m01 ~]# ansible 'web_group' -m yum -a 'name=vsftpd state=absent'
#相当于:yum remove -y vsftpd

name
httpd #指定要安装的软件包名称
file:// #指定本地安装路径(yum localinstall 本地rpm包)
http:// #指定yum源(从远程仓库获取rpm包)

state #指定使用yum的方法
installed,present #安装软件包
removed,absent #移除软件包
latest #安装最新软件包

5.yum_repository

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- name: Add repository
yum_repository:
name: epel
description: EPEL YUM repo
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/


#添加yum仓库
ansible 'web_group' -m yum_repository -a 'name=zls_epel,zls_base description=EPEL baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ gpgcheck=no enabled=yes file=zls_epel'

#添加mirrorlist
ansible 'web_group' -m yum_repository -a 'name=zls_epel description=EPEL baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ gpgcheck=no enabled=yes file=epel mirrorlist=http://mirrorlist.repoforge.org/el7/mirrors-rpmforge'

#删除yum仓库
ansible 'web_group' -m yum_repository -a 'name=zls_epel,zls_base file=zls_epel state=absent'

#修改yum仓库
ansible 'web_group' -m yum_repository -a 'name=epel description=EPEL baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ gpgcheck=no enabled=no file=epel'

name #指定仓库名字
description #添加描述(repo文件中的name)
baseurl #指定yum仓库的地址
gpgcheck #是否开启校验
yes
no
enabled #是否启用yum仓库
yes
no
file #指定仓库文件名
state
absent #删除yum仓库
present #创建yum仓库


ansible 'web_group' -m yum_repository -a 'name=zls_yum description=EPEL baseurl=http://www.driverzeng.com gpgcheck=no enabled=no file=zls'

ansible文件管理模块

1.copy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- name: Copy file with owner and permissions
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: '0644'


#推送文件
[root@m01 ~]# ansible 'web_group' -m copy -a 'src=/root/index.html dest=/var/www/html owner=root group=root mode=0644'

#推送文件并备份
[root@m01 ~]# ansible 'web_group' -m copy -a 'src=/root/index.html dest=/var/www/html owner=root group=root mode=0644 backup=yes'

#编辑nfs配置文件
[root@m01 ~]# ansible 'web_group' -m copy -a 'content="/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)" dest=/etc/exports'

src #指定推送的源文件
dest #指定推送的目标位置
owner #指定属主
group #指定属组
mode #指定权限(数字方式)
content #在指定文件中添加内容
backup #是否备份(注意:控制端和被控端,内容不一致才会备份)
yes
no

2.file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
- name: Create an insecure file
file:
path: /work
owner: root
group: root
mode: 0755

#创建目录 mkdir
[root@m01 ~]# ansible 'web_group' -m file -a 'path=/backup state=directory owner=adm group=adm mode=0700'

#递归创建目录并授权chown -R chmod -R
[root@m01 ~]# ansible 'web_group' -m file -a 'path=/zls/mysql/db01 state=directory owner=adm group=adm mode=0700 recurse=yes'

#创建文件(前提条件,上级目录必须存在) touch
[root@m01 ~]# ansible 'web_group' -m file -a 'path=/root/zls.txt state=touch'

#删除目录 rm -fr
[root@m01 ~]# ansible 'web_group' -m file -a 'path=/backup state=absent'

#做软链接 ln -s
[root@m01 ~]# ansible 'web_group' -m file -a 'src=/root/zls.txt dest=/root/zls.txt.ori state=link'

src #指定软链接的源文件
dest #指定软连接的目标文件
path #指定创建目录或文件
state
touch #创建文件
directory #创建目录
absent #删除目录或文件
link #做软链接
owner #指定属主
group #指定属组
mode #指定权限
recurse #递归授权
yes
no

3.get_url

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- name: Download foo.conf
get_url:
url: http://example.com/path/file.conf
dest: /etc/foo.conf
mode: '0440'

#下载worldpress代码
[root@m01 ~]# ansible 'web_group' -m get_url -a 'url=http://test.driverzeng.com/Nginx_Code/wordpress-5.0.3-zh_CN.tar.gz dest=/root mode=0777'

#下载并校验MD5
[root@m01 ~]# ansible 'web_group' -m get_url -a 'url=http://test.driverzeng.com/Nginx_Code/test.txt dest=/root mode=0777 checksum=md5:ba1f2511fc30423bdbb183fe33f3dd0f'

url #指定下载文件的url
dest #指定下载的位置
mode #指定下载后的权限
checksum #校验
md5 #md5校验
sha256 #sha256校验

ansible服务管理模块

1.service,systemd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@m01 ~]# ansible 'web_group' -m systemd -a 'name=httpd state=stopped enabled=yes'
[root@m01 ~]# ansible 'web_group' -m systemd -a 'name=httpd state=started enabled=yes'
[root@m01 ~]# ansible 'web_group' -m systemd -a 'name=httpd state=restarted enabled=yes'
[root@m01 ~]# ansible 'web_group' -m systemd -a 'name=httpd state=reloaded enabled=yes'

name #指定服务名称
state
started #启动
stopped #停止
restarted #重启
reloaded #重载
enabled #是否开机自启
yes
no

ansible用户管理模块

1.group

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- name: Ensure group "somegroup" exists
group:
name: somegroup
state: present

#创建组
[root@m01 ~]# ansible 'web_group' -m group -a 'name=www gid=666 state=present'

#删除组
[root@m01 ~]# ansible 'web_group' -m group -a 'name=www gid=666 state=absent'

name #指定组名
gid #指定gid
state
present #创建
absent #删除

2.user

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
- name: Create a 2048-bit SSH key for user jsmith in ~jsmith/.ssh/id_rsa
user:
name: jsmith
generate_ssh_key: yes
ssh_key_bits: 2048
ssh_key_file: .ssh/id_rsa

#创建用户
[root@m01 ~]# ansible 'web_group' -m user -a 'name=www uid=666 group=www state=present shell=/sbin/nologin create_home=false'

#删除用户
[root@m01 ~]# ansible 'web_group' -m user -a 'name=www uid=666 state=absent'

#创建用户的同时创建密钥对
[root@m01 ~]# ansible 'web_group' -m user -a 'name=zls generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa'

name #指定用户名
uid #指定uid
group #指定属组
groups #指定附加组
state
present #创建用户
absent #删除用户
shell #指定用户登录的shell
/bin/bash
/sbin/nologin
create_home #是否创建家目录
true
false
comment #添加注释
generate_ssh_key #创建密钥对
ssh_key_bits #指定密钥对长度
ssh_key_file #指定密钥文件

Ansible playbook

什么是playbook

playbook(剧本)是由两部分组成

play:主机或者主机组(角色:可以有一个或者多个)

task:指定工作(动作,台词:一个或者多个)


在Ansible中”剧本文件”是以yml结尾的文件。

在SaltStack中”剧本文件”是以sls结尾的文件。

但是语法,使用的都是yaml语法

playbook的组成

1568631108546

playbook和Ad-Hoc对比

特点 PlayBook ad-hoc
完整性
持久性
执行效率
变量 支持 不支持
耦合度

1.PlayBook功能比ad-hoc更全,是对ad-hoc的一种编排.
2.PlayBook能很好的控制先后执行顺序, 以及依赖关系.
3.PlayBook语法展现更加的直观.
4.playbook可以持久使用,ad-hoc无法持久使用.

YAML语法

1
2
3
4
5
6
7
8
9
10
11
12
缩进:

中国:
上海: 浦东新区
北京:
- 朝阳区
- 海淀区
- 昌平区
- 大兴区

美国:
德克萨斯州: 电信一区
1
2
冒号:只要不是以冒号结尾的冒号,冒号后面都要加空格
短横线-:代表一个层级,在Python中专业叫法,代表是一个列表

安装httpd练习

1.安装httpd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@m01 httpd]# vim httpd.yml
#角色
- hosts: web_group

#动作
tasks:
- name: install httpd server
yum:
name: httpd
state: present

#检查语法
[root@m01 httpd]# ansible-playbook --syntax-check httpd.yml

playbook: httpd.yml

#执行
[root@m01 httpd]# ansible-playbook httpd.yml
PLAY [web_group] ********************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************
ok: [zls_web02]
ok: [zls_web01]

TASK [install httpd server] *********************************************************************************************************
changed: [zls_web01]
changed: [zls_web02]

PLAY RECAP **************************************************************************************************************************
zls_web01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
zls_web02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

2.启动httpd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#角色
- hosts: web_group

#动作
tasks:
- name: install httpd server
yum:
name: httpd
state: present

- name: start httpd server
systemd:
name: httpd
state: started
enabled: yes

3.关闭防火墙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- hosts: web_group

#动作
tasks:
#关闭防火墙
- name: Stop Firewalld
systemd:
name: firewalld
state: stopped
enabled: no

#安装httpd
- name: install httpd server
yum:
name: httpd
state: present

#开启httpd
- name: start httpd server
systemd:
name: httpd
state: started
enabled: yes

4.给默认站点页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#角色
- hosts: web_group

#动作
tasks:
#关闭防火墙
- name: Stop Firewalld
systemd:
name: firewalld
state: stopped
enabled: no

#安装httpd
- name: install httpd server
yum:
name: httpd
state: present

#开启httpd
- name: start httpd server
systemd:
name: httpd
state: started
enabled: yes

#配置默认页面
- name: Config index.html
copy:
content: "zls_web_page"
dest: /var/www/html/index.html
group: root
owner: root
mode: 0644

5.给不同的web配置不同的页面(多个play)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#角色
- hosts: web_group

#动作
tasks:
#关闭防火墙
- name: Stop Firewalld
systemd:
name: firewalld
state: stopped
enabled: no

#安装httpd
- name: install httpd server
yum:
name: httpd
state: present

#开启httpd
- name: start httpd server
systemd:
name: httpd
state: started
enabled: yes

- hosts: zls_web01
tasks:

- name: Config index.html
copy:
content: "zls_web01_page"
dest: /var/www/html/index.html
group: root
owner: root
mode: 0644

- hosts: zls_web02
tasks:

- name: Config index.html
copy:
content: "zls_web02_page"
dest: /var/www/html/index.html
group: root
owner: root
mode: 0644

rsyncd实战

1.环境准备

主机名 wanIP lanIP 服务 角色
m01 10.0.0.61 172.16.1.61 Ansible 控制端(导演)
backup 10.0.0.41 172.16.1.41 rsync服务端 被控端(男一)
web01 10.0.0.7 172.16.1.7 rsync客户端 被控端(女二)
web02 10.0.0.8 172.16.1.8 rsync客户端 被控端(女二)

2.战前准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#准备项目目录
[root@m01 project]# mkdir rsyncd

#配置文件
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup

#准备主机清单
[web_group]
zls_web01 ansible_ssh_host=172.16.1.7
zls_web02 ansible_ssh_host=172.16.1.8

[backup_group]
backup ansible_ssh_host=172.16.1.41

[rsync_server:children]
web_group
backup_group

3.写剧本

1)安装rsync服务端和客户端

2)配置rsync服务端

3)创建目录授权

4)创建密码文件授权

5)创建系统用户

6)启动rsync并加入开机自启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
[root@m01 rsyncd]# vim rsyncd.yml
[root@m01 rsyncd]# cat rsyncd.yml
- hosts: rsync_server
tasks:

#关闭防火墙
- name: Stop firewalld
systemd:
name: firewalld
state: stopped
enabled: no

- name: SCP YUM REPO
copy:
src: /etc/yum.repos.d/CentOS-Base.repo
dest: /etc/yum.repos.d/

#安装rsync服务端和客户端
- name: Install rsyncd Server
yum:
name: rsync
state: present
#创建系统用户组
- name: Create www Group
group:
name: www
gid: 666
state: present
#创建系统用户
- name: Create www User
user:
name: www
uid: 666
group: www
create_home: false
shell: /sbin/nologin


- hosts: backup_group
tasks:
#配置rsync服务端
- name: Config rsyncd Conf
copy:
src: ./rsyncd.j2
dest: /etc/rsyncd.conf
owner: root
group: root
mode: 0644

#创建目录授权
- name: Create dir
file:
path: /backup
state: directory
owner: www
group: www
mode: 0755
recurse: yes

#创建密码文件授权
- name: Create passwd file
copy:
content: "rsync_backup:123"
dest: /etc/rsync.passwd
owner: root
group: root
mode: 0600


#启动rsync并加入开机自启
- name: Start rsyncd
systemd:
name: rsyncd
state: started
enabled: yes

#配置客户端
- hosts: web_group
tasks:
- name: Config client passwd file
copy:
content: "123"
dest: /etc/rsync.pass
owner: root
group: root
mode: 0600