0%

shell的基本概述

Shell基本概述

Shell是一个命令解释器,它的作用是解释和执行用户输入的命令及程序等,用户输入一条命令,Shell就解释执行一条。

什么是Shell ?

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@web01 ~]# echo   $-
himBH

h hashall 缓存,命令的路径
i 交互式shell
m 监控
B 大括号扩展
H history

[root@web01 ~]# vim test.sh
#!/bin/bash
echo $-
[root@web01 ~]# sh test.sh
hB



[root@web01 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

shell的种类
[root@web01 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
[root@web01 ~]# echo $SHELL
/bin/bash

什么是Shell脚本 ?

1
2
3
4
5
6
7
8
9
10
11
01)系统的命令堆积在一起,按照顺序执行。

02)特定的格式 + 特定的语法 + 系统的命令 = 文件

03)以.sh为结尾的文件

为什么要学习shell

重复性的工作
自动化的脚本
提高工作效率

Shell脚本能做什么 ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
01)基础配置:系统初始化操作、系统更新、内核调整、网络、时区、SSH优化等。

02)安装程序:LNMP、LAMP、MySQL、Nginx、Redis等。

03)配置变更:Nginx Conf、PHP Conf、MySQL Conf、Redis Conf等。

04)业务部署:Shell配合Git、Jenkins实现自动化部署PHP、Java代码,以及代码回滚。

05)日常备份:MySQL全备 + 增量 + binlog + crond + Shell脚本备份等。

06)信息采集:Zabbix + Shell: 对硬件、系统、服务、网络的监控等。

07)日志分析:ELK:取值->排序->去重->统计->分析等。

08)服务扩容/缩容:Zabbix + Shell
扩容: 监控服务器cpu, 如cpu负载持续80% + 触发动作(脚本)
脚本: 调用api开通云主机->初始化环境->加入集群->对外提供访问
缩容: 监控服务器cpu使用率20%->判断有多少web节点->判断是否超过预设->缩减到对应的预设状态->变更负载的配置

shell脚本书写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20


01) 创建存放脚本的文件夹

02)推荐使用vim编辑器编辑脚本(高亮显示)

03)以.sh为扩展名

04)规范的Shell脚本第一行会指出由哪个程序(解释器)来执行脚本中的内容。
#!/bin/bash 或 #!/bin/sh #如不指定Shell,默认以bash执行。

05)开头的"#!"称为幻数,在执行Shell脚本的时候,内核会根据"#!"后的解释器来确定使用哪个程序解释脚本中的内容。注意:这一行必须在每个脚本顶端的第一行,如果不是第一行则为脚本注释行。

06)附带作者及版权信息。

07)脚本注释:在Shell脚本中,跟在"#"后面的内容表示注释。注释部分不会被执行,仅给人看。注释可以自成一行,也可以跟在命令后面,与命令同行。要养成写注释的习惯,方便自己与他人。最好不用中文注释,因为在不同字符集的系统会出现乱码。

08)成对的符号一次书写完成。

09)循环的格式一次书写完成。

登录shell

是需要用户名、密码登录后才能进入的Shell。

非登录shell

当然就不需要输入用户名和密码即可打开的Shell,例如:直接命令”bash”就是打开一个新的非登录Shell,在Gnome或KDE中打开一个”终端”(terminal)窗口程序也是一个非登录Shell。

单双引号和不加引号及反引号的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@web01 shell]# echo  $name
web01
[root@web01 shell]# echo my name is web01 moneny is $10000000000
my name is web01 moneny is 0000000000
[root@web01 shell]# echo my name is $name moneny is $10000000000
my name is web01 moneny is 0000000000
[root@web01 shell]# echo 'my name is $name moneny is $10000000000'
my name is $name moneny is $10000000000
[root@web01 shell]# echo "my name is $name moneny is $10000000000"
my name is web01 moneny is 0000000000
[root@web01 shell]# echo "my name is $name moneny is \$10000000000"
my name is web01 moneny is $10000000000
[root@web01 shell]# echo my name is $name moneny is \$10000000000
my name is web01 moneny is $10000000000
[root@web01 shell]# echo 'my name is $name moneny is \$10000000000'
my name is $name moneny is \$10000000000

单引号 所见即所得,会把引号中的内容看做是一个整体。
双引号 所见即所得,会把引号中的内容看做是一个整体。会解析变量。
不加引号 所见即所得,如果出现空格,并不会把他看做是一个整体,会解析变量。
反引号 先执行里面的命令,把结果交出来 和$()同义。

echo特性

1
2
3
4
5
6
7
8
9
10
#echo命令输出颜色。

echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"

使用read命令写一个脚本修改主机名

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
1.使用read提示用户输入新的主机名 
2.是否确认修改主机名为新的主机名 提示用户输入 Y N
3.根据用户输入的Y或N进行判读
4.如果是Y,则修改。否则退出

[root@web01 shell]# vim read-4.sh
#!/bin/bash
#1.提示用户要修改之后的新的主机名
read -p "请输入你要修改之后的主机名:" New
#2.友好提示,是否确认修改
read -p "请确认是否修改主机名为 $New ,请输入[Y|N]:" con
#3.根据用户输入的Y或N进行判断,如果是Y,则修改,否则就不修改退出。
if [ $con == "Y" ];then
hostnamectl set-hostname $New && echo "hostname更新成功!"
bash
else
echo "你选择的是不修改,脚本退出!"
exit
fi

使用read写一个修改ip地址的脚本

[root@shell shell]# cat read-5.sh
#!/bin/bash
#1.请用户输入修改之后的ip地址的主机位
read -p "请输入你要修改之后的IP地址的主机位:" Ip
#2.友好提示,是否确认修改
read -p "你修改之后的ip地址主机位为:$Ip ,是否确认修改[Y|N]:" con
#3.判断用户输入的是Y还是N,如果是Y,则修改,否则退出。
if [ $con == "Y" ];then
#5.修改ip地址
sed -ri "s#(^IPA.*\.).*#\1$Ip#g" /etc/sysconfig/network-scripts/ifcfg-eth[01] && echo "IP地址修改成功"
#6.友好提示,主机名修改成功,是否确认重启网络服务进行生效。
read -p "是否确认重启网卡进行生效。请确认[Y|N]:" red
#根据用户输入的值进行判断,是否重启网卡
if [ $red == "Y" ];then
echo "网卡重启之后,该连接会断开,成功之后请使用新的ip地址进行连接。"
systemctl restart network
else
echo "你没有选择进行重启网卡服务,你可以手动重启,再见!"
exit
fi
else
echo "你选择不修改IP地址,再见!"
exit
fi

shell变量替换

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
变量							说明
${#变量} 获取变量值的长度
${变量#匹配规则} 从头开始匹配,最短删除
${变量##匹配规则} 从头开始匹配,最长删除
${变量%匹配规则} 从尾开始匹配,最短删除
${变量%%匹配规则} 从尾开始匹配,最长删除
${变量/旧字符串/新字符串} 替换变量内的旧字符串为新字符串,只替换第一个
${变量//旧字符串/新字符串} 替换变量内的旧字符串为新字符串,全部替换
${变量:匹配规则:匹配规则} 索引及切片

[root@shell shell]# url=www.oldboyedu.com.cn
[root@shell shell]# echo ${#url}
20

[root@shell shell]# echo ${url#*.}
oldboyedu.com.cn
[root@shell shell]# echo ${url##*.}
cn

[root@shell shell]# echo ${url%.*}
www.oldboyedu.com
[root@shell shell]# echo ${url%%.*}
www

[root@shell shell]# echo ${url/o/O}
www.Oldboyedu.com.cn
[root@shell shell]# echo ${url//o/O}
www.OldbOyedu.cOm.cn

[root@shell shell]# echo ${url:5:5}
ldboy
[root@shell shell]# echo ${url:0:3}
www
[root@shell shell]# echo ${url:3}
.oldboyedu.com.cn

RPM包管理

​ RPM全称RPM Package Manager缩写,由红帽开发用于软件包的安装,升级卸载与查询
​ mysql-5.6.40.tar.gz 源码包

RPM包: i686
tree- 1.6.0- 10. el7 .x86_64 .rpm
包名 版本 发布次数 centos7 包的架构(64位) 后缀
noarch 32位 64位都兼容

Linux中软件包分类

1
2
3
4
5
6
7
8
9
分类			安装					版本
rpm包 预先编译打包,安装简单 软件版本偏低
tree-1.6.0-10.el7.x86_64.rpm

源码包 手动编译打包,安装繁琐 软件版本随意
mysql-5.6.42.tar.gz

二进制包 解压即可使用, 安装简单 不能修改源码
mysql-5.6.42-linux-glibc2.12-x86_64.tar.gz
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
RPM包管理命令:安装
-i: #安装
-v: #详细信息
-h: #安装进度
--test: #测试是否能够安装成功
--force: #强制重新安装
--nodeps: #忽略依赖关系

rpm -ivh tree-1.6.0-10.el7.x86_64.rpm

#仅测试,是否能安装成功
[root@oldboyedu Packages]# rpm -ivh tree-1.6.0-10.el7.x86_64.rpm --test
Preparing... ################################# [100%]
#强制安装,忽略依赖
[root@oldboyedu Packages]# rpm -ivh --nodeps --force samba-client-4.8.3-4.el7.x86_64.rpm

RPM包管理命令:查询
rpm -q #查看指定软件包是否安装
rpm -qa #查看系统中已安装的所有RPM软件包列表
rpm -qi #查看指定软件的详细信息
rpm -ql #查询指定软件包所安装的目录、文件列表
rpm -qc #查询指定软件包的配置文件
rpm -qd #查询指定软件包的帮助文档
rpm -qf #查询文件或目录属于哪个RPM软件
rpm -q --scripts #查询rpm包安装前和安装后执行的脚本

RPM包管理命令:升级
-U 如果老版本不存在,就全新安装,如果存在有新版即升级
-f 老版本必须存在
1
2
3
如果有新版则升级, 软件升级不要跨操作系统主版本号

[root@zls ~]# rpm -Uvh /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm


RPM包管理命令:卸载
​ 卸载包时需要先把依赖的包卸载掉,如果依赖的包是系统所必须的,那就不能卸载这个包,否则会造成系统崩溃。

1
2
3
//先查询, 然后卸载 
[root@zls ~]# rpm -qa |grep sh
[root@zls ~]# rpm -e zsh

HTTP协议概述

HTTP:超文本传输协议

URL:统一资源定位符

请求信息

1
2
3
4
5
Request URL: http://10.0.0.7/		   #请求的url
Request Method: GET #请求的方式
Status Code: 200 OK #状态码
Remote Address: 10.0.0.7:80 #远程主机的IP和端口
Referrer Policy: no-referrer-when-downgrade #控制求情头信息
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
#请求的域名
:authority: www.driverzeng.com

#请求的方式
:method: GET

#请求的路径
:path: /

#请求的协议:https
:scheme: https

#请求资源类型
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3

#压缩
accept-encoding: gzip, deflate, br

#语言
accept-language: zh-CN,zh;q=0.9

#缓存控制(没有做缓存)
cache-control: no-cache

#保持连接:长连接
Connetection:keep-alive
HTTP/1.1版本 #长连接,一次TCP的连接可以发起多次http请求
HTTP/1.0版本 #短连接,一次TCP的连接只能发起一次http请求



#请求的域名
Host:www.driverzeng.com

#登录信息
cookie: PHPSESSID=afb7d767864ce6a652caa67dde33fcfc; wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_8cb66d45a3693d7c9673d2f1eaf63f66=admin%7C1565534946%7C0cvYan2unubeCmkeb4dHfIueS0DrnA4cW8plJj9700T%7C37bb38d7b5c62837d6d82dd12eda70830752a1a37cf976d94d4ee560c75f766f; wp-settings-1=libraryContent%3Dbrowse%26editor%3Dtinymce%26hidetb%3D0%26post_dfw%3Doff%26align%3Dcenter%26imgsize%3Dlarge%26mfold%3Do; wp-settings-time-1=1564325346; player_volume=0.0896551724137931; player=no; wp-postpass_8cb66d45a3693d7c9673d2f1eaf63f66=%24P%24Bpclv.Wj97LNy8oqHuxiMGDrNAjbwc1

#参数:没有缓存
pragma: no-cache

#谷歌自带的(不属于请求头的内容)
upgrade-insecure-requests: 1

#客户端(用户设备)
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36
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
#大小
Accept-Range:bytes
#阿里云存储保存时间
ali-swift-global-savetime: 1564813833
#缓存控制
cache-control: no-cache, must-revalidate, max-age=0
#压缩
content-encoding: gzip
#内容长度
content-length: 9410
#返回内容类型及字符集
content-type: text/html; charset=UTF-8
#返回服务器时间
date: Sat, 03 Aug 2018 06:30:33 GMT
#加密id
eagleid: 2dfd119815648138332064260e
#失效时间
expires: Wed, 11 Jan 1984 05:00:00 GMT
#软链接
link: <https://www.driverzeng.com/wp-json/>; rel="https://api.w.org/"
#参数:没有缓存
pragma: no-cache
#使用的web软件
server: Tengine
#状态码
status: 200
#指定特定站点允许访问
timing-allow-origin: *
#渲染
vary: Accept-Encoding
#经过各级缓存
via: cache14.l2cm12[99,200-0,M], cache1.l2cm12[101,0], cache13.cn1300[122,200-0,M], cache4.cn1300[123,0]

http请求流程

1.访问一个url

2.浏览器请求DNS去解析域名

3.DNS将域名对应的IP返回给浏览器 10.0.0.7

4.浏览器要与DNS解析出来的IP地址所在的服务器的80端口建立TCP/IP连接(三次握手) 10.0.0.7:80

5.浏览器向服务器的80端口发送http请求报文 10.0.0.7:80/index.html GET /index.html

6.服务器将响应http报文,返回index.html

7.断开TCP连接(四次挥手)

http请求的方法

方法(Method) 含义
GET 请求读取一个Web页面
POST 附加一个命名资(如Web页面)
DELETE 删除Web页面
CONNECT 用于代理服务器
HEAD 请求读取一个Web页面的头部
PUT 请求存储一个Web页面
TRACE 用于测试,要求服务器送回收到的请求
OPTION 查询特定选项

http响应的方法

img

状态码 含义
200 成功
301 永久重定向(跳转)
302 临时重定向(跳转)
304 本地缓存
307 内部重定向(跳转)
400 客户端错误
401 认证失败
403 找不到主页,权限不足
404 找不到页面
500 内部错误
502 找不到后端主机
503 服务器过载
504 后端主机超时

img

  • PV : 页面独立浏览量
  • UV : 独立设备
  • IP : 独立IP

SOA:松耦合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#一个电商公司,他的网站页面功能会有很多
注册
登录
首页
详情页
购物车
价格标签
留言
客服
支付中心
物流
仓储信息
订单相信
图片

Firewalld

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

安全 OSI

物理层
数据链路层
网络层
传输层
会话层
表示层
应用层

硬件安全 机柜锁
网络安全 iptables firewalld selinux
服务安全 更新有漏洞的版本 nginx mysql redis
系统安全 没有公网ip,修改ssh默认端口号,禁用root远程登录。
公有云 安全组

第三方软件 硬件防火墙 waf防火墙 防DDOS攻击 漏洞注入 SQL注入

安全狗
知道创宇
牛盾云

1. Firewalld基本概述

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

规则:默认是从外部访问内部是拒绝的,从内部访问外部,默认是允许的。

Firewalld底层使用的就是iptables

Firewalld 多了个zone的概念 区域

trusted 允许所有的数据包流入与流出
home 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量

internal 等同于home区域
work 拒绝流入的流量,除非与流出的流量数相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许流量

public 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量

external 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
dmz 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
block 拒绝流入的流量,除非与流出的流量相关
drop 拒绝流入的流量,除非与流出的流量相关


[root@web01 ~]# systemctl start firewalld
[root@web01 ~]# systemctl enable firewalld

#禁用iptables
[root@web01 ~]# systemctl mask iptables
Created symlink from /etc/systemd/system/iptables.service to /dev/null.
[root@web01 ~]# systemctl mask ip6tables
Created symlink from /etc/systemd/system/ip6tables.service to /dev/null.
[root@web01 ~]#

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
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195

#显示所有的zone

[root@web01 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work


#详细的显示所有zone的默认规则
[root@web01 ~]# firewall-cmd --list-all-zones
block
target: %%REJECT%%
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#显示当前默认的zone

[root@web01 ~]# firewall-cmd --get-default-zone
public

#显示默认区域的规则

[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#设置默认的区域
[root@web01 ~]# firewall-cmd --set-default-zone=trusted
success

#查看默认的区域
[root@web01 ~]# firewall-cmd --get-default-zone
trusted

#显示当前活动的区域及接口
[root@web01 ~]# firewall-cmd --get-active-zone
public
interfaces: eth0 eth1

#添加一个新的zone
[root@web01 ~]# firewall-cmd --new-zone=test --permanent
success

#查看所有的zone
[root@web01 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

#重启firewalld的设置规则

[root@web01 ~]# firewall-cmd --reload
success

#查看所有的zone
[root@web01 ~]# firewall-cmd --get-zones
block dmz drop external home internal public test trusted work

#删除zone
[root@web01 ~]# firewall-cmd --delete-zone=test --permanent
success

[root@web01 ~]# firewall-cmd --get-zones
block dmz drop external home internal public test trusted work

[root@web01 ~]# firewall-cmd --reload
success

[root@web01 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

3. 使用Firewalld中各个区域规则结合,当前默认区域拒绝所有的流量,但如果来源IP是10.0.0.0/24网段则允许。


[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#移除ssh和dhcp的服务

[root@web01 ~]# firewall-cmd --remove-service={ssh,dhcpv6-client}
success

[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#设置来源ip属于10.0.0.0/24网段的ip允许所有

[root@web01 ~]# firewall-cmd --add-source=10.0.0.0/24 --zone=trusted
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

[root@web01 ~]# firewall-cmd --get-active-zone
public
interfaces: eth0 eth1
trusted
sources: 10.0.0.0/24

[root@web01 ~]# firewall-cmd --reload #重启服务之后,临时生效的失效
success
[root@web01 ~]# firewall-cmd --get-active-zone
public
interfaces: eth0 eth1
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#拒绝10.0.0.0/24网段的所有服务

[root@web01 ~]# firewall-cmd --add-source=10.0.0.0/24 --zone=drop
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

[root@web01 ~]# firewall-cmd --get-active-zone
drop
sources: 10.0.0.0/24
public
interfaces: eth0 eth1

3. 防火墙服务管理

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

#添加一个服务

[root@web01 ~]# firewall-cmd --add-service=http
success

[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client http
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#移除一个服务

[root@web01 ~]# firewall-cmd --remove-service=dhcpv6-client
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh http
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#只显示当前允许的通过的服务

[root@web01 ~]# firewall-cmd --list-services
ssh http


#添加多个服务

[root@web01 ~]# firewall-cmd --add-service={https,mysql,redis}
success

[root@web01 ~]# firewall-cmd --list-services
ssh http https mysql redis

[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh http https mysql redis
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#移除多个服务

[root@web01 ~]# firewall-cmd --remove-service={http,https,mysql,redis}
success

[root@web01 ~]# firewall-cmd --list-services
ssh

[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#显示所有预定义的服务

[root@web01 ~]# firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry docker-swarm dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls managesieve mdns minidlna mongodb mosh mountd ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

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
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@web01 ~]# firewall-cmd --add-port=80/tcp
success

[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports: 80/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#显示所有允许的端口及协议

[root@web01 ~]# firewall-cmd --list-ports
80/tcp

#添加多个端口

[root@web01 ~]# firewall-cmd --add-port={443/tcp,6379/tcp}
success

[root@web01 ~]# firewall-cmd --list-ports
80/tcp 443/tcp 6379/tcp
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports: 80/tcp 443/tcp 6379/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

[root@web01 ~]# firewall-cmd --list-ports
80/tcp 443/tcp 6379/tcp

#移除一个端口

[root@web01 ~]# firewall-cmd --remove-port=6379/tcp
success
[root@web01 ~]# firewall-cmd --list-ports
80/tcp 443/tcp

#移除多个端口

[root@web01 ~]# firewall-cmd --remove-port={80/tcp,443/tcp}
success
[root@web01 ~]# firewall-cmd --list-ports

[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

5. 接口管理

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

#查看接口在哪个zone下面

[root@web01 ~]# firewall-cmd --get-zone-of-interface=eth0
public
[root@web01 ~]# firewall-cmd --get-zone-of-interface=eth1
public

#移除eth1接口
[root@web01 ~]# firewall-cmd --remove-interface=eth1
success

[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#添加一个接口
[root@web01 ~]# firewall-cmd --add-interface=eth0
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

[root@web01 ~]# firewall-cmd --get-zone-of-interface=eth1
no zone

#将接口跟zone进行相关联
[root@web01 ~]# firewall-cmd --change-interface=eth0 --zone=public
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

6. 源地址管理

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

#禁用一个ip地址的所有访问

[root@web01 ~]# firewall-cmd --add-source=10.0.0.8/32 --zone=drop
success

[root@web01 ~]# firewall-cmd --get-active-zone
drop
sources: 10.0.0.8/32
public
interfaces: eth0

#禁用一个网段

[root@web01 ~]# firewall-cmd --add-source=10.0.0.0/24 --zone=drop
success

[root@web01 ~]# firewall-cmd --get-active-zone
drop
sources: 10.0.0.8/32 10.0.0.0/24
public
interfaces: eth0

#允许一个ip地址访问所有

[root@web01 ~]# firewall-cmd --add-source=10.0.0.8/32 --zone=trusted
success
[root@web01 ~]# firewall-cmd --get-active-zone
public
interfaces: eth0
trusted
sources: 10.0.0.8/32

#移除ip地址

[root@web01 ~]# firewall-cmd --remove-source=10.0.0.8/32 --zone=trusted
success
[root@web01 ~]# firewall-cmd --get-active-zone
public
interfaces: eth0

7. 地址转发

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

firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>


#开启地址映射

[root@web01 ~]# firewall-cmd --add-masquerade
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#将本地的6666端口映射到后端的172.16.1.8的22端口

[root@web01 ~]# firewall-cmd --zone=public --add-forward-port=port=6666:proto=tcp:toport=22:toaddr=172.16.1.8
success

[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: yes
forward-ports: port=6666:proto=tcp:toport=22:toaddr=172.16.1.8
source-ports:
icmp-blocks:
rich rules:

#移除端口映射
[root@web01 ~]# firewall-cmd --remove-forward-port=port=6666:proto=tcp:toport=22:toaddr=172.16.1.8
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#禁用一切网络

[root@web01 ~]# firewall-cmd --panic-on

#关闭禁用的网络

[root@web01 ~]# firewall-cmd --panic-off

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

#拷贝配置文件
[root@web01 ~]# cp /usr/lib/firewalld/services/http.xml /usr/lib/firewalld/services/oldboy.xml

#编写配置文件
[root@web01 ~]# cat /usr/lib/firewalld/services/oldboy.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>WWW (oldboy)</short>
<description>oldboy is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
<port protocol="tcp" port="6379"/>
</service>

#添加这个服务
[root@web01 ~]# firewall-cmd --add-service=oldboy
success

[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client oldboy
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

9. 防火墙富规则

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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179

[root@web01 ~]# man firewalld.richlanguage #富规则的man帮助

rule
[source]
[destination]
service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
[log]
[audit]
[accept|reject|drop|mark]



rule [family="ipv4|ipv6"]
source address="address[/mask]" [invert="True"]
destination address="address[/mask]" invert="True"
service name="service name"
port port="port value" protocol="tcp|udp"
protocol value="protocol value"
forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"]
accept | reject [type="reject type"] | drop


#富规则相关命令


--add-rich-rule='<RULE>' #在指定的区添加一条富规则
--remove-rich-rule='<RULE>' #在指定的区删除一条富规则
--query-rich-rule='<RULE>' #找到规则返回0 ,找不到返回1
--list-rich-rules #列出指定区里的所有富规则


1. 比如允许10.0.0.1主机能够访问http服务,允许172.16.1.0/24能访问6379端口



[root@web01 ~]# firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=10.0.0.1/32 service name=http accept'
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="10.0.0.1/32" service name="http" accept
[root@web01 ~]#


[root@web01 ~]# firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 port port=6379 protocol=tcp accept'
success


[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="10.0.0.1/32" service name="http" accept
rule family="ipv4" source address="172.16.1.0/24" port port="6379" protocol="tcp" accept

#显示所有的富规则
[root@web01 ~]# firewall-cmd --list-rich-rules
rule family="ipv4" source address="10.0.0.1/32" service name="http" accept
rule family="ipv4" source address="172.16.1.0/24" port port="6379" protocol="tcp" accept

#删除一条富规则
[root@web01 ~]# firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="172.16.1.0/24" port port="6379" protocol="tcp" accept'
success

#返回yes说明规则存在且生效
[root@web01 ~]# firewall-cmd --zone=public --query-rich-rule='rule family="ipv4" source address="10.0.0.1/32" service name="http" accept'
yes

[root@web01 ~]# firewall-cmd --zone=public --query-rich-rule='rule family="ipv4" source address="172.16.1.0/24" port port="6379" protocol="tcp" accept'
no



2. 默认public区域对外开放所有人能通过ssh服务连接,但拒绝172.16.1.0/24网段通过ssh连接服务器


[root@web01 ~]# firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name=ssh drop'
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="10.0.0.1/32" service name="http" accept
rule family="ipv4" source address="172.16.1.0/24" service name="ssh" drop

3. 使Firewalld允许所有人能访问http,https服务,但只有10.0.0.1主机可以访问ssh服务

[root@web01 ~]# firewall-cmd --add-service={http,https}
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

[root@web01 ~]# firewall-cmd --zone=public --remove-service=ssh
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

[root@web01 ~]# firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=10.0.0.1/32 service name=ssh accept'
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="10.0.0.1/32" service name="ssh" accept


4. 当用户来源IP地址是10.0.0.1主机,则将用户请求的5555端口转发至后端172.16.1.8的22端口
[root@web01 ~]# firewall-cmd --add-masquerade
success

[root@web01 ~]# firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=10.0.0.1/32 forward-port port=5555 protocol=tcp to-port=22 to-addr=172.16.1.8'
success

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
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

[root@web01 ~]# firewall-cmd --zone=public --add-service=http --permanent
success
[root@web01 ~]# firewall-cmd --list-all

public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

[root@web01 ~]#
[root@web01 ~]# firewall-cmd --reload
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client http
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

[root@web01 ~]# firewall-cmd --zone=public --remove-service=http --permanent
success
[root@web01 ~]# firewall-cmd --reload
success
[root@web01 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

#备份配置文件

#只保存永久添加的规则

[root@web01 ~]# ll /etc/firewalld/zones/public.xml #公共区的配置文件

[root@web01 ~]# ll /etc/firewalld/zones/ #区域的配置规则文件都在这个区中

11. Firewalld实现内部上网

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

#内网主机ip配置

[root@web02 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=172.16.1.8
NETMASK=255.255.255.0
GATEWAY=172.16.1.7

#配置dns
[root@web02 ~]# vim /etc/resolv.conf
# Generated by NetworkManager
nameserver 223.5.5.5
nameserver 223.6.6.6

#重启eth1,关闭eth0

[root@web02 ~]# ifdown eth0

[root@web02 ~]# ifdown eth1 && ifup eth1



#服务端开启地址转换

[root@web01 ~]# firewall-cmd --add-masquerade --permanent
success

[root@web01 ~]# firewall-cmd --reload
success


#测试上网

[root@web02 ~]# ping baidu.com
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=127 time=28.5 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=127 time=28.0 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=3 ttl=127 time=28.5 ms

bash的基本特性

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
3.历史命令
1)日志审计
history
-w:保存历史命令到文件中write
-d:删除历史命令中的某一条 -d 后面加数字 delete(删除)
-c:清空历史记录,clear(清除)

#历史命令保存到文件,当前用户的家目录下有一个隐藏文件:.bash_history
[root@oldboyedu ~]# history -w

#删除第5条历史记录
[root@oldboyedu ~]# history -d 5

#清空所有历史记录
[root@oldboyedu ~]# history -c
! + 命令中的前面字符:调用之前的历史命令,只能调最近执行的命令
!!:执行上一条执行过的命令
!+历史命令中的编号:调用历史命令

4.命令的别名 alias
#设置别名
[root@oldboyedu ~]# alias ls='ls --color=auto' //临时生效
#取消别名
[root@oldboyedu ~]# unalias tong
#查看别名
[root@oldboyedu ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias tong='ping baidu.com'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

5.获取命令的帮助
[root@oldboyedu ~]# ls --help
Usage: ls [选项] [文件]
ls
ls -l
ls -l /tmp

#查看目录下的文件

二.目录管理

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
[root@oldboyedu ~]# ls -1 /
[root@oldboyedu ~]# ls /bin/useradd
ls: cannot access /bin/useradd: 没有这个文件或者目录

#普通用户可执行的命令存放目录
软链接
bin -> usr/bin

#超级用户可执行的命令存放目录
sbin -> usr/sbin

#系统命令,依赖的库文件存放的目录
lib -> usr/lib
lib64 -> usr/lib64

#系统的启动项和引导菜单
boot

#系统设备目录
dev

sda :系统中的第一块磁盘
sda1 :系统中第一块磁盘的第一个分区
sda2 : 二
sda3 : 三
sdb :系统中的第二块磁盘
sdc
sdc4 :系统中第三块磁盘的第四个分区

/dev/null :类似于黑洞,垃圾回收站。
/dev/zero :源源不断的产生数据
/dev/pts/ :查看用户连接的终端数

/usr
/usr 目录 相当于windows下的 C:\Windows目录
/usr/local 软件安装目录 相当于C:\Program
/usr/bin 普通用户使用的应用程序(重要)
/usr/sbin 管理员用户使用的应用程序(重要)
/usr/lib 库文件Glibc 32bit
/usr/lib64 库文件Glibc 64bit

#系统配置文件目录
etc
/etc/hostname : 记录主机名的配置文件
/etc/hosts : 本地域名解析配置文件
/etc/resolv.conf : DNS配置文件
/etc/sysconfig/network-scripts/ifcfg-eth0 : 网卡配置文件

#普通用户的家目录
home

#光驱,挂载目录
media
mnt

#第三方厂商安装软件目录
opt

#反应系统当前进程的实时状态
proc
/proc/meminfo : 内存信息
/proc/cpuinfo : CPU信息

#超级管理员用户的家目录
root

#临时目录,类似于回收站
tmp
#可变化系统文件目录
var
/var/log/messages:系统日志
/var/log/secure:系统登录日志

l:软链接文件
d:目录
-:普通文件
c:块设备文件

Ansible-playbook 实战

1.创建基础环境

1
2
3
4
5
6
7
8
[root@m01 base]# tree /project/
/project/
├── base
│   └── base.yml
├── httpd
├── nfs
├── rsync
└── sersync

2.编辑主机清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[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

[nfs_group]
nfs ansible_ssh_host=172.16.1.31

[rsync_server:children]
web_group
backup_group

[nfs_server:children]
web_group
nfs_group

3.写初始化的playbook

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
[root@m01 base]# cat base.yml 
- hosts: all
tasks:
- 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
state: present

- name: Stop Firewalld
systemd:
name: firewalld
state: stopped
enabled: no

- name: copy yum repo
copy:
src: /etc/yum.repos.d/CentOS-Base.repo
dest: /etc/yum.repos.d/
owner: root
group: root
mode: 0644

- name: Disable SELinux
selinux:
state: disabled

4.httpd实战

1)提前准备

1
2
3
4
5
6
[root@m01 httpd]# ll
total 428
-rw-r--r-- 1 root root 11753 Sep 18 17:13 httpd.conf
-rw-r--r-- 1 root root 290 Sep 18 17:11 httpd.yml
-rw-r--r-- 1 root root 1245 Sep 18 17:12 upload_file.php
-rw-r--r-- 1 root root 413973 Mar 31 12:37 windows-hw.zip
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
[root@m01 httpd]# cat httpd.yml
- hosts: web_group
tasks:
- name: Install Httpd Server
yum:
name: "{{ pack }}"
vars:
pack:
- httpd
- php

- name: Unarchive Homework Package
unarchive:
src: ./windows-hw.zip
dest: /var/www/html
copy: yes

- name: scp upload.php file
copy:
src: ./upload_file.php
dest: /var/www/html

- name: scp httpd conf
copy:
src: ./httpd.conf
dest: /etc/httpd/conf

- name: Create upload dir
file:
path: /var/www/html/upload
state: directory
owner: www
group: www
mode: 0755

- name: Start Httpd Server
systemd:
name: httpd
state: started
enabled: yes

5.nfs实战

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
[root@m01 project]# cat  nfs/nfs.yml 
- hosts: nfs_server
tasks:
- name: Install nfs-utils
yum:
name: nfs-utils
state: present

- hosts: nfs_group
tasks:
- name: config nfs conf
copy:
content: "/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)"
dest: /etc/exports

- name: Create data dir
file:
path: /data
state: directory
owner: www
group: www
mode: 0755

- name: Start NFS
systemd:
name: nfs-server
state: started
enabled: yes

- hosts: web_group
tasks:
- name: mount data dir
mount:
path: /var/www/html/upload
src: 172.16.1.31:/data
fstype: nfs
state: mounted

6.rsync实战

1)提前准备

1
2
3
4
[root@m01 rsync]# ll
total 8
-rw-r--r-- 1 root root 336 Sep 17 04:48 rsyncd.j2
-rw-r--r-- 1 root root 939 Sep 18 17:34 rsyncd.yml
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
[root@m01 rsync]# cat rsyncd.yml 
- hosts: rsync_server
tasks:

- name: Install rsyncd Server
yum:
name: rsync
state: present

- hosts: backup_group
tasks:
- 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

- 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

- name: copy shell
copy:
src: ./backup.sh
dest: /root

- name: Add Crontab
cron:
name: "backup"
minute: "00"
hour: "01"
job: "/bin/sh /root/backup.sh &>/dev/null"

7.sersync实战

1)提前 准备

1
2
3
4
5
[root@m01 sersync]# ll
total 716
-rwxr-xr-x 1 root root 2216 Sep 18 17:47 confxml.xml
-rw-r--r-- 1 root root 727290 Aug 7 11:40 sersync2.5.4_64bit_binary_stable_final.tar.gz
-rw-r--r-- 1 root root 0 Sep 18 17:44 sersync.yml
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
[root@m01 sersync]# cat sersync.yml 
- hosts: nfs_group
tasks:
- name: Install inotify
yum:
name: {{ pack }}
vars:
pack:
- rsync
- inotify-tools

- name: Config client passwd file
copy:
content: "123"
dest: /etc/rsync.pass
owner: root
group: root
mode: 0600

- name: jieya
unarchive:
src: ./sersync2.5.4_64bit_binary_stable_final.tar.gz
creates: /usr/loca/sersync
copy: yes

- name: copy config file
copy:
src: ./confxml.xml
dest: /usr/local/GNU-Linux-x86
owner: root
group: root
mode: 0755

- name: start sersync
shell: "/usr/local/GNU-Linux-x86/sersync2 -rdo /usr/local/GNU-Linux-x86/confxml.xml"

ansible jinja2 roles

jinja2基本 语法

1
2
3
{{ EXPR }}输出变量值,会输出自定义的变量值或facts
1)playbook文件使用template模块
2)模板文件里面变量使用{{名称}},比如{{PORT}}或使用facts

逻辑判断语法

1
2
3
4
5
6
7
8
9
10
11
12
#循环表达式
{% for i in EXPR %}
{% endfor %}

#条件判断
{% if EXPR %}
{% elif EXPR %}
{% else %}
{% endif %}

#注释
{# COMMENT #}

测试jinja2

1
2
3
4
5
6
7
8
9
10
11
12
- hosts: all
tasks:
- name: scp motd
template:
src: /etc/motd
dest: /etc/motd


[root@m01 ~]# vim /etc/motd
Welcome to {{ ansible_fqdn }}
This system total mem is : {{ ansible_memtotal_mb }} MB
This system free mem is: {{ ansible_memfree_mb }} MB

ansible jinja2渲染负载均衡配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@m01 ~]# cat nginx.conf.j2 
upstream {{ domain_name }} {
{% for ip in range(1,16) %}
server 172.16.1.{{ ip }}:{{ upstream_port }};
{% endfor %}
}

server {
listen {{ server_port }};
server_name {{ domain_name }};

location / {
root {{ code_dir }};
index index.html;
proxy_pass http://{{ domain_name }};
proxy_set_header HOST $http_host;
}
}
1
2
3
4
5
6
7
8
[root@m01 ~]# cat  nginx.yml 
- hosts: all
vars_files: ./wordpress_vars.yml
tasks:
- name: configure nginx conf
template:
src: ./nginx.conf.j2
dest: /opt/{{ domain_name }}.conf
1
2
3
4
5
[root@m01 ~]# cat wordpress_vars.yml 
domain_name: www.drz.com
upstream_port: 8080
server_port: 80
code_dir: /code/wordpress

ansible jinja2 推送keepalived配置文件

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
#keepalived master 配置文件
global_defs {
router_id lb01
}

vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}


#keepalived backup配置文件
global_defs {
router_id lb02
}

vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@m01 ~]# cat keepalived.conf.j2 
global_defs {
router_id {{ ansible_fqdn }}
}

vrrp_instance VI_1 {
{% if ansible_fqdn == 'web01' %}
state MASTER
priority 150
{% else %}
state BACKUP
priority 100
{% endif %}
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
1
2
3
4
5
6
7
[root@m01 ~]# cat keep.yml 
- hosts: webs
tasks:
- name: configure keep conf
template:
src: ./keepalived.conf.j2
dest: /opt/keepalive.conf

ansible roles

roles依赖关系

1
2
3
4
5
6
7
8
dependencies: 
- { role: nginx }
- { role: php }


[root@m01 meta]# vim main.yml
dependencies:
- { role: rsync_server }
1
2
3
4
5
6
- name: xx
mysql_user:
name: rep
password: 123
priv: '*.*:replication slave'
state: present