自动化运维Shell课堂笔记
生活随笔
收集整理的這篇文章主要介紹了
自动化运维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}" == "$" ] && echo "您輸入的兩個參數內容是一致的"
[ "${a}" != "$" ] && 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
內部服務器?;蛘吖W服務器
倉庫權限
只有項目的開發人員才有權限,項目之外的人沒有權限
代碼權限:
開發、管理、查看
提交的方式:
代碼版本號
打包代碼:
目的:
減少傳輸文件數量
減小傳輸文件大小
增強傳輸速率
常見打包方式:
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、腳本的傳參和函數的傳參要區別對待
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}" == "$" ] && echo "您輸入的兩個參數內容是一致的"
[ "${a}" != "$" ] && 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
內部服務器?;蛘吖W服務器
倉庫權限
只有項目的開發人員才有權限,項目之外的人沒有權限
代碼權限:
開發、管理、查看
提交的方式:
代碼版本號
打包代碼:
目的:
減少傳輸文件數量
減小傳輸文件大小
增強傳輸速率
常見打包方式:
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课堂笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flask框架项目实例:**租房网站(一
- 下一篇: Jquery练习题—实现分组添加功能