日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自动化运维Shell课堂笔记

發布時間:2024/7/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自动化运维Shell课堂笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、課程回顧
2、課程大綱
1、shell編程
開發和運維
shell基礎知識
shell變量
shell表達式
shell流程控制語句

2、代碼發布
項目周期
代碼部署的方式
代碼部署流程
服務器環境部署
手工方式部署代碼
腳本方式部署代碼




3、shell
3.1、開發和運維
3.1.1 開發
開發是什么?
崗位
項目代碼的開發
給公司帶來效益

開發會運維如何
1、技能提升
2、面試有優勢


開發人員發展規劃
開發人員 -- 開發組長 -- 開發經理 --- 更高崗位cto
技術熟練、熬死他們 ? 了解:精益管理和敏捷開發 運維、熟練精益管理和敏捷開發、devops
網絡、數據庫、存儲、虛擬化、云計算、
Docker、持續集成和持續交付
項目訪問流程
1、用戶訪問前端
2、前端轉移數據請求給web服務器
3、涉及到數據調用,和數據庫進行交互

3.1.2 運維
運維是什么
崗位

常見技術崗位:
產品、開發、測試、運維

運維的工作范圍
規劃、管理、安全、監控、告警、規范和流程、平臺、優化

團隊
項目 -- 多個團隊(應用)
團隊 多個組
多個人



自動化運維
基礎:腳本自動化
分類:
開發人員:開發語言腳本
運維人員:shell腳本


3.2 shell 基礎知識
3.2.1 shell 是什么
shell 貝殼
shell就是一個命令解釋器[重點]

3.2.2 shell 分類
基本上shell分兩大類:
圖形界面shell和命令行shell

圖形界面shell
gnome,kde

命令行shell
windows:cmd.exe
linux:bash

shell的歷史:
sh ksh csh bash[重點]
1970左右
程序設計語言

常見的linux發行版本:
ubuntu
centos
6.5-6.8 ? 7.0
redhat
debain
生產上重點:
穩定壓倒一切

shell命令執行特點:
逐行輸入命令、逐行進行確認



3.2.3 shell 腳本
shell腳本是什么
就是一堆可執行命令的組合[重點]

shell腳本開發規范
1、命名:
要有意義,后綴.sh
2、首行
是而且必須是命令解釋器
3、注釋
簡單描述腳本信息
4、執行
bash 腳本名稱
5、腳本內容
從上到下,依次執行。
6、其他
成對的符號,成對寫,避免丟失
() {} [] '' ""
流程格式:
先寫完,然后填空
縮進
僅僅是表示美觀


腳本執行方式
方式一:
bash 腳本名稱
bash test.sh
/bin/bash /data/scripts/python10/test.sh

場景:
工作中常用[*****]

方式二:
文件的路徑
示例:
/data/scripts/python10/test.sh
./test.sh

重點:
文件一定要有執行權限

場景:
工作中常用

方式三:
source 或者 .
加載

場景:
保證環境一致性

案例:
某個腳本在你自己的筆記本可以執行成功,但是在其他人機器上執行失敗,
原因就是:環境不一致

超前知識點:
命令變量的定義:
dir=`pwd`
查看變量的方式
echo $dir



注釋
單行注釋: #
多行注釋:
:<<!。。。!

示例:
#!/bin/bash
:<<!
腳本描述:測試命令行輸入
作者:python 13期
版本:v1.0
聯系方式:中南海
!
dir=`pwd`
echo $dir

3.2.4 shell & python


執行方式
shell腳本直接調用系統命令執行

為什么運維shell使用比例比python高
執行python --- 導入模塊 -- 模塊調用系統命令 --- 執行

調用系統命令情況下,
shell效率比python高

對比

shell 殺豬刀 干凈利索
python 導彈 需要模塊幫助、實現功能多、


3.3 shell 變量
3.2.1 shell變量是什么
變量:
存儲動態值的一個抽象概念

變量包括兩部分:
變量名 不變的
變量值 變化的


變量之歌:
星星還是那個星星

變量名 星星
變量值 時間

散文 形散而神不散
變量名
變量值 形式

我的角色
變量名
變量值 角色


3.2.2 常見變量


本地變量
在本地有效

全局變量
在當前系統下,所有環境都有效

內置變量
bash中內置了很多變量,我們可以直接拿過來使用


3.2.3 本地變量
普通變量:
方式一:
變量名=變量值
重點:
變量值必須是一個整體,中間么有特殊字符

方式二:
變量名='變量值'
重點:
我看到的內容,我就輸出什么內容

方式三:
變量名="變量值"
重點:
如果變量值范圍內,有可以解析的變量A,那么首先解析變量A,將A的結果和其他內容組合成一個整體,重新賦值給變量B

示例:
# echo $hello


# hello=nihao
# echo $hello
nihao
# hello1=nihao 666
666: command not found
# hello1="nihao 666"
# echo $hello1
nihao 666
# hello2='nihao 777'
# echo $hello2
nihao 777
# echo $hello
nihao
# hello3='nihao 666-$hello'
# echo $hello3
nihao 666-$hello
# hello4="nihao 666-$hello"
# echo $hello4
nihao 666-nihao


命令變量
變量名=`命令`
變量名=$(命令)

執行流程:
1、執行命令
2、將命令執行后的結果,賦值給新的變量名A



變量的查看:


方式一:
$變量名
場景:
私下里,在命令行/腳本中使用
圖省事
方式二:
${變量名}
場景:
echo " dsa ?dsafsa ?dsafsa ${變量名} f "

方式三:
"${變量名}"
場景:
標準使用方式,




3.3.4 全局變量
定義方式:
方式一:
1、首先定義一個本地變量
2、使用export聲明這個本地變量為全局變量
示例:
root@admina-virtual-machine:/data/scripts/python10# hello5=qiang666
root@admina-virtual-machine:/data/scripts/python10# export hello5=qiang666
root@admina-virtual-machine:/data/scripts/python10# env | grep hello
hello=nihao
hello5=qiang666
hello1=nihao 666



方式二:
我定義本地變量的同時,使用export聲明本地變量為全局變量

示例:
root@admina-virtual-machine:/data/scripts/python10# export hello5=qiang666
root@admina-virtual-machine:/data/scripts/python10# env | grep hello
hello=nihao
hello5=qiang666
hello1=nihao 666


全局變量查看方式
查看方式:
env
set
declare



刪除變量
格式:
unset 變量名

示例:
root@admina-virtual-machine:/data/scripts/python10# env | grep hello
hello=nihao
hello5=qiang666
hello1=nihao 666
root@admina-virtual-machine:/data/scripts/python10# unset hello
root@admina-virtual-machine:/data/scripts/python10# unset hello1
root@admina-virtual-machine:/data/scripts/python10# unset hello2
root@admina-virtual-machine:/data/scripts/python10# unset hello3
root@admina-virtual-machine:/data/scripts/python10# unset hello4
root@admina-virtual-machine:/data/scripts/python10# unset hello5
root@admina-virtual-machine:/data/scripts/python10# env | grep hello
root@admina-virtual-machine:/data/scripts/python10# echo $hello2


root@admina-virtual-machine:/data/scripts/python10# echo $hello3


root@admina-virtual-machine:/data/scripts/python10# echo $hello4


3.3.5 內置變量
跟腳本文件有關系的變量
$0 獲取腳本的名稱
示例:
root@admina-virtual-machine:/data/scripts/python10# bash file1.sh?
我腳本的名稱是: file.sh
我腳本的名稱是:file1.sh
root@admina-virtual-machine:/data/scripts/python10# cat file1.sh?
#!/bin/bash
# 獲取腳本的名稱
echo "我腳本的名稱是: file.sh"
echo "我腳本的名稱是:$0"
場景:
獲取當前腳本的使用方式
root@admina-virtual-machine:/data/scripts/python10# bash file1.sh?
file1.sh 腳本的使用方法:file1.sh ?[ arg1 | arg2 ]
root@admina-virtual-machine:/data/scripts/python10# cat file1.sh?
#!/bin/bash
# 獲取腳本的名稱
echo "$0 腳本的使用方法:$0 ?[ arg1 | arg2 ]"


$# 獲取當前腳本傳入參數的數量
示例:
root@admina-virtual-machine:/data/scripts/python10# cat num.sh?
#!/bin/bash
# 獲取當前腳本傳入的參數數量
echo "當前腳本傳入的參數數量是: $#"
root@admina-virtual-machine:/data/scripts/python10# bash num.sh?
當前腳本傳入的參數數量是: 0
root@admina-virtual-machine:/data/scripts/python10# bash num.sh a
當前腳本傳入的參數數量是: 1
root@admina-virtual-machine:/data/scripts/python10# bash num.sh a dsanfdsn dsa f ds f ds af dsa f dsa f dsa f ds fds ?fds af ds ?fds ?fds ?fds f sa f ds af ds af dsa ?sd f dsa ?fd
當前腳本傳入的參數數量是: 34


場景:
判斷我輸入的參數數量是否是我要求的個數


需求:
我的腳本只允許傳入兩個參數,如果輸入參數不對,那么輸出腳本的執行幫助

root@admina-virtual-machine:/data/scripts/python10# cat num1.sh?
#!/bin/bash
# 判斷傳入參數數量
[ "$#" -eq 2 ] && echo "$0 開始執行..."
[ "$#" -eq 2 ] || echo "$0 幫助: $0 [ arg1 ]"
root@admina-virtual-machine:/data/scripts/python10# bash num1.sh?
num1.sh 幫助: num1.sh [ arg1 ]
root@admina-virtual-machine:/data/scripts/python10# bash num1.sh 2
num1.sh 幫助: num1.sh [ arg1 ]
root@admina-virtual-machine:/data/scripts/python10# bash num1.sh 2 2
num1.sh 開始執行...




$n 獲取當前腳本傳入的第n個位置的參數
示例:
root@admina-virtual-machine:/data/scripts/python10# cat weizhi.sh?
#!/bin/bash
# 獲取指定位置的參數
echo "第一個位置的參數是: $1"
echo "第二個位置的參數是: $2"
echo "第三個位置的參數是: $3"
echo "第四個位置的參數是: $4"
root@admina-virtual-machine:/data/scripts/python10# bash weizhi.sh 1
第一個位置的參數是: 1
第二個位置的參數是:?
第三個位置的參數是:?
第四個位置的參數是:?
root@admina-virtual-machine:/data/scripts/python10# bash weizhi.sh 1 2 3 4
第一個位置的參數是: 1
第二個位置的參數是: 2
第三個位置的參數是: 3
第四個位置的參數是: 4


場景:
1、腳本同時傳入多個參數
2、腳本中有不同的函數專門調用不同位置的傳參

執行腳本的方式:
bash 腳本名 ?arg1 ?arg2

腳本的內容:
函數1 $1
函數2 $2


$? 獲取文件執行或者命令執行的返回狀態值
示例:
root@admina-virtual-machine:/data/scripts/python10# bash nihao
bash: nihao: No such file or directory
root@admina-virtual-machine:/data/scripts/python10# echo $?
127
root@admina-virtual-machine:/data/scripts/python10# ls
file1.sh ?num.sh ?test.sh ?weizhi.sh
root@admina-virtual-machine:/data/scripts/python10# echo $?
0
root@admina-virtual-machine:/data/scripts/python10# llllllll
llllllll: command not found
root@admina-virtual-machine:/data/scripts/python10# echo $?
127

場景:
root@admina-virtual-machine:/data/scripts/python10# bash zhuangtai.sh?
執行返回狀態值是 0
/data/scripts/python10
執行返回狀態值是 0
當前dir位置是 /data/scripts/python10
執行返回狀態值是 0
root@admina-virtual-machine:/data/scripts/python10# cat zhuangtai.sh?
#!/bin/bash
# 文件執行返回狀態值演示
cd /data/scripts/python10
echo "執行返回狀態值是 $?"
pwd
echo "執行返回狀態值是 $?"
./test.sh
echo "執行返回狀態值是 $?"




獲取隨機字符串
場景
創建一個用戶,密碼是隨機生成

生成隨機數
$RANDOM 生成隨機的5位數以內的數字

示例:
root@admina-virtual-machine:/data/scripts/python10# echo $RANDOM
18061
root@admina-virtual-machine:/data/scripts/python10# echo $RANDOM | md5sum
27e8fda6333d9716503ff007cbd4cdb7 ?-
root@admina-virtual-machine:/data/scripts/python10# echo $RANDOM | md5sum | awk '{print $1}'
3a8d2e3493d99151f43b68df8ab09fdc
root@admina-virtual-machine:/data/scripts/python10# str=$(echo $RANDOM | md5sum | awk '{print $1}')
root@admina-virtual-machine:/data/scripts/python10# echo $str
e111ef894a8fd92979c4331386901381



字符串相關的內置變量
截取
${變量名:起始位置:截取長度}

示例:從頭截取8個字符
root@admina-virtual-machine:/data/scripts/python10# echo $str
e111ef894a8fd92979c4331386901381
root@admina-virtual-machine:/data/scripts/python10# echo ${str:0:8}
e111ef89

示例:從第5個位置開始,截取8個字符
root@admina-virtual-machine:/data/scripts/python10# echo ${str:4:8}
ef894a8f


示例:從末尾截取8個字符
root@admina-virtual-machine:/data/scripts/python10# echo ${str: -8}
86901381
root@admina-virtual-machine:/data/scripts/python10# echo ${str:0-8}
86901381
注意:
${str: -8}
${str:0-8}

只有一個冒號,空格或者0?


默認值
場景一:
變量a如果有內容,那么就輸出a的變量值
變量a如果沒有內容,那么就輸出默認的內容

格式:
${變量名:-默認值}

套餐示例:
如果我輸入的參數為空,那么輸出內容是 "您選擇的套餐是: 套餐 1"
如果我輸入的參數為n,那么輸出內容是 "您選擇的套餐是: 套餐 n"

root@admina-virtual-machine:/data/scripts/python10# cat select.sh?
#!/bin/bash
# 套餐選擇演示
a="$1"


echo "您選擇的套餐是: 套餐 ${a:-1}"
root@admina-virtual-machine:/data/scripts/python10# bash select.sh?
您選擇的套餐是: 套餐 1
root@admina-virtual-machine:/data/scripts/python10# bash select.sh 2
您選擇的套餐是: 套餐 2
root@admina-virtual-machine:/data/scripts/python10# bash select.sh 6
您選擇的套餐是: 套餐 6




場景二:
無論變量a是否有內容,都輸出默認值
格式:
${變量名+默認值}
場景示例:
不管我說國家法定結婚年齡是 多少歲,都輸出 國家法定結婚年齡(男性)是 22 歲

root@admina-virtual-machine:/data/scripts/python10# cat age.sh?
#!/bin/bash
# 默認值演示示例二
a="$1"
echo "國家法定結婚年齡(男性)是 ${a+22} 歲"
root@admina-virtual-machine:/data/scripts/python10# bash age.sh 3
國家法定結婚年齡(男性)是 22 歲
root@admina-virtual-machine:/data/scripts/python10# bash age.sh 300
國家法定結婚年齡(男性)是 22 歲



3.4 shell 表達式
3.4.1 shell驗證操作
方式一:
[ 表達式 ]

0 表示表達式成立
1 表示表達式不成立

方式二:
test 表達式

示例:
root@admina-virtual-machine:/data/scripts/python10# [ 1 = 1 ]
root@admina-virtual-machine:/data/scripts/python10# echo $?
0
root@admina-virtual-machine:/data/scripts/python10# [ 1 = 2 ]
root@admina-virtual-machine:/data/scripts/python10# echo $?
1
root@admina-virtual-machine:/data/scripts/python10# test 1 = 1
root@admina-virtual-machine:/data/scripts/python10# echo $?
0
root@admina-virtual-machine:/data/scripts/python10# test 1 = 2
root@admina-virtual-machine:/data/scripts/python10# echo $?
1


3.4.2 shell表達式
邏輯
&&
命令1 ?&& ?命令2
如果命令1執行成功,那么我才執行命令2 -- 夫唱婦隨
如果命令1執行失敗,那么命令2也不執行
示例:
root@admina-virtual-machine:/data/scripts/python10# [ 1 = 1 ] && echo "條件成立"
條件成立
root@admina-virtual-machine:/data/scripts/python10# [ 1 = 2 ] && echo "條件成立"
root@admina-virtual-machine:/data/scripts/python10#?

||
命令1 || 命令2
如果命令1執行成功,那么命令2不執行 -- 對著干
如果命令1執行失敗,那么命令2執行
示例:
root@admina-virtual-machine:/data/scripts/python10# [ 1 = 2 ] || echo "條件不成立"
條件不成立
root@admina-virtual-machine:/data/scripts/python10# [ 1 = 1 ] || echo "條件不成立"
root@admina-virtual-machine:/data/scripts/python10#?


文件

-f 判斷輸入內容是否是一個文件
示例:
root@admina-virtual-machine:/data/scripts/python10# [ -f weizhi.sh ] && echo "是一個文件"
是一個文件
root@admina-virtual-machine:/data/scripts/python10# [ -f weizhi.sddh ] || echo "不是一個文件"
不是一個文件

-d 判斷輸入內容是否是一個目錄
示例:
root@admina-virtual-machine:/data/scripts/python10# [ -d weizhi.sddh ] || echo "不是一個目錄"
不是一個目錄
root@admina-virtual-machine:/data/scripts/python10# mkdir nihao
root@admina-virtual-machine:/data/scripts/python10# ls
age.sh ?file1.sh ?nihao ?num1.sh ?num.sh ?select.sh ?test.sh ?weizhi.sh ?zhuangtai.sh
root@admina-virtual-machine:/data/scripts/python10# [ -d nihao ] && echo "是一個目錄"
是一個目錄

-x 判斷輸入內容是否可執行
示例:
root@admina-virtual-machine:/data/scripts/python10# [ -x age.sh ] || echo "文件沒有執行權限"
文件沒有執行權限
root@admina-virtual-machine:/data/scripts/python10# [ -x test.sh ] && echo "文件有執行權限"
文件有執行權限
root@admina-virtual-machine:/data/scripts/python10# [ -x test.sh ] && ./test.sh?
當前dir位置是 /data/scripts/python10

數字
-gt 大于
-lt 小于
-eq 等于
-ne 不等于

場景:
root@admina-virtual-machine:/data/scripts/python10# cat num2.sh?
#!/bin/bash
# 數字表達式 -ne使用場景
[ "$#" -ne 2 ] && echo " $0 腳本使用幫助信息: $0 [ arg1 arg2 ]"
[ "$#" -eq 2 ] && echo "$0 腳本正在執行......"
root@admina-virtual-machine:/data/scripts/python10# bash num2.sh?
num2.sh 腳本使用幫助信息: num2.sh [ arg1 arg2 ]
root@admina-virtual-machine:/data/scripts/python10# bash num2.sh 2
num2.sh 腳本使用幫助信息: num2.sh [ arg1 arg2 ]
root@admina-virtual-machine:/data/scripts/python10# bash num2.sh 2 2
num2.sh 腳本正在執行......
root@admina-virtual-machine:/data/scripts/python10# bash num2.sh 2 2 3
num2.sh 腳本使用幫助信息: num2.sh [ arg1 arg2 ]



字符串
== 兩側的內容是一致的
!= 兩側的內容是不一致的

使用場景:
root@admina-virtual-machine:/data/scripts/python10# cat str.sh?
#!/bin/bash
# 字符串表達式的演示
a="$1"
b="$2"


[ "${a}" == "${b}" ] && echo "您輸入的兩個參數內容是一致的"
[ "${a}" != "${b}" ] && echo "您輸入的兩個參數內容是不一致的"


root@admina-virtual-machine:/data/scripts/python10# bash str.sh abc abc
您輸入的兩個參數內容是一致的
root@admina-virtual-machine:/data/scripts/python10# bash str.sh abc abcd
您輸入的兩個參數內容是不一致的


3.5 shell 流程控制



3.5.1 簡單流程控制


選擇
python if語句格式:

python中的流程控制:

if語句:
單if語句:
if 條件:
執行語句

雙if語句:
if 條件:
執行語句
else:
執行語句2

多if語句:
if 條件1:
執行語句1
elif 條件2:
執行語句2
else:
執行語句2

shell中的if
單if語句:
格式:
if 條件
then
執行語句
fi
重點:
首行關鍵字是if
末行關鍵字是fi
場景:
單一條件,只有一個輸出


示例:
如果我輸入內容是 nan
root@admina-virtual-machine:/data/scripts/python10# bash danif.sh nan
您的性別是 男
root@admina-virtual-machine:/data/scripts/python10# cat danif.sh?
#!/bin/bash
# 單if語句的使用場景
if [ "$1" == "nan" ]
then
? echo "您的性別是 男"
fi

雙if語句:
格式:
if 條件
then
執行語句
else
執行語句2
fi

場景:
一個條件,兩種結果

示例:
root@admina-virtual-machine:/data/scripts/python10# cat shuangif.sh?
#!/bin/bash
# 單if語句的使用場景
if [ "$1" == "nan" ]
then
? echo "您的性別是 男"
else
? echo "您的性別是 女"
fi
root@admina-virtual-machine:/data/scripts/python10# bash shuangif.sh nan
您的性別是 男
root@admina-virtual-machine:/data/scripts/python10# bash shuangif.sh nv
您的性別是 女
root@admina-virtual-machine:/data/scripts/python10# bash shuangif.sh nvdsaf
您的性別是 女

多if語句:
格式:
if 條件1
then
執行語句1
elif 條件2
then
執行語句2
else
執行語句3
fi


場景:
n個條件,n+1個結果

示例:
root@admina-virtual-machine:/data/scripts/python10# cat duoif.sh?
#!/bin/bash
# 單if語句的使用場景
if [ "$1" == "nan" ]
then
? echo "您的性別是 男"
elif [ "$1" == "nv" ]
then
? echo "您的性別是 女"
else
? echo "您的性別,我不知道"
fi
root@admina-virtual-machine:/data/scripts/python10# bash duoif.sh?
您的性別,我不知道
root@admina-virtual-machine:/data/scripts/python10# bash duoif.sh nan
您的性別是 男
root@admina-virtual-machine:/data/scripts/python10# bash duoif.sh nv
您的性別是 女
root@admina-virtual-machine:/data/scripts/python10# bash duoif.sh nvdsaf
您的性別,我不知道

場景:
服務的啟動
需求:
start 啟動
stop 關閉
restart 重啟
* 腳本使用方式

root@admina-virtual-machine:/data/scripts/python10# cat if.sh?
#!/bin/bash
# 多if語句的使用場景
if [ "$1" == "start" ]
then
? echo "啟動 $0 腳本"
elif [ "$1" == "stop" ]
then
? echo "關閉 $0 腳本"
elif [ "$1" == "restart" ]
then
? echo "重啟 $0 腳本"
else
? echo "$0 腳本的使用方式: $0 [ start | stop | restart ]"
fi
root@admina-virtual-machine:/data/scripts/python10# bash if.sh?
if.sh 腳本的使用方式: if.sh [ start | stop | restart ]
root@admina-virtual-machine:/data/scripts/python10# bash if.sh start
啟動 if.sh 腳本
root@admina-virtual-machine:/data/scripts/python10# bash if.sh stop
關閉 if.sh 腳本
root@admina-virtual-machine:/data/scripts/python10# bash if.sh restart
重啟 if.sh 腳本

case語句
格式:
case 值 in
值1)
執行語句
;;
值1)
執行語句
;;
值1)
執行語句
;;
值1)
執行語句
;;
esac



場景:服務啟動
root@admina-virtual-machine:/data/scripts/python10# cat case.sh?
#!/bin/bash
# case語句使用場景
case "$1" in
"start")
echo "啟動 $0 腳本"
;;
"stop")
echo "關閉 $0 腳本"
;;
"restart")
echo "重啟 $0 腳本"
;;
*)
echo "$0 腳本的使用方式: $0 [ start | stop | restart ]"
;;
esac
root@admina-virtual-machine:/data/scripts/python10# bash case.sh?
case.sh 腳本的使用方式: case.sh [ start | stop | restart ]
root@admina-virtual-machine:/data/scripts/python10# bash case.sh start
啟動 case.sh 腳本
root@admina-virtual-machine:/data/scripts/python10# bash case.sh stop
關閉 case.sh 腳本
root@admina-virtual-machine:/data/scripts/python10# bash case.sh restart
重啟 case.sh 腳本




循環
python格式:
for語句:
for 條件:
執行語句
while語句:
while 條件:
執行語句

until語句:
until 條件:
執行語句

shell的格式:
for 語句:
格式;
for 條件
do
執行語句
done

場景:
遍歷列表

示例:遍歷文件
root@admina-virtual-machine:/data/scripts/python10# ls
age.sh ? danif.sh ?file1.sh ?nihao ? ?num2.sh ?select.sh ? ?str.sh ? weizhi.sh
case.sh ?duoif.sh ?if.sh ? ? num1.sh ?num.sh ? shuangif.sh ?test.sh ?zhuangtai.sh

root@admina-virtual-machine:/data/scripts/python10# cat for.sh?
#!/bin/bash
# for語句的使用示例
file=`ls /data/scripts/python10`
for i in "${file}"
do
?echo "${i}"
done
root@admina-virtual-machine:/data/scripts/python10# bash for.sh?
age.sh
case.sh
danif.sh
duoif.sh
file1.sh
for.sh
if.sh
...


示例2:遍歷數字
root@admina-virtual-machine:/data/scripts/python10# cat for1.sh?
#!/bin/bash
# for 語句示例2
num=$(seq 10)
for i in "${num}"
do
?echo "${i}"
done
root@admina-virtual-machine:/data/scripts/python10# bash for1.sh?
1
2
3
4
5
6
7
8
9
10

shell中的計算方法:
格式;
let 變量名a=變量名a+1
a=$((變量名a+1))

示例:
root@admina-virtual-machine:/data/scripts/python10# echo $a


root@admina-virtual-machine:/data/scripts/python10# a=1
root@admina-virtual-machine:/data/scripts/python10# let a=a+1
root@admina-virtual-machine:/data/scripts/python10# echo $a
2
root@admina-virtual-machine:/data/scripts/python10# a=$((a+1))
root@admina-virtual-machine:/data/scripts/python10# echo $a
3



while 語句:
格式;
while 條件
do
執行語句
done

場景:
如果條件滿足,那么我一直循環下去

示例:
root@admina-virtual-machine:/data/scripts/python10# cat while.sh?
#!/bin/bash
# while的示例
a=1
while [ "${a}" -lt 5 ]?
do
? echo "${a}"
? a=$((a+1))
done
root@admina-virtual-machine:/data/scripts/python10# bash while.sh?
1
2
3
4



until 語句:
格式;
until 條件
do
執行語句
done

場景:
如果條件不滿足,那么我一直循環下去


示例:
root@admina-virtual-machine:/data/scripts/python10# cat until.sh?
#!/bin/bash
# until的示例
a=1
until [ "${a}" -gt 4 ]?
do
? echo "${a}"
? a=$((a+1))
done
root@admina-virtual-machine:/data/scripts/python10# bash until.sh?
1
2
3
4

3.5.2 復雜流程控制
python的函數
定義函數:
def 函數名():
函數體
調用
函數名()

傳參數
def 函數名(參數):
函數體


調用傳參數
函數名(參數)

shell函數格式:
定義函數:
函數名(){
函數體
}

調用函數:
函數名

傳參數
函數名 參數

函數體調用參數:
函數名(){
函數體 $n
}
注意:
類似于shell內置變量中的位置參數

定義和調用函數示例:
root@admina-virtual-machine:/data/scripts/python10# bash fun2.sh?
wo de mingzi shi ?111
root@admina-virtual-machine:/data/scripts/python10# cat fun2.sh?
#!/bin/bash
# 函數使用場景一:執行頻繁的命令
dayin(){
?echo "wo de mingzi shi ?111"
}
dayin

函數傳參和函數體內調用參數的示例
root@admina-virtual-machine:/data/scripts/python10# bash fun4.sh?
wo de mingzi shi 111
root@admina-virtual-machine:/data/scripts/python10# cat fun4.sh?
#!/bin/bash
# 函數的使用場景二
dayin(){
?echo "wo de mingzi shi $1"
}
dayin 111

函數使用場景:
執行頻繁的命令
或者
執行命令格式相近的命令

場景一:執行頻繁的命令
root@admina-virtual-machine:/data/scripts/python10# bash fun1.sh?
wo de mingzi shi ?111
wo de mingzi shi ?111
wo de mingzi shi ?111
wo de mingzi shi ?111
wo de mingzi shi ?111
wo de mingzi shi ?111
wo de mingzi shi ?111
wo de mingzi shi ?111
wo de mingzi shi ?111
wo de mingzi shi ?111
root@admina-virtual-machine:/data/scripts/python10# cat fun1.sh?
#!/bin/bash
# 輸出一大堆執行頻繁的命令
echo "wo de mingzi shi ?111"
echo "wo de mingzi shi ?111"
echo "wo de mingzi shi ?111"
echo "wo de mingzi shi ?111"
echo "wo de mingzi shi ?111"
echo "wo de mingzi shi ?111"
echo "wo de mingzi shi ?111"
echo "wo de mingzi shi ?111"
echo "wo de mingzi shi ?111"
echo "wo de mingzi shi ?111"
函數演變一下
root@admina-virtual-machine:/data/scripts/python10# cat fun2.sh?
#!/bin/bash
# 函數使用場景一:執行頻繁的命令
dayin(){
?echo "wo de mingzi shi ?111"
}
dayin
dayin
dayin
dayin
dayin
dayin
root@admina-virtual-machine:/data/scripts/python10# bash fun2.sh?
wo de mingzi shi ?111
wo de mingzi shi ?111
wo de mingzi shi ?111
wo de mingzi shi ?111
wo de mingzi shi ?111
wo de mingzi shi ?111

場景二;執行命令格式相近的命令
root@admina-virtual-machine:/data/scripts/python10# cat fun3.sh?
#!/bin/bash
# 輸出格式相近的命令
echo "wo de mingzi shi ?1a11"
echo "wo de mingzi shi ?11d1"
echo "wo de mingzi shi ?111d"
echo "wo de mingzi shi ?111s"
echo "wo de mingzi shi ?111a"
echo "wo de mingzi shi ?111s"
echo "wo de mingzi shi ?111s"
echo "wo de mingzi shi ?111d"
echo "wo de mingzi shi ?111f"
echo "wo de mingzi shi ?111e"
root@admina-virtual-machine:/data/scripts/python10# bash fun3.sh?
wo de mingzi shi ?1a11
wo de mingzi shi ?11d1
wo de mingzi shi ?111d
wo de mingzi shi ?111s
wo de mingzi shi ?111a
wo de mingzi shi ?111s
wo de mingzi shi ?111s
wo de mingzi shi ?111d
wo de mingzi shi ?111f
wo de mingzi shi ?111e

函數演變
root@admina-virtual-machine:/data/scripts/python10# cat fun4.sh?
#!/bin/bash
# 函數的使用場景二
dayin(){
?echo "wo de mingzi shi $1"
}
dayin 111
root@admina-virtual-machine:/data/scripts/python10# vim fun4.sh?
root@admina-virtual-machine:/data/scripts/python10# bash fun4.sh?
wo de mingzi shi 111
wo de mingzi shi 111s
wo de mingzi shi 111d
wo de mingzi shi 111g
wo de mingzi shi 111d
root@admina-virtual-machine:/data/scripts/python10# cat fun4.sh?
#!/bin/bash
# 函數的使用場景二
dayin(){
?echo "wo de mingzi shi $1"
}
dayin 111
dayin 111s
dayin 111d
dayin 111g
dayin 111d

函數傳參多個,函數體內調用示例
root@admina-virtual-machine:/data/scripts/python10# bash fun4.sh?
wo de mingzi shi 111
wo de mingzi shi df
wo de mingzi shi dfs
root@admina-virtual-machine:/data/scripts/python10# cat fun4.sh?
#!/bin/bash
# 函數的使用場景二
dayin(){
?echo "wo de mingzi shi $1"
?echo "wo de mingzi shi $2"
?echo "wo de mingzi shi $3"
}
dayin 111 df dfs


1、項目周期
1.1 項目周期
需求:
開發
開發經理拆分項目
1、人員
2、技術水平

組員:
項目的子模塊

項目交給測試之前,需要項目的聯調后,聯調的時候,需要開發團隊都在一起

測試
部署
運營

1.2 項目開發環境
個人開發環境
個人筆記本
公司配的電腦

特點:
環境是自己配的,團隊中不同的個人開發環境可以不一樣
代碼版本、軟件版本、工具....

工作內容:
項目的子模塊,子功能

工作人員:
自己

最終目的:
領導安排的內容,完成
項目的子模塊開發完成

公司開發環境
公司內部的服務器,
特點:
服務器環境和線上的服務器環境完全一致

工作內容:
項目子模塊間的功能聯調

工作人員
開發團隊所有人

最終目的:
項目開發完成
項目調試完成


測試環境:
公司內部的服務器,
特點:
服務器環境和線上的服務器環境完全一致

工作內容:
找茬

工作人員
測試團隊

最終目的:
保證項目功能完備


預發布環境:
公司線上服務器組中的一臺,
特點:
服務器環境和線上的服務器環境完全一致

工作內容:
1、支付類型的特殊功能
2、數據壓力測試
3、其他安全措施

工作人員
運維團隊

最終目的:
保證項目功能完備


線上環境
公司線上服務器組


工作內容:
代碼部署

工作人員
運維團隊

最終目的:
保證項目功能完備



2、代碼發布
2.1 什么是部署
部署什么?
代碼 經過測試,功能完善,沒有問題的代碼
部署到哪里?
服務器 所有人都能訪問的到的一臺服務器(有公網IP)
阿里云、亞馬遜、騰訊云、華為云、....
部署的效果
web網頁對外展示


2.2 部署方式
手工發布代碼 步行

干擾因素多
不安全

腳本發布代碼 坐車

干擾因素少
安全




2.3 部署流程
獲取代碼

代碼倉庫
集中式的
svn
分布式的
git

公司的代碼倉庫:
私有倉庫 gitlab
內部服務器。或者公網服務器

倉庫權限
只有項目的開發人員才有權限,項目之外的人沒有權限

代碼權限:
開發、管理、查看

提交的方式:
代碼版本號

打包代碼:
目的:
減少傳輸文件數量
減小傳輸文件大小
增強傳輸速率

常見打包方式:
windows:
zip、rar...
linux:
tar、zip...

傳輸代碼
傳輸方式:
有網情況下
git
ftp
scp
共享掛載 cp
rsync

沒有網情況下
物理方式?
U盤或者硬盤


傳輸工具演示:
格式:
scp ?要傳輸的文件 要放置的位置

將本地文件推送到遠程主機
scp python10.tar.gz root@192.168.56.12:/root/
遠程連接的用戶@遠程主機:遠程主機的位置
將遠程主機的文件拉取到本地
scp root@192.168.56.12:/root/python10.tar.gz ./



主機間免秘鑰認證
1、生成秘鑰對
ssh-keygen -t rsa
-t 指定秘鑰的類型 ?
rsa 秘鑰類型

秘鑰目錄:/root/.ssh/
私鑰 id_rsa 鑰匙
公鑰 id_rsa.pub


2、編輯認證文件
root@admina-virtual-machine:~/.ssh# cat /root/.ssh/authorized_keys?
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDdC36zf/x+K8BQx582r+uYx78NC6s24PljsnpL6mELJkcXEVvIQ49lWpeJJm58F9j73J3h342WeaW50HzkxvcZGOqdx/pOp6tphkqlIe3utnJlRYvhSmULGFMBC1C0dNWcU/igK28XYBe3Rwhzh43vb5cc2jh90Ef2iQTny2RzjT11B2pro02wGGdcPKRHQkVfHdCkPa1iFsL2YHuYDr8XPMCcfbLfNUUSugGq2VoqpmjdR+G1xXgoHnAucFUMwHVTeGXEDiqFd56fPeEHQ9cSeVAFiQeqKeiNLvjQ0LJCgIy4TEx1DTc//3ND9TQbCA6NZJt4zgNc19jqAdT/PVp root@admina-virtual-machine
注意:
認證文件內容和56.11機器的公鑰文件內容一致
保證文件內容是一整行

3、編輯ssh配置文件
root@admina-virtual-machine:~/.ssh# cat /etc/ssh/sshd_config
...
AuthorizedKeysFile %h/.ssh/authorized_keys
注意:
直接取消該行的注釋即可

4、配置文件生效
重啟ssh服務
/etc/init.d/ssh restart

5、驗證操作
ssh root@192.168.56.12


1和5是在56.11上操作
2-4是在56.12上操作

關閉應用
開啟什么應用,就關閉什么應用

解壓代碼:
tar xf ...

放置代碼
備份原文件
cp nihao nihao-`date +%Y%m%d%H%M%S`


放置新文件


注意:
兩個文件的名稱是一樣的,只是內容不同
對整個應用項目來說,兩個文件沒有區別

時間戳效果:
年月日時分秒:date +%Y%m%d%H%M%S

年月日:date +%Y%m%d
時分秒:date +%H%M%S




時間戳生成示例:
root@admina-virtual-machine:~/.ssh# date +%D
09/28/17
root@admina-virtual-machine:~/.ssh# date +%F
2017-09-28
root@admina-virtual-machine:~/.ssh# date +%Y%m%d
20170928
root@admina-virtual-machine:~/.ssh# date +%T
03:06:30
root@admina-virtual-machine:~/.ssh# date +%H%M%S
030643
root@admina-virtual-machine:~/.ssh# date +%Y%m%d%H%M%S
20170928030742


開啟應用
關閉什么應用就開啟什么應用

檢查
查看瀏覽器效果

ok


3、環境部署
3.1 準備工作
創建基本目錄
root@admina-virtual-machine:/data# mkdir /data/{server,logs,backup,soft,virtual}
root@admina-virtual-machine:/data# ls /data/
backup ?logs ?scripts ?server ?soft ?virtual
root@admina-virtual-machine:/data# mkdir /data/codes
查看
root@admina-virtual-machine:/data# tree -L 1 /data/?
/data/
├── backup 備份
├── codes 代碼
├── logs 日志
├── scripts 腳本
├── server 服務
├── soft 軟件
└── virtual 虛擬環境
3.2 項目分析
需求:
部署一個環境,支持我們的django項目正常運行

分析:

2、python環境 ---> ?3、python虛擬環境
1、django環境部署
4、django軟件安裝
5、項目基本操作
6、應用基本操作
7、view和url配置
8、問題:只有本機能訪問
9、方案代理---- 10、nginx
11、nginx實現代理
13、pcre軟件安裝
12、nginx軟件安裝
14、nginx基本操作
15、nginx代理的配置
16、目錄結構
17、查看配置文件
18、找到對應的代理配置項
19、啟動django
20、啟動nginx
21、整個項目調試


3.2 python虛擬環境
3.2.1 軟件安裝
apt-get install python-virtualenv -y

3.2.2 虛擬環境基本操作
創建?
virtualenv -p /usr/bin/python2.7 venv
進入
source venv/bin/activate
退出
deactivate
刪除
rm -rf venv


3.3 django環境部署
3.3.1 django軟件安裝
解壓
cd /data/soft
tar xf Django。。。
查看
cd Django...
cat INSTALL or README
安裝
python setup.py install

python類型軟件的安裝流程
普通:
解壓 ? 安裝
特殊:
解壓 ? ?編譯 安裝

編譯:python setup.py build



3.3.2 django項目操作
創建
django-admin startproject hello






3.3.3 django應用操作
創建應用
python manager.py startapp test1
注冊應用
hello/settings.py

INSTALL_APP = [
。。。
'test1',
]




3.3.4 view和url配置
view 配置文件生效
root@admina-virtual-machine:/data/soft# cat /data/server/hello/test1/views.py
from django.shortcuts import render
from django.http import HttpResponse


# Create your views here.


def hello(resquest):
? return HttpResponse("hello V1.0")


url文件配置
root@admina-virtual-machine:/data/soft# cat /data/server/hello/hello/urls.py
"""hello URL Configuration


The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.10/topics/http/urls/
Examples:
Function views
1. Add an import: ?from my_app import views
2. Add a URL to urlpatterns: ?url(r'^$', views.home, name='home')
Class-based views
1. Add an import: ?from other_app.views import Home
2. Add a URL to urlpatterns: ?url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: ?url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from test1.views import *


urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello/$', hello),
]


啟動服務:
cd /data/server/hello
python ?manager.py runserver



啟動django
python manage.py runserver >> /dev/null 2>&1 &
關閉:
ps aux | grep python
kill 56491

問題:
django項目只能在本機查看

方案:
nginx、haproxy

優中選優
簡單


3.4 nginx環境部署
3.4.1 pcre軟件安裝
解壓
tar xf pcre...
查看幫助
cd pcre。。。
INSTALL 或者 README

配置
./configure

編譯
make

安裝
make install

linux中軟件安裝的一般流程
解壓
tar
解壓文件,獲取真正的配置文件
配置
configure
根據默認的配置項或者更改配置項,生成編譯配置文件(Makefile)
編譯
make
根據 Makefile 內容,編譯生成指定的軟件所需要的所有文件
安裝
make install
將編譯生成的所有文件,轉移到軟件指定安裝的目錄下面
--prefix


3.4.2 nginx軟件安裝
解壓
cd /data/soft/
tar xf nginx-1.10.2.tar.gz
配置
cd nginx-1.10.2/
./configure --prefix=/data/server/nginx --without-http_gzip_module

編譯
make
安裝
make install


3.4.3 nginx簡單操作


檢查
./sbin/nginx -t
開啟
./sbin/nginx
關閉
./sbin/nginx -s stop

重載
./sbin/nginx -s reload



突發問題:
root@admina-virtual-machine:/data/server/nginx# ./sbin/nginx -t
./sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory


分析:
1、先看報錯
2、思考,是否報錯真實有效
分析: 誰錯了

3、查找文件
全名找不到,我們使用正則
4、找到文件,我沒有問題
nginx默認找庫文件的路徑有問題
5、解決



3.4.4 nginx代理django項目
nginx的目錄結構
root@admina-virtual-machine:/data/server/nginx# tree -L 2 /data/server/nginx/
/data/server/nginx/
├── ...
├── conf 配置文件目錄
│ ? ...
│ ? ├── nginx.conf 默認的配置文件
│ ? ...
├── ...
├── html 網頁文件
│ ? ├── 50x.html
│ ? └── index.html
├── logs 日志目錄
│ ? ├── access.log
│ ? └── error.log
├── ...
├── sbin 執行文件目錄
│ ? └── nginx
├── ...

nginx配置文件介紹
全局配置段
http配置段
server配置段 項目或者應用
location配置段 url配置



需求:
127.0.0.1:8000/hello/


代理配置項
#location ~ \.php$ {
# ? ?proxy_pass ? http://127.0.0.1;
#}


編輯配置文件實現代理功能
配置內容
62: location /hello/ {
63: proxy_pass http://127.0.0.1:8000;
64: }

標準配置文件
root@admina-virtual-machine:/data/server/nginx# egrep -vn '#|^$' conf/nginx.conf
3:worker_processes ?1;
12:events {
13: ? ?worker_connections ?1024;
14:}
17:http {
18: ? ?include ? ? ? mime.types;
19: ? ?default_type ?application/octet-stream;
27: ? ?sendfile ? ? ? ?on;
31: ? ?keepalive_timeout ?65;
35: ? ?server {
36: ? ? ? ?listen ? ? ? 80;
37: ? ? ? ?server_name ?localhost;
43: ? ? ? ?location / {
44: ? ? ? ? ? ?root ? html;
45: ? ? ? ? ? ?index ?index.html index.htm;
46: ? ? ? ?}
52: ? ? ? ?error_page ? 500 502 503 504 ?/50x.html;
53: ? ? ? ?location = /50x.html {
54: ? ? ? ? ? ?root ? html;
55: ? ? ? ?}
62: location /hello/ {
63: proxy_pass http://127.0.0.1:8000;
64: }
81: ? ?}
119:}

配置文件生效

3.5 調試


4、手工發布代碼
需求:
手工方式部署代碼
線上主機:56.11
代碼倉庫:56.12

方案:
獲取代碼
打包代碼
傳輸代碼
關閉應用
解壓代碼
放置代碼
備份老文件
放置新文件
開啟應用
檢查


實踐
獲取代碼
sed -i 's#1.0#1.1#' django/views.py?
sed -i 's#原內容#替換后內容#g' 文件
分隔符:# / @?

打包代碼
tar zcf django.tar.gz django
傳輸代碼
scp root@192.168.56.12:/data/code/django.tar.gz ./
關閉應用
關閉nginx應用
/data/server/nginx/sbin/nginx -s stop

關閉django應用
根據端口查看進程號,
lsof -Pti :8000
殺死進程號
kill 56502

解壓代碼
cd /data/codes
tar xf django.tar.gz

放置代碼
備份老文件
需求:備份的格式:
文件名-時間戳
時間戳:年月日時分秒
date +%Y%m%d%H%M%S

mv /data/server/hello/test1/views.py /data/backup/views.py-`date +%Y%m%d%H%M%S`

放置新文件
cd /data/codes
mv django/views.py /data/server/hello/test1/

開啟應用
開啟django應用
source /data/virtual/venv/bin/activate
cd /data/server/hello/
python manage.py runserver >> /dev/null 2>&1
deactivate

開啟nginx應用
/data/server/nginx/sbin/nginx


檢查
netstat -tnulp | grep :80


5、腳本發布代碼
5.1 遠程腳本編寫
5.1.1 遠程命令執行
56.11 讓 56.12 執行命令
示例:
root@admina-virtual-machine:/data/server/hello# ifconfig
eth0 ? ? ?Link encap:Ethernet ?HWaddr 00:0c:29:b7:e7:b7 ?
?inet addr:192.168.56.11 ?Bcast:192.168.56.255 ?Mask:255.255.255.0
?inet6 addr: fe80::20c:29ff:feb7:e7b7/64 Scope:Link
?UP BROADCAST RUNNING MULTICAST ?MTU:1500 ?Metric:1
?RX packets:436193 errors:0 dropped:3 overruns:0 frame:0
?TX packets:232980 errors:0 dropped:0 overruns:0 carrier:0
?collisions:0 txqueuelen:1000?
?RX bytes:549035735 (549.0 MB) ?TX bytes:20894523 (20.8 MB)


lo ? ? ? ?Link encap:Local Loopback ?
?inet addr:127.0.0.1 ?Mask:255.0.0.0
?inet6 addr: ::1/128 Scope:Host
?UP LOOPBACK RUNNING ?MTU:65536 ?Metric:1
?RX packets:1630 errors:0 dropped:0 overruns:0 frame:0
?TX packets:1630 errors:0 dropped:0 overruns:0 carrier:0
?collisions:0 txqueuelen:1?
?RX bytes:137717 (137.7 KB) ?TX bytes:137717 (137.7 KB)


root@admina-virtual-machine:/data/server/hello# ssh root@192.168.56.12 "ifconfig"
eth0 ? ? ?Link encap:Ethernet ?HWaddr 00:0c:29:f7:ca:d4 ?
?inet addr:192.168.56.12 ?Bcast:192.168.56.255 ?Mask:255.255.255.0
?inet6 addr: fe80::20c:29ff:fef7:cad4/64 Scope:Link
?UP BROADCAST RUNNING MULTICAST ?MTU:1500 ?Metric:1
?RX packets:9732 errors:0 dropped:3 overruns:0 frame:0
?TX packets:6918 errors:0 dropped:0 overruns:0 carrier:0
?collisions:0 txqueuelen:1000?
?RX bytes:884755 (884.7 KB) ?TX bytes:822817 (822.8 KB)


lo ? ? ? ?Link encap:Local Loopback ?
?inet addr:127.0.0.1 ?Mask:255.0.0.0
?inet6 addr: ::1/128 Scope:Host
?UP LOOPBACK RUNNING ?MTU:65536 ?Metric:1
?RX packets:306051 errors:0 dropped:0 overruns:0 frame:0
?TX packets:306051 errors:0 dropped:0 overruns:0 carrier:0
?collisions:0 txqueuelen:1?
?RX bytes:23417793 (23.4 MB) ?TX bytes:23417793 (23.4 MB)

5.1.2 遠程腳本編寫
1、實現簡單的功能--- 簡單的命令羅列
root@admina-virtual-machine:/data/scripts# cat tar_code.sh?
#!/bin/bash
# 功能:打包代碼
# 腳本名:tar_code.sh
# 作者:python 13期全體
# 版本:V 0.1
# 聯系方式:長安街1號 太和殿旁邊 中南海1號廳


cd /data/code
[ -f django.tar.gz ] && rm -f django.tar.gz
tar zcf django.tar.gz django

2、 腳本優化之 固定內容變量化
root@admina-virtual-machine:/data/scripts# cat tar_code.sh?
#!/bin/bash
# 功能:打包代碼
# 腳本名:tar_code.sh
# 作者:python 13期全體
# 版本:V 0.2
# 聯系方式:長安街1號 太和殿旁邊 中南海1號廳


FILE='django.tar.gz'
CODE_DIR='/data/code'
CODE_PRO='django'

cd "${CODE_DIR}"
[ -f "${FILE}" ] && rm -f "${FILE}"
tar zcf "${FILE}" "${CODE_PRO}"

3、腳本優化之 功能函數化
root@admina-virtual-machine:/data/scripts# cat tar_code.sh?
#!/bin/bash
# 功能:打包代碼
# 腳本名:tar_code.sh
# 作者:python 13期全體
# 版本:V 0.3
# 聯系方式:長安街1號 太和殿旁邊 中南海2號廳


FILE='django.tar.gz'
CODE_DIR='/data/code'
CODE_PRO='django'

code_tar(){
cd "${CODE_DIR}"
[ -f "${FILE}" ] && rm -f "${FILE}"
tar zcf "${FILE}" "${CODE_PRO}"
}
code_tar

5.2 部署腳本編寫
5.2.1 腳本框架
需求:先將腳本所設計的所有業務流程跑通

方案:
使用函數來體現

腳本實施:
#!/bin/bash
# 功能:打包代碼
# 腳本名:deploy.sh
# 作者:python 13期全體
# 版本:V 0.1
# 聯系方式:長安街1號 太和殿旁邊 國務院1號廳


# 打包代碼
tar_code(){
echo "打包代碼"
}


# 傳輸代碼
scp_code(){
echo "傳輸代碼"
}


# 關閉應用
serv_stop(){
echo "關閉nginx應用"
echo "關閉django應用"
}


# 解壓代碼
untar_code(){
echo "解壓代碼"
}


# 放置代碼
fangzhi_code(){
echo "放置代碼"
}


# 開啟應用
serv_star(){
echo "開啟django應用"
echo "開啟nginx應用"
}


# 檢查
check(){
echo "檢查"
}


main(){
tar_code
scp_code
serv_stop
untar_code
fangzhi_code
serv_star
check
}


main



5.2.2 命令填空
需求:
在流程跑通的情況下,執行完整的代碼部署過程

方案:
在流程框架中,填寫執行沒有任何問題的命令

腳本實施:

#!/bin/bash
# 功能:打包代碼
# 腳本名:deploy.sh
# 作者:python 13期全體
# 版本:V 0.2
# 聯系方式:長安街1號 太和殿旁邊 國務院2號廳


# 打包代碼
tar_code(){
echo "打包代碼"
ssh root@192.168.56.12 "/bin/bash /data/scripts/tar_code.sh"
}


# 傳輸代碼
scp_code(){
echo "傳輸代碼"
cd /data/codes/
[ -f django.tar.gz ] && rm -f django.tar.gz
[ -d django ] && rm -rf django
scp root@192.168.56.12:/data/code/django.tar.gz ./
}


# 關閉應用
serv_stop(){
echo "關閉nginx應用"
/data/server/nginx/sbin/nginx -s stop
echo "關閉django應用"
kill `lsof -Pti :8000`
}


# 解壓代碼
untar_code(){
echo "解壓代碼"
cd /data/codes
tar xf django.tar.gz
}


# 放置代碼
fangzhi_code(){
echo "備份原文件"
mv /data/server/hello/test1/views.py /data/backup/views.py-`date +%Y%m%d%H%M%S`
echo "放置新文件"
mv /data/codes/django/views.py /data/server/hello/test1/
}


# 開啟應用
serv_star(){
echo "開啟django應用"
source /data/virtual/venv/bin/activate
cd /data/server/hello/
python manage.py runserver >> /dev/null 2>&1 &
deactivate
echo "開啟nginx應用"
/data/server/nginx/sbin/nginx
}


# 檢查
check(){
echo "檢查"
netstat -tnulp | grep :80
}


main(){
tar_code
scp_code
serv_stop
untar_code
fangzhi_code
serv_star
check
}


main


5.2.3 增加日志功能
需求:
1、追蹤記錄
2、數據說話

方案:
增加日志功能
1、日志文件
/data/logs/deploy.log
2、日志格式
日期 時間 腳本名稱 步驟

日期:date +%F
時間:date +%T
腳本:$0

腳本實施:
#!/bin/bash
# 功能:打包代碼
# 腳本名:deploy.sh
# 作者:python 13期全體
# 版本:V 0.3
# 聯系方式:長安街1號 太和殿旁邊 國務院3號廳


LOG_FILE='/data/logs/deploy.log'


# 增加日志功能
write_log(){
? log_date='date +%F'
? log_time='date +%T'
? buzhou="$1"
??
? echo "${log_date} ?${log_time} ?$0 ?${buzhou}" >> "${LOG_FILE}"
}


# 打包代碼
tar_code(){
echo "打包代碼"
ssh root@192.168.56.12 "/bin/bash /data/scripts/tar_code.sh"
write_log "打包代碼"
}


# 傳輸代碼
scp_code(){
echo "傳輸代碼"
cd /data/codes/
[ -f django.tar.gz ] && rm -f django.tar.gz
[ -d django ] && rm -rf django
scp root@192.168.56.12:/data/code/django.tar.gz ./
write_log "傳輸代碼"
}


# 關閉應用
serv_stop(){
echo "關閉nginx應用"
/data/server/nginx/sbin/nginx -s stop
write_log "關閉nginx應用"

echo "關閉django應用"
kill `lsof -Pti :8000`
write_log "關閉django應用"
}


# 解壓代碼
untar_code(){
echo "解壓代碼"
cd /data/codes
tar xf django.tar.gz
write_log "解壓代碼"
}


# 放置代碼
fangzhi_code(){
echo "備份原文件"
mv /data/server/hello/test1/views.py /data/backup/views.py-`date +%Y%m%d%H%M%S`
write_log "備份原文件"

echo "放置新文件"
mv /data/codes/django/views.py /data/server/hello/test1/
write_log "放置新文件"
}


# 開啟應用
serv_star(){
echo "開啟django應用"
source /data/virtual/venv/bin/activate
cd /data/server/hello/
python manage.py runserver >> /dev/null 2>&1 &
deactivate
write_log "開啟django應用"

echo "開啟nginx應用"
/data/server/nginx/sbin/nginx
write_log "開啟nginx應用"
}


# 檢查
check(){
echo "檢查"
netstat -tnulp | grep :80
write_log "檢查"
}


main(){
tar_code
scp_code
serv_stop
untar_code
fangzhi_code
serv_star
check
}


main

5.2.4 增加鎖文件功能
需求:
同一時間段內,只允許有一個用戶來執行這個腳本
如果腳本執行的時候,有人在執行,那么輸入報錯:改腳本正在運行......

設計:
鎖文件 /tmp/deploy.pid
腳本執行的時候,需要創建鎖文件
腳本執行結束的時候,需要刪除鎖文件

腳本實施
#!/bin/bash
# 功能:打包代碼
# 腳本名:deploy.sh
# 作者:python 13期全體
# 版本:V 0.4
# 聯系方式:長安街1號 太和殿旁邊 國務院4號廳


LOG_FILE='/data/logs/deploy.log'


# 增加鎖文件
add_lock(){
echo "增加鎖文件"
touch /tmp/deploy.pid
write_log "增加鎖文件"
}


# 刪除鎖文件
del_lock(){
echo "刪除鎖文件"
rm -f /tmp/deploy.pid
write_log "刪除鎖文件"
}


# 增加日志功能
write_log(){
? log_date='date +%F'
? log_time='date +%T'
? buzhou="$1"
??
? echo "${log_date} ?${log_time} ?$0 ?${buzhou}" >> "${LOG_FILE}"
}


# 打包代碼
tar_code(){
echo "打包代碼"
ssh root@192.168.56.12 "/bin/bash /data/scripts/tar_code.sh"
write_log "打包代碼"
}


# 傳輸代碼
scp_code(){
echo "傳輸代碼"
cd /data/codes/
[ -f django.tar.gz ] && rm -f django.tar.gz
[ -d django ] && rm -rf django
scp root@192.168.56.12:/data/code/django.tar.gz ./
write_log "傳輸代碼"
}


# 關閉應用
serv_stop(){
echo "關閉nginx應用"
/data/server/nginx/sbin/nginx -s stop
write_log "關閉nginx應用"

echo "關閉django應用"
kill `lsof -Pti :8000`
write_log "關閉django應用"
}


# 解壓代碼
untar_code(){
echo "解壓代碼"
cd /data/codes
tar xf django.tar.gz
write_log "解壓代碼"
}


# 放置代碼
fangzhi_code(){
echo "備份原文件"
mv /data/server/hello/test1/views.py /data/backup/views.py-`date +%Y%m%d%H%M%S`
write_log "備份原文件"

echo "放置新文件"
mv /data/codes/django/views.py /data/server/hello/test1/
write_log "放置新文件"
}


# 開啟應用
serv_star(){
echo "開啟django應用"
source /data/virtual/venv/bin/activate
cd /data/server/hello/
python manage.py runserver >> /dev/null 2>&1 &
deactivate
write_log "開啟django應用"

echo "開啟nginx應用"
/data/server/nginx/sbin/nginx
write_log "開啟nginx應用"
}


# 檢查
check(){
echo "檢查"
netstat -tnulp | grep :80
write_log "檢查"
}


main(){
if [ -f /tmp/deploy.pid ]
then
echo "腳本 $0 正在運行中....."
exit
else
add_lock
tar_code
scp_code
serv_stop
untar_code
fangzhi_code
serv_star
check
del_lock
fi
}


main






5.2.5 腳本流程知識點填充
需求:
如果我給腳本出入的參數是deploy,那么我才執行
方案;
1、腳本的傳參
2、位置參數的調用
3、case流程語句的使用

輸出幫助信息:
腳本 $0 的使用方式: $0 [ deploy ]

腳本實施
#!/bin/bash
# 功能:打包代碼
# 腳本名:deploy.sh
# 作者:python 13期全體
# 版本:V 0.5
# 聯系方式:長安街1號 太和殿旁邊 國務院5號廳


LOG_FILE='/data/logs/deploy.log'


# 腳本使用幫助
usage(){
echo "腳本 $0 的使用方式: $0 [ deploy ]"
exit
}


# 增加鎖文件
add_lock(){
echo "增加鎖文件"
touch /tmp/deploy.pid
write_log "增加鎖文件"
}


# 刪除鎖文件
del_lock(){
echo "刪除鎖文件"
rm -f /tmp/deploy.pid
write_log "刪除鎖文件"
}


# 增加日志功能
write_log(){
? log_date='date +%F'
? log_time='date +%T'
? buzhou="$1"
??
? echo "${log_date} ?${log_time} ?$0 ?${buzhou}" >> "${LOG_FILE}"
}


# 打包代碼
tar_code(){
echo "打包代碼"
ssh root@192.168.56.12 "/bin/bash /data/scripts/tar_code.sh"
write_log "打包代碼"
}


# 傳輸代碼
scp_code(){
echo "傳輸代碼"
cd /data/codes/
[ -f django.tar.gz ] && rm -f django.tar.gz
[ -d django ] && rm -rf django
scp root@192.168.56.12:/data/code/django.tar.gz ./
write_log "傳輸代碼"
}


# 關閉應用
serv_stop(){
echo "關閉nginx應用"
/data/server/nginx/sbin/nginx -s stop
write_log "關閉nginx應用"

echo "關閉django應用"
kill `lsof -Pti :8000`
write_log "關閉django應用"
}


# 解壓代碼
untar_code(){
echo "解壓代碼"
cd /data/codes
tar xf django.tar.gz
write_log "解壓代碼"
}


# 放置代碼
fangzhi_code(){
echo "備份原文件"
mv /data/server/hello/test1/views.py /data/backup/views.py-`date +%Y%m%d%H%M%S`
write_log "備份原文件"

echo "放置新文件"
mv /data/codes/django/views.py /data/server/hello/test1/
write_log "放置新文件"
}


# 開啟應用
serv_star(){
echo "開啟django應用"
source /data/virtual/venv/bin/activate
cd /data/server/hello/
python manage.py runserver >> /dev/null 2>&1 &
deactivate
write_log "開啟django應用"

echo "開啟nginx應用"
/data/server/nginx/sbin/nginx
write_log "開啟nginx應用"
}


# 檢查
check(){
echo "檢查"
netstat -tnulp | grep :80
write_log "檢查"
}


main(){
case "$1" in
"deploy")
if [ -f /tmp/deploy.pid ]
then
echo "腳本 $0 正在運行中....."
exit
else
add_lock
tar_code
scp_code
serv_stop
untar_code
fangzhi_code
serv_star
check
del_lock
fi
;;
*)
usage
;;
esac
}


main $1



5.2.6 輸入參數安全優化
需求:
對腳本傳入的參數進行判斷,如果傳入的參數數量不對,直接提示腳本使用方式,然后退出

方案:
條件表達式 + $#?

腳本實施
#!/bin/bash
# 功能:打包代碼 ? ? ? ?
# 腳本名:deploy.sh ? ??
# 作者:python 13期全體?
# 版本:V 0.6
# 聯系方式:長安街1號 太和殿旁邊 國務院6號廳


LOG_FILE='/data/logs/deploy.log'




# 腳本使用幫助
usage(){
echo "腳本 $0 的使用方式: $0 [ deploy ]"
exit
}


[ "$#" -eq 1 ] || usage
...



5.2.7 腳本調試功能

-x

示例:
root@admina-virtual-machine:/data/scripts/python10# bash -x while.sh?
+ a=1
+ '[' 1 -lt 5 ']'
+ echo 1
1
+ a=2
+ '[' 2 -lt 5 ']'
+ echo 2
2
+ a=3
+ '[' 3 -lt 5 ']'
+ echo 3
3
+ a=4
+ '[' 4 -lt 5 ']'
+ echo 4
4
+ a=5
+ '[' 5 -lt 5 ']'



5.3 生產腳本編寫總結
5.3.1 簡單腳本編寫總結
1、命令簡單羅列
2、固定的內容變量化
3、功能函數化


5.3.2 復雜腳本編寫總結
1、手工執行的命令一定要正確
2、根據流程編寫腳本的框架
3、將手工執行的命令填充到對應的框架函數內部
4、增加日志功能,方便跟蹤腳本歷史執行記錄
5、增加鎖文件,保證代碼發布的過程中,不受同類腳本影響
6、主函數中邏輯流程控制好,
7、設計安全的方面:
輸入參數數量
輸入參數匹配
腳本幫助信息
8、調試腳本

注意事項:
1、命令一定要保證能正常執行
2、成對的符號,要成對寫,避免丟失
3、函數調用,
寫好函數后,一定要在主函數中進行調用
4、避免符號出現英文
5、命令變量的寫法一定要規范
6、固定的內容一定要變量實現,方便以后更改
7、日志的輸出
8、腳本的傳參和函數的傳參要區別對待

總結

以上是生活随笔為你收集整理的自动化运维Shell课堂笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

2024国产精品视频 | 成人一区二区在线观看 | 国产一区福利在线 | 天天爱av导航| 欧美激情视频一区二区三区免费 | 精品久久久久国产 | 久久久精品高清 | 91在线播放国产 | 狠狠色综合欧美激情 | 久久久国产精品久久久 | 一级大片在线观看 | 久久精品中文 | 99免费在线播放99久久免费 | 日韩国产欧美在线播放 | 97电影在线看视频 | 91久久精品一区二区二区 | 国产亚洲片 | 一区二区三区手机在线观看 | 在线观看日韩专区 | 成人免费视频播放 | 国产 日韩 在线 亚洲 字幕 中文 | 久久99精品国产99久久6尤 | 国产精品久免费的黄网站 | 日日狠狠| 激情www | zzijzzij日本成熟少妇 | 亚洲在线激情 | 久章草在线观看 | 精品欧美乱码久久久久久 | 91日韩国产| 国内精品视频在线 | 天天操天天谢 | 久久综合九色欧美综合狠狠 | 9在线观看免费高清完整 | 日韩深夜在线观看 | 国产精品第52页 | 四虎国产精品免费观看视频优播 | 亚洲综合色播 | 91av视屏| 在线韩国电影免费观影完整版 | 久久综合久久久 | 国产精品1区2区 | 欧美一区二区三区不卡 | 黄色免费在线看 | 超碰成人av | 夜色成人网| 中文字幕国产一区二区 | 欧美激情精品久久久久 | 蜜臀av性久久久久蜜臀av | 久久高清国产 | 黄色软件大全网站 | 天天操夜夜摸 | 伊人亚洲精品 | 国产免费国产 | 在线色视频小说 | 日韩一区二区久久 | 91麻豆精品91久久久久同性 | 久久久久国产视频 | 人人艹人人 | 日韩 在线观看 | 91黄色小网站 | 欧美性色黄大片在线观看 | www久久久 | 免费在线激情电影 | 狠狠色丁香婷婷综合久小说久 | 香蕉在线视频播放网站 | 日韩理论电影网 | 91免费版在线观看 | 成人国产精品免费观看 | 97av色| 欧美先锋影音 | 正在播放久久 | 亚洲国产无 | 少妇自拍av| 久久精品视频日本 | 爱干视频 | 欧美性精品 | 香蕉免费 | 国产精品成人自产拍在线观看 | 中文理论片 | 国产激情电影综合在线看 | 玖玖综合网 | 免费在线观看黄色网 | 欧美成人基地 | 在线观看国产福利片 | 成人久久综合 | 91视频高清完整版 | 亚洲国产中文字幕 | 丁香激情网 | 99久热在线精品视频成人一区 | 国产日韩在线观看一区 | 日韩午夜电影院 | 亚洲爱爱视频 | 免费高清国产 | 久久久鲁| 国产精品夜夜夜一区二区三区尤 | 国产精品久久久久久久婷婷 | 夜又临在线观看 | 日韩色在线| 国产精品一区二 | 在线看黄色的网站 | 亚洲毛片在线观看. | 丁香久久五月 | 婷婷丁香六月 | 日韩免费在线观看视频 | 福利视频在线看 | 国产一线在线 | 天天综合日日夜夜 | 最新日韩在线观看视频 | 成人黄性视频 | 欧美精品久久久久久久亚洲调教 | 国产精品久久中文字幕 | 碰超在线 | 国产精品久久久久久久久久久久午夜片 | 日韩电影一区二区在线 | 欧美性脚交 | 亚洲一级片在线观看 | 国产精品美女999 | 男女全黄一级一级高潮免费看 | 久久九九网站 | 亚洲国产精品va在线看黑人 | 久久韩国免费视频 | 在线观看视频免费大全 | 91在线看黄| 精品久久久免费 | www.色午夜.com| 99久久综合国产精品二区 | 91久久精品日日躁夜夜躁国产 | 日韩精品视频在线观看网址 | 日韩欧美在线一区二区 | 日韩av片无码一区二区不卡电影 | 国内精品久久久久久久影视麻豆 | 久久久久久麻豆 | 激情丁香婷婷 | 国产精品免费视频久久久 | 色中色亚洲 | 久久久午夜精品理论片中文字幕 | 中文字幕免费高清在线观看 | 色综合天天爱 | 91精品一区国产高清在线gif | 免费观看完整版无人区 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 亚洲电影第一页av | 国产精品高潮呻吟久久久久 | 91视频com | 日韩中文字幕免费看 | 中文字幕精品www乱入免费视频 | 日韩色av色资源 | 国产精品久久久久aaaa九色 | 国产精品少妇 | 五月亚洲综合 | 精品1区二区 | 狠狠ri| 99在线观看| 美女网站黄在线观看 | 手机在线日韩视频 | 又黄又爽又刺激 | 中文字幕视频网站 | 欧美精品久久久久久 | 天天操人人要 | 丁香电影小说免费视频观看 | 欧美精品天堂 | 日韩欧美高清在线观看 | 国产91勾搭技师精品 | 波多野结衣在线视频一区 | 热精品| 欧美日韩3p| av五月婷婷 | 狠狠操91| 精品国产日本 | 亚洲极色| 国产精品成人品 | 综合久久久久 | 国产精品嫩草影院9 | 日韩高清在线一区二区三区 | 国产成人免费精品 | 免费av网站在线看 | 亚洲一区二区三区miaa149 | 成人国产精品久久久 | 国产精品久久久久免费观看 | 久久久免费av | 成人a大片 | 国产aaa大片 | 国产成人a v电影 | 日韩欧在线 | 日本h在线播放 | www.久久久精品 | 五月婷婷六月丁香激情 | 在线不卡视频 | 精品国产乱码久久久久久浪潮 | 欧美色图88 | 亚洲午夜久久久影院 | 国产亚洲成人精品 | 国产亚洲一级高清 | 日韩综合第一页 | 国产成人三级一区二区在线观看一 | 国产成人精品午夜在线播放 | 一区二区三区高清在线 | 欧美a性 | 久久综合成人网 | 国产精品美女免费 | 久青草视频 | 日韩理论在线播放 | 中文字幕免费观看 | 亚洲精品久久久久久中文传媒 | 欧美一级专区免费大片 | 久久黄色小说 | 亚洲区视频在线观看 | 亚洲va欧美va | 最新一区二区三区 | 成人aaa毛片 | 在线激情av电影 | 久久久精品 一区二区三区 国产99视频在线观看 | 99视频在线观看一区三区 | 欧美91视频 | 免费av网址大全 | 激情久久一区二区三区 | av免费看看| 中文字幕在线日亚洲9 | 久久高清国产 | av在线中文 | 91精品欧美一区二区三区 | 欧洲精品码一区二区三区免费看 | 国产天天爽 | 国内精自线一二区永久 | 在线观看成人 | 久久综合99 | 中文字幕中文字幕在线一区 | 久久黄页| 国产大片免费久久 | 一本一本久久a久久精品综合小说 | 激情视频一区二区 | 九色精品在线 | 国产综合激情 | 国产一区二区三区四区在线 | 日韩中文字幕国产精品 | 久久久在线视频 | 九九久久在线看 | 免费av网站观看 | 亚洲码国产日韩欧美高潮在线播放 | 久久久www成人免费精品张筱雨 | 香蕉97视频观看在线观看 | 麻豆av一区二区三区在线观看 | 久视频在线 | 精品视频久久 | 国产精品观看在线亚洲人成网 | 欧美精品乱码久久久久 | 狠狠干网 | 日韩av影视在线 | 在线视频日韩精品 | 色婷婷狠狠五月综合天色拍 | 91免费的视频在线播放 | 亚洲精品一区二区三区新线路 | 国产一区久久久 | 久草在线在线精品观看 | 久草免费在线观看 | 色婷婷丁香 | 国产一区二区免费看 | 天天射,天天干 | 国产精品1000| 国产高清亚洲 | 久草网站在线 | 午夜影视剧场 | 九九九毛片 | 成人黄色在线视频 | 国产黄免费 | 久久艹影院| 婷婷丁香色 | 最新极品jizzhd欧美 | 日韩欧美在线高清 | 日本巨乳在线 | 一级成人免费 | a在线播放 | 日韩av不卡在线 | 亚洲精品视频中文字幕 | 99在线视频免费观看 | 亚洲人毛片 | 免费视频a | 欧美精品亚洲精品日韩精品 | 国产精品h在线观看 | 天天拍天天色 | 丁香五香天综合情 | 欧美国产日韩一区二区三区 | 久久影院亚洲 | 在线观看视频三级 | 爱情影院aqdy鲁丝片二区 | 国产视频在线播放 | 欧美大片在线观看一区 | 色综合天天综合在线视频 | 日韩一区二区三免费高清在线观看 | 国产美女视频一区 | 在线香蕉视频 | 久久激情视频 | 久草资源在线 | 欧美日韩国产一二三区 | 欧美综合久久久 | 蜜臀aⅴ国产精品久久久国产 | 中文字幕视频一区二区 | 91精品视频在线 | 亚洲精品玖玖玖av在线看 | 正在播放一区 | 精品一区 精品二区 | 久久五月婷婷丁香社区 | 99精品一区| 日韩精品一区二区不卡 | 麻豆一区二区三区视频 | 国产午夜在线观看视频 | 国产91九色视频 | 亚洲精品久久久久58 | 国产成人精品久久二区二区 | 免费看毛片在线 | 一本一本久久a久久精品综合 | 97视频免费播放 | 国产精品xxxx18a99 | 亚洲另类人人澡 | 日韩美女高潮 | 久久九九久久精品 | 天天色影院 | 免费看片网页 | 在线超碰av | 久久福利综合 | 国产精品婷婷 | 五月婷婷黄色 | 黄色在线成人 | 成人亚洲精品久久久久 | 亚洲一区精品二人人爽久久 | 97视频免费在线看 | 久热电影| 国产亚洲一区 | 国产中文字幕在线观看 | 久久精彩免费视频 | www.久久婷婷 | 麻豆传媒在线视频 | 夜夜摸夜夜爽 | 成人av地址 | 在线精品视频免费观看 | 91精品视频免费在线观看 | 日韩av免费一区二区 | www.夜夜干.com | 日韩高清黄色 | 亚洲精品视频在线免费播放 | 伊人电影天堂 | 成年人在线免费看片 | 日日添夜夜添 | 视频在线观看一区 | 美女视频黄是免费的 | 免费三级黄 | 亚洲欧美一区二区三区孕妇写真 | 狠狠色伊人亚洲综合成人 | 亚州精品天堂中文字幕 | 国产精品久久久久一区二区三区 | av福利资源 | 日韩毛片在线免费观看 | 国产精品自拍在线 | 九九影视理伦片 | 一区二区高清在线 | 在线国产精品视频 | 国产69久久久 | 国产原厂视频在线观看 | 日日夜夜综合网 | 日夜夜精品视频 | av成人黄色 | 黄色avwww | 成人久久久精品国产乱码一区二区 | 亚洲成人中文在线 | 欧美一级性生活片 | 国产成人精品综合久久久 | 999久久国精品免费观看网站 | 亚洲电影免费 | 成人午夜影院在线观看 | 日韩高清在线一区二区三区 | 精品免费久久久久 | 亚洲成人网在线 | 国产私拍在线 | 丁香综合网| 最近更新好看的中文字幕 | 99视频国产精品免费观看 | 久久综合成人 | 丁香久久激情 | 天天干天天操天天入 | 国产精品成人自产拍在线观看 | 天天射天天干天天爽 | 久久草网站 | 久久精品牌麻豆国产大山 | 免费午夜av | 中文字幕在线播放第一页 | 日本精品久久久久影院 | 又紧又大又爽精品一区二区 | 久99久在线视频 | 天天操天天操天天操天天操天天操天天操 | 日韩伦理一区二区三区av在线 | 91精品国产乱码久久 | 久久精品亚洲精品国产欧美 | 久久激情小视频 | 99久久精品电影 | 日本不卡123区 | 午夜精品电影 | 国产无遮挡又黄又爽在线观看 | 久久精品官网 | 国产精品一区二区免费在线观看 | 国产丝袜美腿在线 | 精品国产欧美一区二区三区不卡 | 国产成本人视频在线观看 | 午夜av免费 | 精品中文字幕在线 | 伊人永久| 国产精品福利在线 | 91在线视频 | 亚洲激情免费 | 中文有码在线视频 | 国产九九热| 超碰97免费观看 | 日韩欧美在线第一页 | 日韩毛片久久久 | 四虎永久免费网站 | 精品一区二区三区久久 | 奇米网444| 在线视频 国产 日韩 | 久久久久久片 | 国产日本在线观看 | 色午夜影院 | 中文乱码视频在线观看 | 黄a在线观看 | 国产特黄色片 | 97人人超| 天天爽夜夜爽人人爽一区二区 | 91看成人 | 伊人久久影视 | 国产精品久久久久影院 | 亚洲禁18久人片 | 亚洲爱爱视频 | 西西大胆啪啪 | 国产视频2 | 国产第一福利 | 国产美女无遮挡永久免费 | a黄色大片 | www免费在线观看 | 成人免费影院 | 性色av香蕉一区二区 | 久久久久在线观看 | 亚洲综合狠狠干 | 亚洲播放一区 | 国产精品久久久久久久久搜平片 | 国产午夜精品一区二区三区欧美 | 亚洲三级黄色 | 天天操月月操 | 五月综合久久 | 欧美大片在线观看一区 | 成人av免费电影 | 天天综合中文 | 国产一线天在线观看 | 97视频在线观看视频免费视频 | 免费av小说| 久草免费色站 | 国产91大片 | 天天综合婷婷 | 天天操网站 | 免费在线观看日韩视频 | 中国一级片在线播放 | 国产欧美最新羞羞视频在线观看 | 女人18毛片a级毛片一区二区 | 国产第一页在线观看 | 91亚州| av成人免费在线观看 | 成年人视频在线免费播放 | 日韩免费观看视频 | 黄色av电影 | 人人干,人人爽 | 精品在线看 | 一区二区三区四区久久 | 婷婷激情综合网 | 91在线精品秘密一区二区 | 天天艹天天操 | 国产精品一区二区三区久久 | 99综合视频 | 久草网在线 | 成人欧美亚洲 | 波多野结衣亚洲一区二区 | 国产伦精品一区二区三区照片91 | 色多多污污在线观看 | 国产成人777777 | 久久人人爽人人爽 | 去看片| 日韩免费观看av | 视频 国产区| 456免费视频 | 在线久草视频 | 91精品国产高清自在线观看 | 久草网站在线 | 99久久国产免费,99久久国产免费大片 | 日韩欧美成 | 国产精品一区二区免费看 | 亚洲 欧洲av | 最新av在线播放 | 久久精品99国产国产 | 狠狠干我 | 一区中文字幕电影 | 射久久久 | 日韩欧美精品在线 | 亚洲综合成人专区片 | 亚洲精品午夜一区人人爽 | 国产v欧美 | 美女亚洲精品 | 日韩免费一级电影 | 毛片永久免费 | 国产黄色成人 | 精品久久国产 | 久草视频手机在线 | 一区二区三区视频 | 九色精品免费永久在线 | 色婷婷综合久久久 | 国产精品一区二区三区视频免费 | 超碰免费成人 | 在线免费av播放 | 超级碰视频 | 亚洲视屏在线播放 | 日本精品一区二区在线观看 | 免费av试看 | 婷婷久久五月 | 国产精品久久久久久久久久久免费看 | 天天干天天摸天天操 | 91视频久久久久久 | 国产三级av在线 | 国产精品成 | 久久久国产成人 | 高清不卡免费视频 | 激情久久五月天 | 精品国产精品久久一区免费式 | 成人超碰97| 一区二区电影在线观看 | 99精品国产免费久久久久久下载 | 国产中文字幕国产 | 中文字幕 在线 一 二 | 九九九在线 | 婷婷在线视频观看 | 国产裸体永久免费视频网站 | 久久刺激视频 | 日韩精品综合在线 | 97人人澡人人添人人爽超碰 | 日韩a免费 | 欧美精品一区二区在线播放 | 成人久久久久 | 黄色资源网站 | 中文av不卡 | 欧美做受高潮电影o | 国产中文字幕在线观看 | 欧美va日韩va| 在线之家官网 | 日韩免费看的电影 | 亚洲一区二区精品视频 | 视频在线观看入口黄最新永久免费国产 | 亚洲午夜精品久久久久久久久 | 人人人爽| 玖玖视频| 成人在线视频一区 | 婷婷六月天在线 | 欧美在线观看视频一区二区 | 99精品视频免费全部在线 | 国内成人综合 | 一区二区三区精品在线视频 | av在线播放快速免费阴 | 最新超碰在线 | 亚洲精品中文字幕在线 | 亚洲久草网 | 欧美日韩国产网站 | 日韩视频一二三区 | 国产午夜精品福利视频 | 久久丁香网 | 国产精品嫩草影院9 | 久草网免费 | 久草免费在线视频 | 成人黄色片免费 | 国产成人一区二区在线观看 | www.黄色片网站 | 日韩精品视频一二三 | 久久久久综合网 | 97成人超碰 | 国产伦理久久精品久久久久_ | 美女视频黄在线 | 中文一二区 | 在线看中文字幕 | 国产午夜精品久久 | 国产高清在线不卡 | 欧美综合国产 | 91传媒在线观看 | 一区av在线播放 | 久久99亚洲网美利坚合众国 | 人人射人人澡 | 一级a毛片高清视频 | 99re亚洲国产精品 | 久久久久久久99精品免费观看 | 香蕉视频国产在线 | 天天做天天爱天天综合网 | 欧美成人中文字幕 | 久久手机免费观看 | 亚洲精品黄 | 天天操天天插 | 亚洲精品456在线播放第一页 | 国产高清免费 | 日批网站在线观看 | 五月婷婷综合在线视频 | 久久综合五月 | 日本午夜在线亚洲.国产 | 成人午夜片av在线看 | 亚洲精品天天 | 国产午夜三级一区二区三 | 国产一区二区在线视频观看 | 精品一区电影 | 一区二区三区四区在线 | 国产传媒一区在线 | 亚洲艳情 | 欧美日韩伦理一区 | 久久99电影 | 成人资源网 | sm免费xx网站 | 久久最新| 又大又硬又黄又爽视频在线观看 | 久草在线在线精品观看 | 日韩毛片在线免费观看 | 国产99视频在线观看 | 久久av在线播放 | 国产69精品久久久久99 | 欧美日韩国产一二 | 久久a国产| 青青河边草免费观看 | 999久久国精品免费观看网站 | 成人久久综合 | 国产一区 在线播放 | 黄色大全免费网站 | 亚洲永久精品视频 | 97视频久久久 | 黄色小说在线免费观看 | 黄色大全视频 | 久久国产精品电影 | 特级毛片aaa | 九九免费在线看完整版 | 九月婷婷色 | 最新av网站在线观看 | 人人舔人人爽 | 国产精品99久久久久久武松影视 | 久九视频 | 伊人成人精品 | 国产精品午夜免费福利视频 | 在线精品视频免费播放 | 激情久久婷婷 | 有码中文字幕 | 久久久免费看视频 | 亚洲精品国产日韩 | 在线观看第一页 | 在线观看色视频 | 亚洲国产精品99久久久久久久久 | 欧美极品少妇xxxx | 亚洲黄色免费在线 | 98精品国产自产在线观看 | 国产手机在线观看 | 不卡av免费在线观看 | 99精品免费久久久久久久久 | 人人舔人人爽 | 91一区在线观看 | 人人精品| 国产夫妻自拍av | 精品视频免费 | 亚洲精品午夜久久久 | 97超碰人人澡人人 | 六月丁香色婷婷 | 日韩欧美99 | 黄色网址在线播放 | 福利视频导航网址 | 国产在线a | 在线高清av | 99热999 | 精品久久久一区二区 | 日日夜夜国产 | 91黄视频在线观看 | 久久精品99久久久久久 | 九九热只有这里有精品 | 久久69精品久久久久久久电影好 | 免费视频国产 | 最新av免费在线 | 在线观看久久久久久 | 亚洲欧洲av在线 | 正在播放一区 | 欧美日韩中文国产一区发布 | 99国内精品久久久久久久 | 成人黄色在线看 | 中文字幕在线影视资源 | 91在线看视频免费 | 999成人网 | 欧美一级久久久久 | 黄色1级大片 | 日韩久久精品一区二区三区下载 | 99草视频| av成人在线电影 | 91九色丨porny丨丰满6 | 九九热1| 国产精品久久99综合免费观看尤物 | 日韩黄色一区 | 婷婷五月在线视频 | 亚洲午夜久久久久久久久 | 久久只有精品 | 天天爽天天搞 | 国产精品久久久久久久久久久久冷 | 欧美日韩伦理在线 | 蜜臀一区二区三区精品免费视频 | 亚洲天天干 | 9999在线观看 | 精品一区二区三区在线播放 | 欧美一二三视频 | 久久久午夜视频 | 欧美日韩久久不卡 | 国产va在线 | 亚洲 综合 国产 精品 | 亚洲高清国产视频 | 日韩av一区二区三区在线观看 | 香蕉久久久久久av成人 | 特级a老妇做爰全过程 | 日韩视频免费观看高清完整版在线 | 成人av一区二区兰花在线播放 | 亚洲狠狠 | 亚洲精品一区二区三区在线观看 | 婷婷久久一区二区三区 | 操少妇视频 | 高清不卡毛片 | 在线国产精品视频 | 波多野结衣视频一区 | 超碰人人超 | 精品夜夜嗨av一区二区三区 | 麻豆国产网站 | 狠狠操狠狠干2017 | 中文字幕乱码电影 | 国产色影院 | 日韩理论电影在线 | 99免费在线播放99久久免费 | 色婷婷99 | 夜夜爱av| 在线观看一区二区精品 | 国产无遮挡又黄又爽馒头漫画 | 国产成人精品一区二区三区在线 | 国产精品久久三 | 日韩欧美一区二区三区免费观看 | 国产激情小视频在线观看 | 日本精品中文字幕在线观看 | 手机看片午夜 | 97在线免费观看视频 | 天天操夜夜操 | 超碰成人网 | 99热只有精品在线观看 | 亚洲国产资源 | 国产日韩欧美在线影视 | 91精品久久久久久久99蜜桃 | 伊人六月| 国产高清av在线播放 | 91av亚洲| www色综合| 欧美日韩免费一区 | 日韩精品视频免费看 | 国产黄色片在线免费观看 | 99re8这里有精品热视频免费 | 在线观看av网 | 国产精品永久免费 | www..com毛片| 在线视频一区二区 | 成人在线观看日韩 | 亚洲精品视频播放 | 午夜av在线播放 | 国产精品免费在线播放 | 国产精品一区免费在线观看 | 久久综合影音 | 黄色大片视频网站 | 欧美大码xxxx | 亚洲黄色小说网 | 国产精品一区二区中文字幕 | 国产一区二区三区高清播放 | 激情五月婷婷综合 | 欧美性精品 | 一区二区精品在线 | 91视频国产高清 | 69绿帽绿奴3pvideos | 欧美日韩国产一二三区 | 国产高清成人av | 国产美腿白丝袜足在线av | 在线视频app | 久久免费99精品久久久久久 | 久久av电影| 久99久精品 | 欧美成a人片在线观看久 | 99亚洲国产 | a视频在线播放 | 在线免费观看一区二区三区 | 91手机电视 | 国产日韩精品在线观看 | 天天干天天做天天操 | 99国产精品| 一区二区三区四区久久 | 超碰国产97| 国产精品美女久久久久久2018 | 久久精品久久精品久久精品 | 视频一区二区免费 | av亚洲产国偷v产偷v自拍小说 | 久久久久久激情 | 免费精品| 国产精品久久久久三级 | 久久99在线| 一区二区三区四区久久 | 最近日韩免费视频 | 国产精品视频99 | 9ⅰ精品久久久久久久久中文字幕 | 日本在线中文在线 | 午夜色影院 | 51久久成人国产精品麻豆 | 婷婷丁香久久五月婷婷 | 美女视频黄免费 | 日韩欧美高清一区二区三区 | 色婷婷国产在线 | 四虎国产精品免费观看视频优播 | 成年人视频在线观看免费 | 一区二区三区四区在线 | 欧美一级特黄高清视频 | 综合网色| 91在线观看视频网站 | av高清一区二区三区 | 丁香视频免费观看 | 中文字幕大全 | 在线观看免费91 | 国产视频精选在线 | 草久热 | 日日干夜夜草 | 国产91精品一区二区绿帽 | 国产精品日韩 | 99产精品成人啪免费网站 | 国产不卡视频在线播放 | 欧美综合在线视频 | 日韩在线中文字幕 | 成人9ⅰ免费影视网站 | 超碰免费公开 | av直接看| 国产午夜在线观看视频 | 91桃色免费观看 | 精品一区二区免费在线观看 | 波多野结衣在线观看视频 | 久久在线看 | 久久激情精品 | 亚洲毛片在线观看. | 欧美日韩国产二区三区 | 一级片免费观看视频 | 日韩三级久久 | 美女在线观看网站 | 国产一卡久久电影永久 | 日韩午夜精品 | 亚洲电影在线看 | 精品国产一区在线观看 | 999久久 | 国产精品久久久久久久久久新婚 | 激情综合五月 | 999色视频| 99这里只有精品99 | 成人免费在线电影 | 久久无码精品一区二区三区 | 日韩av电影中文字幕在线观看 | 激情黄色av | 成人h动漫精品一区二 | 91黄色小视频 | 中文字幕国语官网在线视频 | 国产成人精品综合久久久久99 | 丰满少妇对白在线偷拍 | 国产精品视频在线观看 | 中文国产字幕在线观看 | 超碰在线人人艹 | 九九久久婷婷 | 国产精品 久久 | 中文字幕 国产专区 | 国产精品69久久久久 | 在线小视频你懂得 | 丁香婷婷色综合亚洲电影 | 色婷婷综合久久久久中文字幕1 | 国内精品国产三级国产aⅴ久 | 97福利视频 | 麻豆免费观看视频 | 日日爱网址| 中文字幕乱码日本亚洲一区二区 | 久久久久久久久黄色 | 中文字幕资源站 | 97av色 | 日日碰狠狠躁久久躁综合网 | 亚洲一级片在线看 | a极黄色片 | 黄色av免费看 | 日韩欧美在线不卡 | 国产在线精品国自产拍影院 | 久久精品电影网 | 狠狠色狠狠色综合系列 | 一区二区三区四区五区六区 | 欧美日韩在线观看视频 | 四虎永久免费在线观看 | 99re视频在线观看 | 天天综合五月天 | 亚洲高清在线视频 | 日韩欧美大片免费观看 | 国产伦理一区二区三区 | 天天操天天操天天干 | 久久99久久精品国产 | av三级在线看 | 婷婷色视频 | 国产精品一区二区免费 | 国产超碰在线 | 欧美黑人猛交 | 91av超碰 | 国产精品久久久久久久久久久免费 | 亚洲欧洲精品一区二区精品久久久 | 亚洲成人午夜av | 玖操 | 99精品国产视频 | 日韩欧美在线观看一区 | 日韩动漫免费观看高清完整版在线观看 | 激情五月六月婷婷 | 97人人人| 成人av在线观 | 久久精品99国产精品亚洲最刺激 | 国产码电影 | 在线看片日韩 | 日韩免费视频在线观看 | 欧美日韩一区二区三区不卡 | 视频高清 | 久久999精品 | 久久人人爽人人爽人人片av免费 | 日韩免费不卡av | 视频在线在亚洲 | 成人免费视频播放 | 91精品啪在线观看国产 | 性日韩欧美在线视频 | 日韩99热 | 久久久久久综合网天天 | 国产亚洲久一区二区 | 国偷自产视频一区二区久 | 999视频精品| 狠狠色丁香九九婷婷综合五月 | 99久久婷婷国产综合精品 | 91视频免费播放 | 色婷婷啪啪免费在线电影观看 | 99久久精品久久久久久清纯 | 国产69久久精品成人看 | 色五月成人 | 91亚洲综合 | 一区 二区电影免费在线观看 | 日本在线视频一区二区三区 | 亚洲欧美日韩一区二区三区在线观看 | 国产99久久九九精品 | 久久久视频在线 | 中文字幕在线视频网站 | 国产一级三级 | 91看片黄色| 在线观看麻豆av | www.亚洲激情.com | 亚洲成人av片在线观看 | 夜夜骑首页| 成人av免费网站 | 天天狠狠| 九九九热精品免费视频观看网站 | 九九日韩 | 伊人色综合久久天天网 | 91原创在线观看 | 成年人免费看片网站 | 91视频黄色 | 国产精品一区二区久久久 | 久草免费色站 | 免费观看久久 | 国产亚洲情侣一区二区无 | 精品国产1区二区 | 亚洲精品大片www | 激情婷婷在线 | 免费观看一区二区 | av黄色国产 | 国产亚洲精品久 | 欧美va电影 | 亚洲成人精品国产 | 在线精品国产 | 久草在线播放视频 | 亚洲欧美经典 | 日韩免费电影在线观看 | www.香蕉视频 | 日韩av不卡在线观看 | 中文字幕在线第一页 | 亚洲成人精品久久久 | 国产伦精品一区二区三区高清 | 亚洲成人影音 | 视频在线一区 | 亚洲自拍偷拍色图 | 色夜视频 | 久久综合色影院 | 国产精品久久一区二区无卡 | 色婷婷狠狠五月综合天色拍 | 国产午夜精品一区二区三区 | 搡bbbb搡bbb视频 | 99精品一区二区三区 | 成年人免费在线观看网站 | 婷婷丁香六月天 | 中文字幕日韩一区二区三区不卡 | 精品久久久久_ |