自动化运维的意义
对于少量的服务器,可以通过手动去管理运维,若服务器数量很多,并且处理的工作又是定时定期的重复内容,DBA则可能无法应对,此时需要一些脚本来实现某些功能。因此自动化运维可以大大提高dba的效率。自动化运维具有重要意义。
编写脚本可以通过shell或者Python等多种方式。以下简单介绍一下shell。
Shell介绍
Shell是一个命令解析器;编程语言分为低级语言和高级语言;低级语言为机器语言和汇编语言,二者都是面向机器的语言,高级语言分为静态语言和动态语言。
静态语言:是编译型语言,代码编写完成后,需要编译器将其直接转换成二进制后即可独立运行。
GCC是linux平台最常用的编译器。
Shell脚本:linux命令或者语句放在一个文件中,通过这个程序文件执行,这个文件被称为shell脚本或者shell程序。通常以.sh结尾。
#!/bin/bash:指定使用那种shell作为命令解释器,不指定,则以当前shell作为可执行的shell。
Chmod +x test.sh 赋予脚本可执行权限。
执行;若脚本在当前路径,则使用./执行,若脚本不在当前路径,可使用绝对路径执行 bin/test.sh。
Shell变量
注意点:
变量名通常是大写字母,也可以是数字、字母、下划线组成。要区分大小写,不能以数字开头;
“=”两边不能有空格出现;
调用变量使用“$”,有时候使用“${}”消除歧义。
例:echo$var4 #打印变量var4的内容
Echo${var4}db.log #打印变量var4并加上db.log 最终为var4db.log。
格式化输出:
Data+”%Y-%M-%d” #打印日期,一般备份数据要用到。
Data +%Y%m%d:显示当天的年月日
Data -d”+1 day”+%Y%m%d:显示明天的日期
Data -d”-1 day”+%Y%m%d:显示昨天的日期
显示下个月或者下一年 ,将day更换为month、year。
设定设定具体的时间:
Data -s 20180823 设置成20210202形状;
Data -s 01:01:01: 设置具体的时间;
Data -s“2018-05-21 01:01:01”设置日期和时间。
备注:%y年份只显示2位,%Y年份显示4位。
案例:echo `date` 反引号作用是把引起来的命令的执行结果交给前一个命令。
Echo $(date) #$()与反引号作用相同。
命令嵌套使用
$($()),先执行里面的在把结果交给外边的。
Shell中单引号和双引号的区别
‘’在单引号中所有的字符包括特殊字符,($、”、``、\)豆浆解释成字符本身二成为普通字符。
“”在双引号中,除$、”、``和\以外,所有的字符都解释成字符本身,拥有调用变量、引用命令、转义符的特殊含义。
“\”是转义符,更在这个之后的字符都解释成字符本身,变为普通字符。
单引号之间的内容原封不动赋值给变量,双引号之间的内容除了特殊符号会保留特殊含义。
删除变量
Unset 变量名
环境变量
Env 命令查看所有全局变量
使用export命令把局部变量输出位全局变量
例如:
Export N=alan
Echo $N
输出为alan
建立脚本vim a.sh
#!/bin/bash
Echo $N
执行脚本:bash a.sh #引用全局变量
输出为alan
让全局变量永久生效,可以将变量写入配置文件中
当启动一个ssh连接bash,一定会加载下面四个配置文件。
/etc/profile 全局环境和登录系统的一些配置
/etc/bashrc shell全局自定配置
/root/.bashrc 单独自定义某个用户的bash
/root/.bash_profile 单独自定义某个环境
Shell位置变量
$0:获取当前执行shell脚本文件的文件名;
$n;获取当前脚本的第n个参数。
特殊变量
“$*”用双引号括起来表示输出所有的参数;
$#:传递到脚本的参数个数;
$$:当前进程的PID;
$?:显示最后命令的退出状态;0表示没有错误,其他任何值表明有错误;
$!:后台运行的最后一个PID。
数学运算
Expr命令
数值、符号、命令之间都需要空格;
输出结果0为假,1为真。
例如:expr 2 \> 5 输出为0,表示假。
Expr 3 \* 5 输出为15
$(())在双括号中,所有变量可以不加入$符号前缀。
特殊变量
$0 这个程式的执行名字$n 这个程式的第n个参数值,n=1..9$* 这个程式的所有参数,此选项参数可超过9个。$# 这个程式的参数个数$$ 这个程式的PID(脚本运行的当前进程ID号)$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 执行上一个指令的返回值
条件测试语句和流程控制语句if的使用
Read命令用于从键盘读取变量的值,用于shell脚本与用户进行交互的场合。
Read 变量名 在键盘标准输入。
赋值多个变量 变量名以及变量值之间空格隔开。
当赋值的数量大于变量名的时候,超出来的值全部赋值给最后一个变量。 若赋值数量小于变量名,则没有赋值的全部为空。
其他用法:
Read -s passwd
将标椎输入的内容隐藏起来传递给参数。
Read -p #给出提示
Read -t 2 time #超过两秒没有输入直接退出
Read -n 2 test #最多能输入2个字符。
流程控制语句if
单分支if语句
If 条件
Then
Commands #执行命令的主体
Fi
双分支语句
If command ;then
Commands #if 为真时候执行
Else
Commands #if为假的时候执行
Fi
多分支if语句
If 条件测试操作 1 ;then
Commands #如果条件1满足,则执行
Elif 条件测试操作 2 ; then
Commands #如果条件2满足,则执行
……
Else
Commands #如果以上条件都无法满足,则执行命令主体
Fi
Test测试命令及数值比较
Shell中的test命令用于检查某个条件是否成立,可以比较数值、字符和文件。
格式:test 测试条件
数值比较
-eq 等于则为真 例如”$a” -eq “$b”
-ne 不等于则为真 例如 ”$a” -nq “$b”
-gt 大于则为真 例如 ”$a” -gt “$b”
-ge 大于等于则为真 例如 ”$a” -ge “$b”
-lt 小于则为真 例如 ”$a” -lt “$b”
-le 小于等于则为真 例如 ”$a” -le “$b”
字符串比较
参数 | 说明 | 事例 |
= | 等于则为真 | ”$a” =“$b” |
!= | 不相等则为真 | ”$a” !=“$b” |
-z 字符串 | 字符串长度为0则为真 | -z “$b” |
-n 字符串 | 字符串的长度不为空则为真 | -n “$a” |
Str1>str2 | Str1大于str2为真 | Str1 \>str2 |
Str1<str2 | Str1小于str2为真 | Str1 \<str2 |
流程控制过程中和shell中的通配符
&& 逻辑与 -a
|| 逻辑或 -o
[[...]]和[...]的区别。
[[...]]运算符是[...]运算符的扩充;[[...]]能够支持*,<、>等符号且不需要转义符。
if[[ $USER =r* ]] ; then echo "hello,$USER" ;else echo $USER not ; fi
注意:$USER=r*,对比时,r*表示以r开头的任意长度字符串,这样就包括 root。
当只有一个[ ]时。
if[$USER=r*];then echo "hello,$USER" ;else echo $USER not ; fi
#对比[[r*]],这里的[r*]仅用来表示两个字符r*。所以字符*并没有被当做通配符来执行。
Shell中的通配符
* 匹配0个或多个字符
? 匹配任意一个字符
[list] a[xyz]b:a与b之间必须且只能有一个字符,只能是list中的任意单一字符如axb、ayb、azb
[!list] 匹配除list中任意单一字符
[c1-c2] 匹配[c1-c2]中任意单一字符 如[0-9]
{string1,string2,…} 匹配这个中其一的字符串。
For ((expr1; expr2; expr3))
expr1:指定初始条件;
expr2:判断什么时候退出循环;
expr3:修改expr1的变量值。
例如:for ((i=1; i<=10; i++))
流程控制语句
Case语句
流程控制语句来实现对流程的选择、循环、转向和返回等。Case语句是控制语句的一个组成部分。
Case 变量或表达式 in
变量或表达式1)
命令序列1
;;
变量或表达式2)
命令序列2
;;
....
*)
默认命令序列
Esac
变量或者表达式的值与变量或者表达式1的值比较,若相同,则执行命令序列1,遇到双分号则跳转到esac结束,不同则变量与表达式与变量或表达式2比较以此类推,若都不同则执行*后面的默认命令序列。
实例:
编写一个启动apache的服务脚本
Vim case1.sh
#!Bin/bash
Case $1 in
Start)
Systemctl $1 httpd
Ps aux| grep httpd
Echo “httpd start”
;;
Stop)
Systemctl $1 httpd
Ps aux| grep httpd
Echo “httpd stop”
;;
Status)
Systemctl $1 httpd
;;
Restart)
Systemctl $1 httpd
Echo “httpd restart”
;;
*)
Echo “usage:$0 start|stop|restart”
Esac
For循环语句
语法结构:
For var in list
do
Commands
done
Var:变量
in:取值
List:取值列表
Commands:执行命令的主体
取值列表的值赋给变量,而后在命令处执行,当取值列表中的值赋值结束时,循环停止。
示例:
Vim test2.sh
#!/bin/bash
For var in a1 b1 c1 d1
do
Echo the text is $var
Done
自定义shell分隔符
指定单个字符作为分隔符,IFS=: 表示以“:”作为分隔符;
指定多个分隔符 IFS=’\n’:;”
While循环语句和嵌套语句
重复测试语句中的条件,只要条件成立就执行循环体对应的命令操作,知道条件不成立时停止循环。
语法
While 条件
Do
命令
Done
示例
#!/bin/bash
Var=10
Var while [ $var -gt 0 ]
Do
Echo $var
Var=$[$var-1]
Done
跳出循环
有时需要在未达到循环结束时强制跳出循环,shell提供两个命令来实现该功能,break、continue。
Break:跳出整个循环;
执行循环体之后的语句,默认是break1 break3表示跳出第三层循环。
Continue:进入下一个循环,如果后面加数字2,则表示跳出后面的2次循环。
$(命令)等同于$ ‘命令’。
Shift参数左移命令
Shift命令用于对参数进行移动。每执行一次,参数序列顺序左移一个位置,$#的值减1,用于分别处理每个参数,移出去的参数不再可用。
函数使用
函数是一个代码块,可以自定义,可以在shell任何位置使用,只要使用函数的函数名就可以。使用函数的好处是模块化、代码可读性强。
创建函数:
Function name{
Commands
}
或者name(){
Commands
}
如果一个脚本中定义了重复的函数名,以最后一个为准。
返回值
也称为状态码。返回值范围0~255,只有9表示执行成功剩下表示失败。
Exit 数字和return 数字区别。
Exit:整个脚本直接退出,返回数字。
Return:只是在函数最后一行添加,然后返回数字,只能让函数后面的的命令不执行。
默认情况下在脚本中定义的变量都是全局变量,在函数外面定义的变量函数内也可以使用。
示例:
Mysql自动化备份脚本
脚本编写思路如下。
(1)检查一下运行环境:目录是否存在;时间;权限;用户。
(2)运行要执行的命令:备份、导出数据。
(3)把命令执行过程中没有用的文件删除。
(4)弹出命令运行成功的消息。
BAKDIR=/data/backup/mysql/’date+%Y-%m-%d’
Mysqldb=alan #定义mysql数据库
Mysqlusr=root #定义mysql登录用户
Mysqlpw=123456 #定义mysql登录密码
###检查使用root用户运行
If [$UID -ne 0 ];then
Echo this script must use the root user
Sleep 2
Exit 0
Fi
###判断目录是否存在,不存在则创建
If
[ !-d $bakdir];then
Mkdir -p $bakdir
Else
Echo this is $ bakdir exists
Exit
Fi
###使用MySQLdump备份数据库
/usr/bin/mysqldump -u$mysqlpw $mysqldb>$bakdir/${mysqldb}_db.sql
Cd $bakdir;tar -cvf ${mysqldb}_db.tar.gz*.sql
###查看备份目录下以.sql结尾的文件并删除
Find $bakdir -type f -name*.sql -exec rm -rf {} \;
###如果数据库备份成功,则打印成功,并删除备份目录下面的30天以前的目录
[$? -eq 0]&& echo “this ‘date+%Y-%m-%d’mysql backup is success”
Cd /data/backup/mysql/ && find. -type d -mtime+30|xargs rm -rf
Echo “the mysql backup successfully”




