python运维必备知识

自动化运维
1 shell语法 运行机制 常见应用
2 自动化代码发布案例

1 自动化运维:
编写shell脚本实现运维过程自动化
2 shell
1 shell概念:
命令解释器(应用程序和操作系统之间的接口)

2 shell分类
	常用:linux命令行(重点是bash)
	
3 查看当前系统shell:
	echo $SHELL
	/bin/bash
4 查看当前系统兼容性支持的其他shell版本
	cat /etc/shells
	
5 shell脚本
	命令放到文件中执行,文件就叫shell脚本
	
6 创建脚本
	1 用记事本(vim)创建脚本文件
	2 文件名要有意义,.sh结尾
	3 文件内容首行指定脚本解释器:#!/bin/bash
	4 单行注释: #开头
		多行注释: :<<字符 ... 字符  (将字符们重定向到啥都不干)
		例子:<<! !

7 脚本执行
	1 bash 脚本名(启动子进程,在子进程中执行脚本命令)
	bash a.sh
	2 ./脚本名(启动子进程(名字叫脚本名),在子进程中执行脚本命令)
	chmod 755 a.sh
	./a.sh
	3 source 脚本名(不启动子进程,直接在当前shell执行命令)
	source a.sh
	
8 开发规范
	1 不要用中午注释
	2 成对内容一次性写出
	3 适当缩进(类似python缩进风格)

9 定义变量
	普通变量:
		1 变量名=变量值 (变量值不可用有特殊字符)
		2 变量名='变量值'(变量值可以有特殊字符)
		3 变量名="变量值" (变量套变量)
		
	命令变量:
		将命令的输出作为变量值赋给变量名
		变量名=`命令`
		变量名=$(命令)
		
		命令只在定义时执行一遍
		
10 变量访问
	1 $变量名 
	2 ​ "$变量名"  (将变量值作为字符串)
	3 ${变量名} (限定变量名范围)
	4 "${变量名}"  (推荐使用)
	
	
	unset 变量名 (取消变量)
	
11 本地变量
	在哪定义,在哪访问
12 全局变量(环境变量)
	1 查看当前系统全局变量
		env
	2 定义全局变量
		1 变量名=值 
		  export 变量
			先定义后转换
		2 export 变量名=值 (二合一)
		
	3 全局变量生效范围:
		当前shell 和子shell生效(子shell继承父shell的全局变量)
		
		要想所有环境都生效:
			1 修改~/.bashrc (当前用户生效---》打开新shell或source执行后生效)
			source ~/.bashrc
			2 修改/etc/profile(所有用户都生效--》重启或者source执行)
			source /etc/profile
			
13 内置变量
	脚本相关:
		$0 脚本名
		$$ 执行脚本的进程号
		$n 第n个参数(n>=10时要加{})
		$# 参数个数
		$? 上一条指令的执行结果(0--》成功  非0----》失败,上一条指令若是脚本,代表脚本中最后一条指令的返回值)
	字符串截取:
		${变量名:起始位置:截取长度}
		(反向截取时,0-X)
		${file:0:5}       从第1个字符开始,截取5个字符
		${file:5:5}       从第6个字符开始,截取5个字符
		${file:0-6:3}     从倒数第6个字符开始,截取之后的3个字符
		
	默认值:
		${变量名:-默认值} (变量不存在则输出默认值)
		${变量名:+提示信息} (变量存在则是从提示信息)
		
14 表达式
	逻辑转化成控制
	1 测试语句
		test 条件
		[ 条件 ]  (方括号内左右各有一个空格)
		
		数值比较(比较符左右各有一个空格)
			n1 -eq n2 相等
			n1 -gt n2 大于
			n1 -ge n2 大于等于
			n1 -lt n2 小于
			n1 -le n2 小于等于
			n1 -ne n2 不等于
			
		字符串比较:
			== != (跟python相同)
			str1 == str2            str1和str2字符串内容一致
			str1 != str2            str1和str2字符串内容不一致,!表示相反的意思
			
	2 逻辑表达式
		命令1 && 命令2 (1 成功则执行2)
		示例:[ 1 = 1 ] && echo "条件成立"
	条件成立
		[ 1 = 2 ] && echo "条件成立"
		
		命令1 || 命令2 (1失败则执行2)
		示例:[ 1 = 2 ] || echo "条件不成立"
		条件不成立
		[ 1 = 1 ] || echo "条件不成立"
		
	3 文件表达式
		-f 判断是否是文件
		示例:[ -f weizhi.sh ] && echo "是一个文件"
		是一个文件
		[ -f weizhi.sddh ] || echo "不是一个文件"
		不是一个文件
		
		-d 判断是否是目录
		示例:[ -d weizhi.sddh ] || echo "不是一个目录"
		不是一个目录
		mkdir nihao
		[ -d nihao ] && echo "是一个目录"
		是一个目录
		
		-x 判断是否可执行(目录可执行)
		示例:[ -x age.sh ] || echo "文件没有执行权限"
		文件没有执行权限
		[ -x test.sh ] && echo "文件有执行权限"
		文件有执行权限
		
	4 计算表达式
		$(( 计算表达式 ))  (括号中间是计算过程)
		root@ubuntu:~# n=100
		root@ubuntu:~# echo $(($n/5))
		20
		
		let 等式		
		root@ubuntu:~# i=1
		root@ubuntu:~# let i=i+7
		root@ubuntu:~# echo $i
		8
		
15 常见符号
	1 重定向
		应用程序的输出:
			1 标准输出(正常运行时)
			2 标准错误(错误提示)
		
		">" 表示将符号左侧的内容或者输出结果,以覆盖的方式输入到右侧文件中
		">>" 符号 作用: ">>" 表示将符号左侧的内容,以追加的方式输入到右侧文件的末尾行中 查看文件内容
		
		分别重定向:
			bash 6-chongdingxiang.sh 1> res.log 2>err.log
		合并重定向:
			bash 6-chongdingxiang.sh > res.txt 2>&1(将标准错误重定向到标准输出相同的位置)
		丢弃:
			bash 6-chongdingxiang.sh > /dev/null(垃圾桶) 2>&1

	2 管道符
		 命令1 | 命令2 
		 (1 的输出作为2的输入)
		 命令演示: 查看当前系统中的全局变量SHELL
		 admin-1@ubuntu:~$ env | grep SHELL
		 
	3 后台展示符 
		命令 &  (命令放到后台运行)
		全部信息符号 2>&1 符号详解: 1 表示标准输出的信息 2 表示标准错误的信息 2>&1 代表所有输出的信息 符号示例 标准正确输出示例
		
16 常用命令
		小技巧: 精确定位错误代码 
	grep -nr [错误关键字] *
	
	1 grep   搜索文件内容
		grep -rn bash .
		在当前目录下递归所有文件(包含子目录),查找包含bash的行并显示行号
	admin-1@ubuntu:~$ cat find.txt
	nihao aaa
	nihao AAA
	NiHao bbb
	nihao CCC
	-c:只输出匹配行的计数。
	admin-1@ubuntu:~$ grep -c aaa find.txt
    1
    
	-n:显示匹配行及行号。
	admin-1@ubuntu:~$ grep -n CCC find.txt
	4:nihao CCC
	
	-v:显示不包含匹配文本的所有行。
	admin-1@ubuntu:~$ grep -v ni find.txt
	NiHao bbb


	2 find
		find . -name "*sh"
		在当前目录以及子目录中查找文件名末尾是sh的文件
	
	3 sed 文本编辑工具
		-i 代表修改原文件  命令格式:sed -i [替换格式] [文件名]
		替换
			sed "2s#sed#SED#2" sed.txt
			2(第二行)s替换#sed(原内容)#SED(替换后内容)#2(第二个找到的---》g代表全部替换)
			
		增加: 格式:sed -i '行号a\增加的内容' 文件名
			sed -i "2a\hello" sed.txt
			2(第二行)a(下边增加)\hello(待增加内容)
			sed -i "5i\world" sed.txt
			5(第5行)i(上边增加)\world(待增加内容)
		删除 格式:sed -i '行号d' 文件名
		注意:如果删除多行,可以在行号位置多写几个行号,彼此间使用逗号隔开
			sed "2(第2行)d(删除)" sed.txt			
	
	4 awk 基于行的编辑工具
		awk '{print $3,$1}' awk.txt
		(打印awk.txt文件中的第3 列和第1列(用空格分割))
		
		print 显示内容
	$0 显示当前行所有内容
	awk '{print $0}' awk.txt
	$n 显示当前行的第n列内容,如果存在多个$n,它们之间使用逗号(,)隔开
		
		内置变量:
			FILENAME  文件名
			示例:awk '{print FILENAME}' awk.txt
			NR 行号:
				awk 'NR==2 {print $3}' awk.txt
				(只对第二行进行打印操作)
				awk '{print NR}' awk.txt
			NF  列数: 输出 最后一列的内容
				awk '{print $NF}' awk.txt
				(打印最后一列)
			FS  指定分割符:
				awk 'BEGIN{FS="a"} {print $2}' awk.txt
				(用a分割每一行, 更推荐用参数:-F "a")
				awk -F "a" '{print $2}' awk.txt
			OFS  指定多个输出时的连接符
				awk 'BEGIN{OFS="->"} {print $1,$3}' awk.txt
				(打印第1列和第3列并用->连接)
				
17 分支
	1 if分支:
		if [ 条件 ]
		then
			 指令1
		elif [ 条件2 ]
		then
			指令2
		else
			指令3
		fi
		
		别忘了fi

	admin-1@ubuntu:/data/scripts/python-n# cat if.sh
	#!/bin/bash
	# 多if语句的使用场景
	if [ "$1" == "start" ]
	then
	   echo "服务启动中..."
	elif [ "$1" == "stop" ]
	then
	   echo "服务关闭中..."
	elif [ "$1" == "restart" ]
	then
	   echo "服务重启中..."
	else
	   echo "$0 脚本的使用方式: $0 [ start | stop | restart ]"
	fi
	
	2 case分支  ---》一对多的分支判断
		case 变量名 in
		   值1)
			  指令1
				 ;;(情况1的结束)
		   ...
		   值n)
			 指令n
				 ;;
			*)
				其他情况
				;;
		esac

	# cat case.sh
	#!/bin/bash
	case "$1" in
	    "start")
	        echo "starting"
	        ;;
	    "stop")
	        echo "stopping"
	        ;;
	    "restart")
	        echo "restarting"
	        ;;
	    *)
	        echo "Usage:$0 {start|stop|restart}"
	        ;;
	esac


18 循环
	for循环
		for 值 in 列表(一般用命令变量的输出)
		do
		   执行语句
		done
		
	#!/bin/bash

	for file in `ls`
	do
	    [ -f $file ] && [ -x $file ] && echo $file
	done

	while循环(跟python完全一样)
		while 条件
		do
		   执行语句
		done

	#!/bin/bash
	n=0
	while [ $n -lt 5 ]
	do
	    echo abc
	    let n=$n+1
	done

until
	until 条件
	do
	   执行语句
	done

	#!/bin/bash
	# until的示例
	a=1
	until [ "${a}" -eq 5 ]
	do
	   echo "${a}"
	   a=$((a+1))
	done

19 函数
	定义:
		函数名() {
			函数体
			$n 代表第n个函数的参数
			$0 永远都是脚本名
		}
	
	调用:
		函数名 参数1 参数2 。。。。
	返回值
		return (0~255)
		获取返回值:$?
	命令变量也适用于函数
20-shell中可执行命令的种类
	1 应用程序---》which查到信息
	2 脚本-------》 file查到文件类型
	3 函数-------》以上两条命令查不到
	
#!/bin/bash

	funca() {
	    echo "this is funca"
	    echo "this is 1st param of funca:$1"
	    echo "this is 2nd param of funca:$2"
	    echo "$0 is always name of script"
	    return 123
	}
	
	funcb() {
	    echo "this is funcb"
	}
	
	funca 123 abc
	echo $?
	a=`funcb`
	echo $a		

21 虚拟环境命令们导入方法:
	export WORKON_HOME=/root/.venv   (定义存储虚拟环境的路径)
	source /usr/local/bin/virtualenvwrapper.sh

猜你喜欢

转载自blog.csdn.net/qq_42708830/article/details/84592909
今日推荐