shell 的學習之路

SHELL自動化運維php

 

1 SHELL 快速入門 1html

1.1 運維 1node

1.2 shell簡介 2python

1.2.1 什麼是shell 2linux

1.2.2 shell的分類 2nginx

1.2.3 shell 腳本 3git

2 SHELL 基礎知識 4web

2.1 shell腳本 4shell

2.1.1 建立腳本 4django

2.1.2 腳本執行 4

2.1.2 腳本開發規範 4

2.2 變量 5

2.2.1 什麼是變量 5

2.2.2 本地變量 5

2.2.3 全局變量 6

2.2.4 變量查看和取消 6

2.2.5 shell內置變量 7

3 SHELL 進階 8

3.1 表達式 9

3.1.1 測試語句 9

3.1.2 條件表達式 9

3.1.3 計算表達式 11

3.2 linux常見符號 11

3.2.1 重定向符號 11

3.2.2 管道符 | 12

3.2.3 其餘符號 12

3.3 常見命令詳解 13

3.3.1 grep命令詳解 13

3.3.2 sed命令詳解 14

3.3.3 awk命令詳解 17

3.3.4 find命令詳解 18

4章 流程控制 19

4.1 簡單流程控制語句 19

4.1.1 單分支if語句 19

4.1.2 雙分支if語句 19

4.1.3 多分支if語句 20

4.1.4 case選擇語句 21

4.1.5 for循環語句 22

4.1.6 while循環語句 23

4.2 複雜流程控制語句 23

4.2.1 函數基礎知識 23

4.2.2 函數實踐 24

5 章 代碼發佈 24

5.1 代碼發佈簡介 24

5.1.1 代碼發佈介紹 25

5.1.2 發佈方式 25

5.2 代碼發佈流程 25

5.2.1 流程簡介 25

5.2.2 流程詳解 26

5.2.3 技術關鍵點 28

6 章 環境部署 30

6.1 基礎環境 30

6.1.1 基礎目錄環境 30

6.1.2 主機網絡環境 31

6.2 方案分析 32

6.2.1 需求 32

6.2.2 需求分析 32

6.2.3 部署方案 32

6.3 項目環境部署 33

6.3.1 python虛擬環境 33

6.3.2 django環境 33

6.3.3 nginx環境 34

6.3.4 nginx代理django 35

7 章 手工代碼發佈 36

7.1 方案分析 36

7.2 方案實施 38

8 章 腳本發佈代碼 39

8.1 簡單腳本編寫 39

8.1.1 命令羅列 39

8.1.2 固定內容變量化 40

8.1.3 功能函數化 40

8.1.4 遠程執行 41

8.2 大型腳本編寫 41

8.2.1 功能框架 41

8.2.2 命令填充 43

8.2.3 增長日誌功能 44

8.2.4 增長鎖文件功能 46

8.2.5 腳本流程知識點填充 47

8.2.6 輸入參數安全優化 48

8.3腳本調試功能 49

8.4 生產腳本編寫總結 49

8.4.1 簡單腳本編寫總結 49

8.4.2 複雜腳本編寫總結 49

8.4.3 注意事項: 49

 

 

 

 

 

 

 

1 SHELL 快速入門

 

1.1 運維

 

運維是什麼?

 

公司的技術崗位

 

 

 

運維的工做範圍

 

 

 

以每天生鮮項目爲例:

 

規劃:咱們須要多少資源來支持項目的運行

 

管理:項目運行過程當中的全部內容都管理起來

 

流程規範:全部操做都造成制度,提升工做效率

 

平臺:大幅度提升工做效率

 

監控:實時查看項目運行狀態指標

 

告警:狀態指標異常,告知工做人員處理

 

安全:網站運營安全措施

 

優化:保證用戶訪問網站體驗很好

 

考覈:權責分配,保證利益

 

 

 

自動化運維:就是將圖裏面全部的工做都使用自動化的方式來實現。

 

實現自動化的方式不少,常見的方式:工具和腳本。

 

工做中常見的腳本有哪些呢?

 

shell腳本 其餘開發語言腳本

 

注意:

 

shell腳本就是shell編程的一種具體實現

 

1.2 shell簡介

 

既然咱們是來學shell,首先第一個問題:shell是什麼?

 

1.2.1 什麼是shell

 

shell的定義

 

在計算機科學中,Shell就是一個命令解釋器。

 

shell是位於操做系統和應用程序之間,是他們兩者最主要的接口,shell負責把應用程序的輸入命令信息解釋給操做系統,將操做系統指令處理後的結果解釋給應用程序。

 

shell位置圖

 

 

 

總結:

 

一句話,shell就是在操做系統和應用程序之間的一個命令翻譯工具。

 

1.2.2 shell的分類

 

基本上shell分兩大類:

 

圖形界面shell命令行shell  

 

 

 

圖形界面shell

 

圖形界面shell就是咱們常說的桌面  

 

命令行式shell

 

windows系統:

 

cmd.exe  命令提示字符

 

linux系統:

 

sh / csh / ksh / bash / ...

 

咱們常說的shell是命令行式的shell,在工做中經常使用的是linux系統下的bash

 

 

 

查看系統shell信息

 

查看當前系統的shell類型

 

echo $SHELL

 

查看當前系統環境支持的shell

 

[root@linux-node1 ~]# cat /etc/shells

 

# /etc/shells: valid login shells

 

/bin/sh

 

/bin/dash

 

/bin/bash

 

/bin/rbash

 

1.2.3 shell 腳本

 

shell使用方式

 

手工方式:

 

手工敲擊鍵盤,shell的命令行輸入命令,Enter,執行經過鍵盤輸入的命令,而後shell返回並顯示命令執行的結果.

 

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

 

 

 

腳本方式:

 

就是說咱們把手工執行的命令a,寫到一個腳本文件b中,而後經過執行腳本b,達到執行命令a的效果.

 

 

 

shell腳本定義

 

當可執行的Linux命令或語句不在命令行狀態下執行,而是經過一個文件執行時,咱們稱文件爲shell腳本。

 

 

 

shell腳本示例

 

如今咱們來使用腳本的方式來執行如下

 

[root@linux-node1 ~]# vim itcast.sh

 

#!/bin/bash

 

# 這是臨時shell腳本

 

echo 'nihao'

 

echo 'itcast'

 

腳本執行效果

 

[root@linux-node1 ~]# bash itcast.sh

 

nihao

 

itcast

 

---------------

 

2 SHELL 基礎知識

 

2.1 shell腳本

 

咱們在上面簡單介紹了一下什麼是shell腳本,如今咱們來進一步的來介紹shell腳本的要求/格式/規範等內容

 

2.1.1 建立腳本

 

腳本建立工具:

 

建立腳本的常見編輯器是 vi/vim.

 

 

 

腳本命名

 

shell腳本的命名簡單來講就是要有意義,方便咱們經過腳本名,來知道這個文件是幹什麼用的。

 

 

 

腳本內容:

 

各類能夠執行的命令

 

2.1.2 腳本執行

 

shell執行的方式

 

Shell腳本的執行一般能夠採用如下幾種方式

 

 

 

/bin/bash /path/to/script-name 或 bash /path/to/script-name (強烈推薦使用

 

/path/to/script-name 或 ./script-name (當前路徑下執行腳本)

 

source script-name 或 . script-name (注意.「點號)

 

 

 

執行說明:

 

1腳本文件自己沒有可執行權限或者腳本首行沒有命令解釋器時使用的方法,咱們推薦用bash執行。

 

使用頻率:☆☆☆☆☆

 

2腳本文件具備可執行權限時使用。

 

使用頻率:☆☆☆☆

 

3、使用source或者.點號,加載shell腳本文件內容,使shell腳本內容環境和當前用戶環境一致。

 

使用頻率:☆☆☆

 

使用場景:環境一致性

 

2.1.2 腳本開發規範

 

1、腳本命名要有意義,文件後綴是.sh

 

2、腳本文件首行是並且必須是腳本解釋器

 

#!/bin/bash

 

3、腳本文件解釋器後面要有腳本的基本信息等內容

 

腳本文件中儘可能不用中文註釋;

 

       儘可能用英文註釋,防止本機或切換系統環境後中文亂碼的困擾

 

常見的註釋信息:腳本名稱、腳本功能描述、腳本版本、腳本做者、聯繫方式等

 

4、腳本文件常見執行方式:bash 腳本名

 

5、腳本內容執行:從上到下,依次執行

 

6、代碼書寫優秀習慣;

 

    1)成對內容的一次性寫出來,防止遺漏

 

如:(){}[]''``""

 

    2[]中括號兩端要有空格,書寫時便可留出空格[    ],而後再退格書寫內容。

 

    3)流程控制語句一次性書寫完,再添加內容

 

7、經過縮進讓代碼易讀;(即該有空格的地方就要有空格)

 

---------------

 

 

 

2.2 變量

 

變量的學習咱們主要從四個方面來學習:

 

變量的定義和分類  

 

本地變量

 

全局變量

 

shell內置變量

 

 

 

2.2.1 什麼是變量

 

變量是什麼?

 

變量包括兩部分

 

變量名 不變的

 

變量值 變化的

 

咱們通常所說的變量指的是:變量名

 

2.2.2 本地變量

 

本地變量是什麼?

 

本地變量就是:在當前系統的某個環境下才能生效的變量,做用範圍小。

 

本地變量包含兩種:普通變量和命令變量

 

 

 

普通變量:

 

普通變量的定義方式有以下三種,接下來咱們就分別說一下這三種方式:

 

 

 

方式一:

 

變量名=變量值

 

重點:

 

變量值必須是一個總體,中間沒有特殊字符

 

方式二:

 

變量名='變量值'

 

重點:

 

我看到的內容,我就輸出什麼內容

 

方式三:

 

變量名="變量值"

 

重點:

 

若是變量值範圍內,有能夠解析的變量A,那麼首先解析變量A,將A的結果和其餘內容組合成一個總體,從新賦值給變量B

 

 

 

習慣:

 

數字不加引號,其餘默認加雙引號

 

 

 

 

 

命令變量(熟練)

 

命令變量有兩種定義方式,接下來咱們就來介紹一下這兩種方式

 

 

 

定義方式一:

 

變量名=`命令`

 

注意:

 

` 是反引號

 

 

 

定義方式二:

 

變量名=$(命令)

 

 

 

執行流程:

 

1、執行`或者$()範圍內的命令

 

2、將命令執行後的結果,賦值給新的變量名A

 

---------------

 

 

 

2.2.3 全局變量

 

全局變量是什麼

 

全局變量就是:當前shell以及其派生出來的子shell中都有效的變量。

 

 

 

 

 

查看全局變量命令

 

能夠經過命令查看全局變量

 

env只顯示全局變量

 

 

 

定義全局變量

 

方法一:

 

變量=

 

export 變量

 

方法二:(最經常使用)

 

export 變量=

 

 

 

 

 

2.2.4 變量查看和取消

 

查看變量:

 

方式一:

 

$變量名

 

場景:

 

私下裏,在命令行/腳本中使用

 

圖省事

 

方式二:

 

"$變量名"

 

場景:

 

私下裏,在命令行/腳本中使用

 

圖省事

 

方式三:

 

${變量名}

 

場景:

 

echo " hello ${變量名} world "

 

使用頻率較高

 

方式四:

 

"${變量名}"

 

場景:

 

標準使用方式

 

 

 

取消變量

 

unset 變量名

 

---------------

 

 

 

2.2.5 shell內置變量

 

咱們以前學習的本地變量,全局變量都是須要經過定義,而後才能實現相應功能的,那麼有沒有一些變量咱們能夠直接拿過來使用實現某種具體的功能呢?有,這就是shell內置變量

 

和腳本文件有關

 

符號 意義

 

$0 獲取當前執行的shell腳本文件名,包括腳本路徑

 

$n 獲取當前執行的shell腳本的第n個參數值,n=1..9,當n0時表示腳本的文件名,若是n大於9就要用大 括號括起來${10}

 

$# 獲取當前shell命令行中參數的總個數

 

$? 獲取執行上一個指令的返回值(0爲成功,非0爲失敗)

 

 

 

重點內置變量演示效果:

 

$0 獲取腳本的名稱

 

示例:

 

#!/bin/bash

 

# 獲取腳本的名稱

 

echo "我腳本的名稱是: file.sh"

 

echo "我腳本的名稱是:$0"

 

 

 

$# 獲取當前腳本傳入參數的數量

 

示例:

 

# cat num.sh

 

#!/bin/bash

 

# 獲取當前腳本傳入的參數數量

 

echo "當前腳本傳入的參數數量是: $#"

 

 

 

$n 獲取當前腳本傳入的第n個位置的參數

 

示例:

 

#!/bin/bash

 

# 獲取指定位置的參數

 

echo "第一個位置的參數是: $1"

 

echo "第二個位置的參數是: $2"

 

echo "第三個位置的參數是: $3"

 

echo "第四個位置的參數是: $4"

 

 

 

$? 獲取文件執行或者命令執行的返回狀態值

 

示例:

 

# bash nihao

 

bash: nihao: No such file or directory

 

# echo $?

 

127

 

 

 

# ls

 

file1.sh  num.sh  test.sh  weizhi.sh

 

# echo $?

 

0

 

---------------

 

 

 

字符串精確截取

 

格式:${變量名:起始位置:截取長度}

 

 

 

示例:

 

  ${file:0:5} 從第1個字符開始,截取5個字符

 

  ${file::5} 從第1個字符開始,截取5個字符

 

  ${file:5:5} 從第6個字符開始,截取5個字符

 

${file:5} 從第6個字符開始,截取後面全部的字符

 

${file:0-5} 從倒數第5個字符開始,截取後面全部的字符

 

${file:0-6:3} 從倒數第6個字符開始,截取以後的3個字符

 

 

 

默認值相關

 

場景一:

 

變量a若是有內容,那麼就輸出a的變量值

 

變量a若是沒有內容,那麼就輸出默認的內容

 

 

 

格式:

 

${變量名:-默認值}

 

 

 

套餐示例:

 

若是我輸入的參數爲空,那麼輸出內容是 "您選擇的套餐是: 套餐 1"

 

若是我輸入的參數爲n,那麼輸出內容是 "您選擇的套餐是: 套餐 n"

 

#!/bin/bash

 

# 套餐選擇演示

 

a="$1"

 

echo "您選擇的套餐是: 套餐 ${a:-1}"

 

 

 

場景二:

 

不管變量a是否有內容,都輸出默認值

 

格式:

 

${變量名+默認值}

 

場景示例:

 

無論我說國家法定結婚年齡是 多少歲,都輸出 國家法定結婚年齡(男性)22

 

#!/bin/bash

 

# 默認值演示示例二

 

a="$1"

 

echo "國家法定結婚年齡(男性)${a+22} "

 

---------------

 

 

 

3 SHELL 進階

 

這部分的知識,咱們主要是從三個方面來學習:

 

測試語句

 

表達式(條件+計算)

 

linux常見符號和命令

 

 

 

3.1 表達式

 

要使Shell腳本程序具有必定的「邏輯能力」,面臨的第一個問題就是:區分不一樣的狀況以肯定執行何種操做,下面咱們就來學習解決這個問題---測試語句

 

3.1.1 測試語句

 

Shell環境根據命令執行後的返回狀態值($?)來判斷是否執行成功,當返回值爲0,表示成功,值爲其餘時,表示失敗。使用專門的測試工具---test命令,能夠對特定條件進行測試,並根據返回值來判斷條件是否成立(返回值0爲成立)

 

 

 

測試語句形式

 

A: test 條件表達式

 

B: [ 條件表達式 ]

 

格式注意:

 

以上兩種方法的做用徹底同樣,後者爲經常使用。

 

但後者須要注意方括號[]與條件表達式之間至少有一個空格。

 

test[] 的意思同樣

 

條件成立,狀態返回值是0

 

條件不成立,狀態返回值是1

 

 

 

操做注意:

 

[]兩側要有空格,表達式中的符號左右要有空格

 

root@ubuntu:~# [ 1 = 1 ]

 

root@ubuntu:~#  echo $?

 

0

 

root@ubuntu:~#  test 1 = 1

 

root@ubuntu:~#  echo $?

 

0

 

 

 

3.1.2 條件表達式

 

咱們這部份內容主要是介紹,測試語句中的 [ 條件表達式 ] 這一部分,測試的結果使用 echo $? 來查看

 

 

 

邏輯表達式

 

邏輯表達式通常用於判斷多個條件之間的依賴關係。

 

常見的邏輯表達式有: &&  和  ||

 

 

 

&&

 

命令1  &&  命令2

 

若是命令1執行成功,那麼我才執行命令2 -- 夫唱婦隨

 

若是命令1執行失敗,那麼命令2也不執行

 

示例:

 

# [ 1 = 1 ] && echo "條件成立"

 

條件成立

 

# [ 1 = 2 ] && echo "條件成立"

 

#

 

 

 

||

 

命令1 || 命令2

 

若是命令1執行成功,那麼命令2不執行 -- 對着幹

 

若是命令1執行失敗,那麼命令2執行

 

示例:

 

# [ 1 = 2 ] || echo "條件不成立"

 

條件不成立

 

# [ 1 = 1 ] || echo "條件不成立"

 

#

 

 

 

文件表達式

 

 

 

-f 判斷輸入內容是不是一個文件

 

示例:

 

# [ -f weizhi.sh ] && echo "是一個文件"

 

是一個文件

 

# [ -f weizhi.sddh ] || echo "不是一個文件"

 

不是一個文件

 

 

 

-d 判斷輸入內容是不是一個目錄

 

示例:

 

# [ -d weizhi.sddh ] || echo "不是一個目錄"

 

不是一個目錄

 

# mkdir nihao

 

# [ -d nihao ] && echo "是一個目錄"

 

是一個目錄

 

 

 

-x 判斷輸入內容是否可執行

 

示例:

 

# [ -x age.sh ] || echo "文件沒有執行權限"

 

文件沒有執行權限

 

# [ -x test.sh ] && echo "文件有執行權限"

 

文件有執行權限

 

 

 

數值操做符

 

 

 

主要根據給定的兩個值,判斷第一個與第二個數的關係,如是否大於、小於、等於第二個數。常見選項以下:

 

n1 -eq n2            相等

 

n1 -ge n2            大於或等於

 

n1 -gt n2            大於

 

n1 -le n2            小於等於

 

n1 -lt n2            小於

 

n1 -ne n2            不等於

 

 

 

字符串比較

 

 

 

str1 == str2 str1str2字符串內容一致

 

str1 != str2 str1str2字符串內容不一致,!表示相反的意思

 

實踐

 

判斷字符是否內容一致

 

root@ubuntu:~# [ a == a ]

 

root@ubuntu:~# echo $?

 

0

 

root@ubuntu:~# [ a != a ]

 

root@ubuntu:~# echo $?

 

1

 

---------------

 

 

 

3.1.3 計算表達式

 

定義:

 

計算表達式,簡單來講就是對具體的內容進行算數計算

 

 

 

格式:

 

方式一:

 

$(())   $(( 計算表達式 ))

 

方式二:

 

let let 計算表達式

 

 

 

注意:

 

$(())中只能用+-*/()運算符,而且只能作整數運算

 

 

 

$(())演示效果

 

格式:a=$((變量名a+1))

 

注意:

 

表達式範圍內,空格不限制

 

計算示例

 

root@ubuntu:~# echo $((100/5))

 

20

 

 

 

let演示效果

 

格式:let 變量名a=變量名a+1

 

注意:

 

表達式必須是一個總體,中間不能出現空格等特殊字符

 

let示例

 

root@ubuntu:~# i=1

 

root@ubuntu:~# let i=i+7

 

root@ubuntu:~# echo $i

 

8

 

3.2 linux常見符號

 

接下來咱們來介紹幾個linux的場景符號:

 

重定向符號、管道符、其餘符號

 

3.2.1 重定向符號

 

shell腳本中有兩種常見的重定向符號 >  >>

 

 

 

> 符號

 

做用:

 

> 表示將符號左側的內容,以覆蓋的方式輸入到右側文件中

 

演示:

 

查看文件內容

 

admin-1@ubuntu:~$ cat file.txt

 

nihao

 

使用重定向符號給文件中增長內容

 

admin-1@ubuntu:~$ echo "file1.txt" > file.txt

 

再次查看文件內容

 

admin-1@ubuntu:~$ cat file.txt

 

file1.txt

 

 

 

 >> 符號

 

做用:

 

>> 表示將符號左側的內容,以追加的方式輸入到右側文件的末尾行中

 

演示:

 

查看文件內容

 

admin-1@ubuntu:~$ cat file.txt

 

file1.txt

 

使用重定向符號給文件中增長內容

 

admin-1@ubuntu:~$ echo "file2.txt" >> file.txt

 

再次查看文件內容

 

admin-1@ubuntu:~$ cat file.txt

 

file1.txt

 

file2.txt

 

 

 

3.2.2 管道符 |

 

定義:

 

| 這個就是管道符,傳遞信息使用的

 

 

 

使用格式:

 

命令1 | 命令2

 

管道符左側命令1 執行後的結果,傳遞給管道符右側的命令2使用

 

 

 

命令演示:

 

查看當前系統中的全局變量SHELL

 

admin-1@ubuntu:~$ env | grep SHELL

 

SHELL=/bin/bash

 

 

 

3.2.3 其餘符號

 

後臺展現符號 &

 

定義:

 

& 就是將一個命令從前臺轉到後臺執行

 

使用格式:

 

命令 &

 

命令演示:

 

admin-1@ubuntu:~# sleep 4

 

界面卡住4秒後消失

 

admin-1@ubuntu:~# sleep 10 &

 

[1] 4198

 

admin-1@ubuntu:~# ps aux | grep sleep

 

root       4198  0.0  0.0   9032   808 pts/17   S    21:58   0:00 sleep 10

 

root       4200  0.0  0.0  15964   944 pts/17   S+   21:58   0:00 grep --color=auto sleep

 

 

 

所有信息符號 2>&1

 

符號詳解:

 

1 表示正確輸出的信息

 

2 表示錯誤輸出的信息

 

2>&1 表明全部輸出的信息

 

符號示例

 

標準正確輸出示例

 

cat nihao.txt 1>> zhengque

 

標準錯誤輸出示例

 

dsfadsfadsfa 2>> errfile

 

 

 

綜合演練示例

 

腳本內容

 

#!/bin/bash

 

echo '下一條錯誤命令'

 

dsfsafsafdsa

 

腳本執行效果

 

admin-1@ubuntu:~# bash ceshi.sh

 

下一條錯誤命令

 

ceshi.sh: line 3: dsfsafsafdsa: command not found

 

1 2 綜合演練

 

admin-1@ubuntu:~# bash ceshi.sh 1>> ceshi-ok 2>> ceshi-err

 

admin-1@ubuntu:~# cat ceshi-ok

 

下一條錯誤命令

 

admin-1@ubuntu:~# cat ceshi-err

 

ceshi.sh: line 3: dsfsafsafdsa: command not found

 

所有信息演練

 

admin-1@ubuntu:~# bash ceshi.sh >> ceshi-all 2>&1

 

admin-1@ubuntu:~# cat ceshi-all

 

下一條錯誤命令

 

ceshi.sh: line 3: dsfsafsafdsa: command not found

 

 

 

linux系統垃圾桶

 

/dev/null linux下的一個設備文件,

 

這個文件相似於一個垃圾桶,特色是:容量無限大

 

 

 

3.3 常見命令詳解

 

接下來咱們介紹一些shell腳本中常用的linux命令:grepsedawkfind

 

3.3.1 grep命令詳解

 

grep命令是咱們經常使用的一個強大的文本搜索命令。

 

命令格式詳解

 

grep [參數] <文件名>

 

注意:

 

咱們在查看某個文件的內容的時候,是須要有<文件名>

 

grep命令在結合|(管道符)使用的狀況下,後面的<文件名>是沒有的

 

能夠經過 grep --help 查看grep的幫助信息

 

參數詳解

 

-c:只輸出匹配行的計數。

 

-n:顯示匹配行及行號。

 

-v:顯示不包含匹配文本的全部行。

 

 

 

模板文件

 

admin-1@ubuntu:~$ cat find.txt

 

nihao aaa

 

nihao AAA

 

NiHao bbb

 

nihao CCC

 

-c: 輸出匹配到aaa的個數

 

admin-1@ubuntu:~$ grep -c aaa find.txt

 

1

 

-n: 輸出匹配內容,同時顯示行號

 

admin-1@ubuntu:~$ grep -n CCC find.txt

 

4:nihao CCC

 

-v: 匹配到的內容部輸出,輸出不匹配的內容

 

admin-1@ubuntu:~$ grep -v ni find.txt

 

NiHao bbb

 

---------------

 

 

 

3.3.2 sed命令詳解

 

sed 文件編輯工具。由於它編輯文件是以行爲單位的。

 

命令格式詳解

 

 

 

命令格式:

 

sed [參數] '<匹配條件> [動做]' [文件名]

 

注意:

 

能夠經過 sed --help 查看grep的幫助信息

 

參數詳解:

 

參數爲空 表示sed的操做效果,實際上不對文件進行編輯

 

-i 表示對文件進行編輯

 

 

 

匹配條件:

 

匹配條件分爲兩種:數字行號或者關鍵字匹配

 

關鍵字匹配格式:

 

'/關鍵字/'

 

注意:

 

隔離符號 / 能夠更換成 @#、!等符號

 

根據狀況使用,若是關鍵字和隔離符號有衝突,就更換成其餘的符號便可。

 

 

 

動做詳解

 

-a 在匹配到的內容下一行增長內容

 

-i 在匹配到的內容上一行增長內容

 

-d 刪除匹配到的內容

 

-s 替換匹配到的內容

 

注意:

 

上面的動做應該在參數爲-i的時候使用,否則的話不會有效果

 

替換命令演示

 

關於替換,咱們從三個方面來學習:

 

行號、列號、全體

 

命令格式:

 

sed -i [替換格式] [文件名]

 

注意:替換命令的寫法

 

's###'  --->  's#原內容##' ---> 's#原內容#替換後內容#'

 

 

 

常見替換格式:

 

模板文件內容

 

admin-1@ubuntu:~$ cat sed.txt

 

nihao sed sed sed

 

nihao sed sed sed

 

nihao sed sed sed

 

 

 

替換每行首個匹配內容:

 

sed -i 's#原內容#替換後內容#' 文件名

 

 

 

示例:替換首每行的第1sedSED

 

admin-1@ubuntu:~$ sed -i 's#sed#SED#' sed.txt

 

admin-1@ubuntu:~$ cat sed.txt

 

nihao SED sed sed

 

nihao SED sed sed

 

nihao SED sed sed

 

 

 

替換所有匹配內容:

 

sed -i 's#原內容#替換後內容#g' 文件名

 

 

 

示例:替換所有seddes

 

admin-1@ubuntu:~$ sed -i 's#sed#SED#g' sed.txt

 

admin-1@ubuntu:~$ cat sed.txt

 

nihao SED SED SED

 

nihao SED SED SED

 

nihao SED SED SED

 

 

 

指定行號替換首個匹配內容:

 

sed -i '行號s#原內容#替換後內容#' 文件名

 

 

 

示例:替換第2行的首個SEDsed

 

admin-1@ubuntu:~$ sed -i '2s#SED#sed#' sed.txt

 

admin-1@ubuntu:~$ cat sed.txt

 

nihao SED SED SED

 

nihao sed SED SED

 

nihao SED SED SED

 

 

 

首行指定列號替換匹配內容:

 

sed -i 's#原內容#替換後內容#列號' 文件名

 

 

 

示例:替換每行的第2SEDsed

 

admin-1@ubuntu:~$ sed -i 's#SED#sed#2' sed.txt

 

admin-1@ubuntu:~$ cat sed.txt

 

nihao SED sed SED

 

nihao sed sed SED

 

nihao SED sed SED

 

 

 

指定行號列號匹配內容:

 

sed -i '行號s#原內容#替換後內容#列號' 文件名

 

 

 

示例:替換第3行的第2SEDsed

 

admin-1@ubuntu:~$ sed -i '3s#SED#sed#2' sed.txt

 

admin-1@ubuntu:~$ cat sed.txt

 

nihao SED sed SED

 

nihao sed sed SED

 

nihao SED sed sed

 

 

 

增長操做

 

 

 

做用:

 

在指定行號的下一行增長內容

 

格式:

 

sed -i '行號a\增長的內容' 文件名

 

注意:

 

若是增長多行,能夠在行號位置寫個範圍值,彼此間使用逗號隔開,例如

 

sed -i '1,3a\增長內容' 文件名

 

 

 

演示效果:

 

指定行號下一行增長內容

 

admin-1@ubuntu:~$ sed -i '2a\zengjia-2' sed.txt

 

admin-1@ubuntu:~$ cat sed.txt

 

nihao SED sed SED

 

nihao sed SED sed

 

zengjia-2

 

nihao SED sed sed

 

指定1~3每行都增長內容

 

admin-1@ubuntu:~$ sed -i '1,3a\tongshi-2' sed.txt

 

admin-1@ubuntu:~$ cat sed.txt

 

nihao SED sed SED

 

tongshi-2

 

nihao sed SED sed

 

tongshi-2

 

zengjia-2

 

tongshi-2

 

nihao SED sed sed

 

 

 

做用:

 

在指定行號的上一行增長內容

 

格式:

 

sed -i '行號i\增長的內容' 文件名

 

注意:

 

若是增長多行,能夠在行號位置寫個範圍值,彼此間使用逗號隔開,例如

 

sed -i '1,3a\增長內容' 文件名

 

 

 

演示效果:

 

指定行號上一行增長內容

 

admin-1@ubuntu:~$ sed -i '1i\insert-1' sed.txt

 

admin-1@ubuntu:~$ cat sed.txt

 

insert-1

 

nihao SED sed SED

 

tongshi-2

 

nihao sed SED sed

 

tongshi-2

 

zengjia-2

 

tongshi-2

 

nihao SED sed sed

 

 

 

刪除操做

 

 

 

做用:

 

指定行號刪除

 

格式:

 

sed -i '行號d' 文件名

 

注意:

 

若是刪除多行,能夠在行號位置多寫幾個行號,彼此間使用逗號隔開,例如

 

sed -i '1,3d' 文件名

 

 

 

刪除演練

 

刪除第4行內容

 

admin-1@ubuntu:~$ sed -i '4d' sed.txt

 

admin-1@ubuntu:~$ cat sed.txt

 

insert-1

 

nihao SED sed SED

 

tongshi-2

 

tongshi-2

 

zengjia-2

 

tongshi-2

 

nihao SED sed sed

 

 

 

刪除多行(3-5)內容

 

admin-1@ubuntu:~$ sed -i '3,5d' sed.txt

 

admin-1@ubuntu:~$ cat sed.txt

 

insert-1

 

nihao SED sed SED

 

tongshi-2

 

nihao SED sed sed

 

---------------

 

 

 

3.3.3 awk命令詳解

 

awk是一個功能很是強大的文檔編輯工具,它不只能以行爲單位還能以列爲單位處理文件。

 

命令格式:

 

awk [參數] '[ 動做]' [文件名]

 

 

 

常見參數:

 

-F 指定行的分隔符

 

 

 

常見動做:

 

print 顯示內容

 

$0 顯示當前行全部內容

 

$n 顯示當前行的第n列內容

 

 

 

常見內置變量

 

FILENAME 當前輸入文件的文件名,該變量是隻讀的

 

NR 指定顯示行的行號

 

NF 輸出最後一列的內容

 

OFS 輸出格式的列分隔符,缺省是空格

 

FS 輸入文件的列分融符,缺省是連續的空格和Tab

 

 

 

命令演示

 

 

 

模板文件內容

 

admin-1@ubuntu:~$ cat awk.txt

 

nihao awk awk awk

 

nihao awk awk awk

 

 

 

打印指定列內容

 

打印第1列的內容

 

admin-1@ubuntu:~$ awk '{print $1}' awk.txt

 

nihao

 

nihao

 

 

 

指定隔離分隔符,查看內容

 

admin-1@ubuntu:~$ cat linshi.txt

 

root:x:0:0:root:/root:/bin/bash

 

admin-1@ubuntu:~$ awk -F ':' '{print $1,$7}' linshi.txt

 

root /bin/bash

 

 

 

設置顯示分隔符,顯示內容

 

admin-1@ubuntu:~$ awk 'BEGIN{OFS=":"} {print NR,$0}' awk.txt

 

1:nihao awk awk awk

 

2:nihao awk awk awk

 

3.3.4 find命令詳解

 

命令格式:

 

find [路徑] [參數] [關鍵字]

 

參數詳解

 

-name 按照文件名查找文件。

 

-type 查找某一類型的文件,

 

諸如:

 

b - 塊設備文件 d - 目錄 c - 字符設備文件

 

p - 管道文件 l - 符號連接文件 f - 普通文件。

 

命令演示

 

在當前系統中查找一個叫awk的文件

 

admin-1@ubuntu:~$ sudo find /home/admin-1/ -name "awk.txt"

 

/home/admin-1/awk.txt

 

在當前系統中查找文件類型爲普通文件的文件

 

admin-1@ubuntu:~$ find /tmp -type f

 

/tmp/.X0-lock

 

/tmp/vgauthsvclog.txt.0

 

/tmp/unity_support_test.0

 

/tmp/config-err-4igbXW

 

---------------

 

 

 

4章 流程控制

 

shell的語句中,流程控制主要分爲兩種:

 

簡單流程控制語句:選擇和循環

 

複雜流程控制語句:函數

 

4.1 簡單流程控制語句

 

4.1.1 單分支if語句

 

語法格式

 

if [ 條件 ]

 

then

 

   指令

 

fi

 

 

 

場景:

 

單一條件,只有一個輸出

 

 

 

單分支if語句示例

 

#!/bin/bash

 

# if語句的使用場景

 

if [ "$1" == "nan" ]

 

then

 

   echo "您的性別是 男"

 

fi

 

 

 

4.1.2 雙分支if語句

 

語法格式

 

if [ 條件 ]

 

then

 

   指令1

 

else

 

  指令2

 

fi

 

場景:

 

一個條件,兩種結果

 

 

 

雙分支if語句示例

 

#!/bin/bash

 

# if語句的使用場景

 

if [ "$1" == "nan" ]

 

then

 

   echo "您的性別是 男"

 

else

 

   echo "您的性別是 女"

 

fi

 

 

 

4.1.3 多分支if語句

 

語法格式

 

if [ 條件 ]

 

then

 

   指令1

 

elif [ 條件2 ]

 

then

 

  指令2

 

else

 

  指令3

 

fi

 

場景:

 

n個條件,n+1個結果

 

 

 

多分支if語句示例

 

#!/bin/bash

 

# if語句的使用場景

 

if [ "$1" == "nan" ]

 

then

 

   echo "您的性別是 男"

 

elif [ "$1" == "nv" ]

 

then

 

   echo "您的性別是 女"

 

else

 

   echo "您的性別,我不知道"

 

fi

 

---------------

 

 

 

if語句生產場景:服務的啓動

 

需求:

 

要求腳本執行須要有參數,經過傳入參數來實現不一樣的功能。

 

 

 

參數和功能詳情以下:

 

參數 執行效果

 

start 服務啓動中...

 

stop 服務關閉中...

 

restart 服務重啓中...

 

* 腳本 X.sh 使用方式 X.sh [ start|stop|restart ]

 

 

 

腳本內容

 

admin-1@ubuntu:/data/scripts/python-n# cat if.sh

 

#!/bin/bash

 

# if語句的使用場景

 

if [ "$1" == "start" ]

 

then

 

   echo "服務啓動中..."

 

elif [ "$1" == "stop" ]

 

then

 

   echo "服務關閉中..."

 

elif [ "$1" == "restart" ]

 

then

 

   echo "服務重啓中..."

 

else

 

   echo "$0 腳本的使用方式: $0 [ start | stop | restart ]"

 

fi

 

 

 

4.1.4 case選擇語句

 

咱們發現多if語句使用的時候,代碼量不少,並且總體看起來確實有那麼一丁點亂,有沒有辦法更好的實現這種效果呢?就是Case語句。

 

 

 

case 語句格式

 

case 變量名 in

 

   1)

 

      指令1

 

         ;;

 

   2)

 

      指令2

 

         ;;

 

   3)

 

    指令3

 

         ;;

 

esac

 

注意:

 

首行關鍵字是case,末行關鍵字esac

 

選擇項後面都有 )

 

每一個選擇的執行語句結尾都有兩個分號;

 

 

 

case語句示例

 

場景:在多if語句的基礎上對腳本進行升級

 

需求:

 

要求腳本執行須要有參數,經過傳入參數來實現不一樣的功能。

 

 

 

參數和功能詳情以下:

 

參數 執行效果

 

start 服務啓動中...

 

stop 服務關閉中...

 

restart 服務重啓中...

 

* 腳本 X.sh 使用方式 X.sh [ start|stop|restart ]

 

 

 

腳本內容:

 

# cat case.sh

 

#!/bin/bash

 

# case語句使用場景

 

case "$1" in

 

"start")

 

echo "服務啓動中..."

 

;;

 

"stop")

 

echo "服務關閉中..."

 

;;

 

"restart")

 

echo "服務重啓中..."

 

;;

 

*)

 

echo "$0 腳本的使用方式: $0 [ start | stop | restart ]"

 

;;

 

esac

 

---------------

 

 

 

4.1.5 for循環語句

 

循環指定的全部元素,循環完畢以後就推出

 

語法格式

 

語法格式

 

for in 列表

 

do

 

   執行語句

 

done

 

 

 

場景:

 

遍歷列表

 

 

 

注意:

 

for」 循環老是接收 「in」 語句以後的某種類型的字列表

 

執行次數和list列表中常數或字符串的個數相同,當循環的數量足夠了,就自動退出

 

對於固定次數的循環,能夠經過seq命令來實現,就不須要變量的自增了

 

 

 

示例:遍歷文件

 

#!/bin/bash

 

# for語句的使用示例

 

file=`ls /data/scripts/python10`

 

for i in "${file}"

 

do

 

  echo "${i}"

 

done

 

 

 

示例2:遍歷數字

 

#!/bin/bash

 

# for 語句示例2

 

num=$(seq 10)

 

for i in "${num}"

 

do

 

  echo "${i}"

 

done

 

 

 

4.1.6 while循環語句

 

語法格式

 

while 條件

 

do

 

   執行語句

 

done

 

注意:

 

條件的類型:

 

命令、[[ 字符串表達式 ]](( 數字表達式 ))

 

 

 

場景:

 

只要條件知足,就一直循環下去

 

 

 

while語句示例

 

腳本內容

 

#!/bin/bash

 

# while的示例

 

a=1

 

while [ "${a}" -lt 5 ]

 

do

 

   echo "${a}"

 

   a=$((a+1))

 

done

 

---------------

 

 

 

4.2 複雜流程控制語句

 

函數就是咱們的複雜流程控制語句

 

4.2.1 函數基礎知識

 

函數是什麼?

 

函數就是將某些命令組合起來實現某一特殊功能的方式,是腳本編寫中很是重要的一部分。

 

簡單函數格式:

 

定義函數:

 

函數名(){

 

函數體

 

}

 

調用函數:

 

函數名

 

 

 

傳參函數格式:

 

傳參數

 

函數名 參數

 

函數體調用參數:

 

函數名(){

 

函數體 $n

 

}

 

注意:

 

相似於shell內置變量中的位置參數

 

4.2.2 函數實踐

 

簡單函數定義和調用示例

 

#!/bin/bash

 

# 函數使用場景一:執行頻繁的命令

 

dayin(){

 

  echo "wo de mingzi shi  111"

 

}

 

dayin

 

 

 

函數傳參和函數體內調用參數示例

 

#!/bin/bash

 

# 函數的使用場景二

 

dayin(){

 

  echo "wo de mingzi shi $1"

 

}

 

dayin 111

 

 

 

函數調用腳本傳參

 

#!/bin/bash

 

# 函數傳參演示

 

 

 

# 定義傳參數函數

 

dayin(){

 

  echo "wode mignzi shi $1"

 

}

 

 

 

# 函數傳參

 

dayin $1

 

腳本傳多參,函數分別調用示例

 

#!/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

 

---------------

 

 

 

5 章 代碼發佈

 

5.1 代碼發佈簡介

 

到如今爲止咱們學會了多個開發項目案例,也知道工做中如何作一個項目,可是一個項目方案的如何部署到公司的線上服務器上,部署過程當中都會經歷哪些事情呢?接下來咱們好好的來梳理一下。

 

5.1.1 代碼發佈介紹

 

什麼是代碼發佈?

 

代碼發佈就是一句話:將咱們的代碼放到一臺公司的互聯網服務器上。

 

那麼咱們應該怎麼來理解這句話呢?咱們從三個方面來理解他。

 

 

 

如何理解這句話?

 

發佈什麼?

 

代碼 通過測試,功能完善,沒有問題的代碼

 

發佈到哪裏?

 

服務器 全部人都能訪問的到的一臺服務器(有公網IP)

 

idc機房、阿里雲、亞馬遜、騰訊雲、華爲雲、....

 

發佈的效果?

 

web網頁對外展現

 

 

 

5.1.2 發佈方式

 

常見的代碼發佈方式有兩種:手工方式和腳本方式。

 

這兩種方式有什麼區別呢?咱們接下來好好的對比分析一下。

 

 

 

手工發佈代碼 步行

 

 

干擾因素多

 

不安全

 

 

 

腳本發佈代碼 坐車

 

 

干擾因素少

 

安全

 

5.2 代碼發佈流程

 

5.2.1 流程簡介

 

接下來咱們來好好的說一下部署的流程:

 

 

 

---------------

 

 

 

5.2.2 流程詳解

 

接下來咱們來對每一個過程進行一個仔細的敘述

 

部署場景:

 

兩臺主機作部署動做

 

 

 

注意:

 

部署的文件就是兩臺主機右上角的紅色內容

 

 

 

獲取代碼

 

 

 

代碼倉庫

 

集中式的

 

svn

 

分佈式的

 

git

 

區別:

 

svn的幾乎全部操做命令,都集中在我和代碼倉庫服務器處於網絡鏈接狀態。

 

git的幾乎全部操做命令,能夠在本地完成,和代碼倉庫服務器是否鏈接無關。

 

 

 

公司的代碼倉庫:

 

私有倉庫 gitlab

 

內部服務器或者公網服務器

 

 

 

倉庫權限

 

只有項目的開發人員纔有權限,項目以外的人沒有權限

 

 

 

代碼權限:

 

開發、管理、查看

 

 

 

提交的方式:

 

代碼版本號

 

 

 

打包代碼

 

目的:

 

減小傳輸文件數量

 

減少傳輸文件大小

 

加強傳輸速率

 

 

 

常見打包方式:

 

windows:

 

ziprar...

 

linux

 

tarzip...

 

 

 

場景演示:

 

 

 

傳輸代碼

 

傳輸方式:

 

有網狀況下

 

多種方式:

 

gitftpscp、共享掛載 cprsync

 

 

 

沒有網狀況下

 

物理方式:

 

U盤或者硬盤

 

場景效果:

 

 

 

關閉應用

 

開啓什麼應用,就關閉什麼應用

 

 

 

解壓代碼:

 

tar xf ...

 

 

 

放置代碼

 

爲了不咱們在放置代碼過程當中,對老文件形成影響,因此咱們放置代碼通常分爲兩步:備份老文件和放置新文件。

 

備份原文件

 

 

 

放置新文件

 

 

 

 

 

注意:

 

兩個文件的名稱是同樣的,只是內容不一樣

 

對整個應用項目來講,兩個文件沒有區別

 

 

 

開啓應用

 

關閉什麼應用就開啓什麼應用

 

 

 

檢查

 

查看瀏覽器效果

 

---------------

 

 

 

5.2.3 技術關鍵點

 

文件的壓縮和解壓

 

文件的壓縮

 

壓縮格式:

 

tar zcvf 壓縮後的文件名  將要壓縮的文件

 

文件的解壓

 

解壓格式:

 

tar xzf 壓縮後的文件名

 

 

 

命令參數詳解

 

z 指定壓縮文件的格式爲 tar.gz

 

c 表示壓縮

 

v 顯示詳細過程

 

f 指定壓縮文件

 

x 解壓

 

 

 

查看壓縮文件內容

 

zcat 壓縮文件

 

 

 

文件的傳輸

 

scp傳輸工具:

 

命令格式:

 

scp  要傳輸的文件 要放置的位置

 

 

 

將本地文件推送到遠程主機

 

scp python.tar.gz root@192.168.8.15:/root/

 

將遠程主機的文件拉取到本地

 

scp root@192.168.8.15:/root/python.tar.gz ./

 

 

 

遠端主機文件放置位置的表示形式:

 

遠程鏈接的用戶@遠程主機:遠程主機的目錄路徑

 

遠端主機文件位置的表示形式:

 

遠程鏈接的用戶@遠程主機:遠程主機的文件路徑

 

 

 

文件的備份

 

文件的備份要有必定的標誌符號,咱們就使用目前通用的時間戳的形式來表示

 

 

 

date命令詳解:

 

命令格式:date [option]

 

常見參數:

 

%F 顯示當前日期格式,%Y-%m-%d

 

%T 顯示當前時間格式,%H:%M:%S

 

 

 

演示效果:

 

顯示當前日期

 

# date +%F

 

2017-09-28

 

顯示當前時間

 

# date +%T

 

03:06:30

 

 

 

根據上面的參數介紹,咱們能夠指定命令顯示的格式,

 

年月日:date +%Y%m%d

 

時分秒:date +%H%M%S

 

 

 

演示效果:

 

顯示當前日期

 

# date +%Y%m%d

 

20170928

 

顯示當前時間

 

# date +%H%M%S

 

030643

 

 

 

指定時間戳格式:

 

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

 

 

 

時間戳演示效果:

 

指定的時間戳格式

 

# date +%Y%m%d%H%M%S

 

20170928030742

 

 

 

備份命令效果格式:

 

方式一:複製備份

 

cp nihao nihao-$(date +%Y%m%d%H%M%S)

 

方式二:移動備份

 

mv nihao nihao-$(date +%Y%m%d%H%M%S)

 

咱們爲了不在放置新文件時候,出現驗證操做,咱們肯定採用方式二:

 

---------------

 

 

 

6 章 環境部署

 

環境部署這塊,咱們須要有一個項目的基礎環境,而後在這個基礎環境上,再根據項目需求搭建一個能讓項目代碼正常運行的環境。因此這塊的知識,咱們從三個方面來學習

 

基礎環境

 

方案分析

 

項目環境部署

 

6.1 基礎環境

 

6.1.1 基礎目錄環境

 

使用root用戶進行全部的操做

 

sudo passwd root

 

 

 

windows中使用xshell鏈接linux

 

vi /etc/ssh/sshd_config

 

#PermitRootLogin prohibit-password

 

PermitRootLogin yes

 

service ssh restart

 

 

 

建立基本目錄

 

# mkdir /data/{server,logs,backup,softs,virtual,scripts,codes} -p

 

# ls /data/

 

backup  logs  scripts  server  softs  virtual  codes

 

查看

 

admin-1@ubuntu:/data# tree -L 1 /data/

 

/data/

 

├── backup 備份

 

├── codes 代碼

 

├── logs 日誌

 

├── scripts 腳本

 

├── server 服務

 

├── softs 軟件

 

└── virtual 虛擬環境

 

windows中使用xshell傳輸文件

 

sudo apt install lrzsz

 

rz

 

6.1.2 主機網絡環境

 

問題:

 

咱們上面進行文件傳輸的時候,發現一個問題,每次進行文件傳輸都須要進行密碼驗證,這對咱們來講,有些一丁點不舒服,那麼有沒有辦法,讓我舒服一點?

 

答案就是:主機間免祕鑰認證

 

 

 

知識點:

 

什麼是主機間免祕鑰認證?

 

就是我和另一臺主機作任何事情,不須要輸入密碼認證,很是很方便。

 

 

 

方案詳解

 

咱們要作主機間免祕鑰認證須要作三個動做

 

1、本機生成密鑰對

 

2、對端機器使用公鑰文件認證

 

3、驗證

 

 

 

方案實施

 

1、生成祕鑰對

 

ssh-keygen -t rsa

 

-t 指定祕鑰的類型  

 

rsa 祕鑰類型

 

 

 

祕鑰目錄:/root/.ssh/

 

私鑰 id_rsa 鑰匙

 

公鑰 id_rsa.pub 鎖

 

 

 

 

 

2、編輯認證文件

 

admin-1@ubuntu:~/.ssh# cat /root/.ssh/authorized_keys

 

ssh-rsa AAAAB3N...PVp admin-1@ubuntu

 

注意:

 

認證文件內容和8.15機器的公鑰文件內容一致

 

保證文件內容是一整行

 

 

 

3、編輯ssh配置文件

 

admin-1@ubuntu:~/.ssh# cat /etc/ssh/sshd_config

 

...

 

AuthorizedKeysFile %h/.ssh/authorized_keys

 

注意:

 

直接取消該行的註釋便可

 

 

 

4、配置文件生效

 

重啓ssh服務

 

service ssh restart

 

 

 

5、驗證操做

 

ssh root@192.168.8.15

 

 

 

15是在8.14上操做

 

2-4是在8.15上操做

 

---------------

 

 

 

6.2 方案分析

 

6.2.1 需求

 

需求:

 

部署一個環境,支持咱們的django項目正常運行

 

6.2.2 需求分析

 

分析:

 

2python環境 --->  3python虛擬環境

 

1django環境部署

 

4django軟件安裝

 

5、項目基本操做

 

6、應用基本操做

 

7viewurl配置

 

8、問題:只有本機能訪問

 

9、方案代理---- 10nginx

 

11nginx實現代理

 

13pcre軟件安裝

 

12nginx軟件安裝

 

14nginx基本操做

 

15nginx代理的配置

 

16、目錄結構

 

17、查看配置文件

 

18、找到對應的代理配置項

 

19、啓動django

 

20、啓動nginx

 

21、整個項目調試

 

6.2.3 部署方案

 

環境部署方案

 

1、django環境部署

 

1.1 python虛擬環境

 

1.2 django環境部署

 

1.2.1 django軟件安裝

 

1.2.2 項目基本操做

 

1.2.3 應用基本操做

 

1.2.4 viewurl配置

 

2、nginx代理django

 

2.1 nginx軟件安裝

 

2.1.1 pcre軟件安裝

 

2.1.2 nginx軟件安裝

 

2.1.3 nginx基本操做

 

2.2 nginx代理配置

 

2.2.1 目錄結構查看

 

2.2.2 配置文件查看

 

2.2.3 編輯代理配置項

 

3、項目調試

 

3.1 啓動軟件

 

3.1.1 啓動django

 

3.1.2 啓動nginx

 

3.2 整個項目調試

 

 

 

6.3 項目環境部署

 

6.3.1 python虛擬環境

 

軟件安裝

 

安裝虛擬環境軟件

 

sudo pip install virtualenv

 

sudo pip install virtualenvwrapper

 

虛擬環境基本操做

 

建立

 

mkvirtualenv 虛擬環境名稱

 

進入

 

workon 虛擬環境名稱

 

退出

 

deactivate

 

刪除

 

remove 虛擬環境名稱

 

6.3.2 django環境

 

django軟件安裝

 

注意:先進入虛擬環境

 

解壓

 

cd /data/soft

 

tar xf Django-1.10.7.tar.gz

 

查看

 

cd Django-1.10.7

 

cat INSTALL or README

 

安裝

 

python setup.py install

 

 

 

拓展知識點:

 

python類型軟件的安裝流程

 

普通:

 

解壓   安裝

 

特殊:

 

解壓    編譯 安裝

 

 

 

編譯:python setup.py build

 

 

 

 django項目操做

 

建立項目

 

cd /data/server

 

django-admin startproject itcast

 

django應用操做

 

建立應用

 

cd /data/server/itcast

 

python manage.py startapp test1

 

註冊應用

 

# vim itcast/settings.py

 

 

 

INSTALL_APP = [

 

。。。

 

'test1',

 

]

 

viewurl配置

 

view 配置文件生效

 

admin-1@ubuntu:/data/soft# cat /data/server/itcast/test1/views.py

 

from django.shortcuts import render

 

from django.http import HttpResponse

 

 

 

# Create your views here.

 

 

 

def hello(resquest):

 

   return HttpResponse("itcast V1.0")

 

 

 

url文件配置

 

admin-1@ubuntu:/data/soft# cat /data/server/itcast/itcast/urls.py

 

...

 

from test1.views import *

 

 

 

urlpatterns = [

 

url(r'^admin/', admin.site.urls),

 

url(r'^hello/$', hello),

 

]

 

 

 

啓動django

 

cd /data/server/itcast

 

python  manage.py runserver

 

---------------

 

 

 

6.3.3 nginx環境

 

pcre軟件安裝

 

解壓

 

cd /data/soft/

 

tar xzf pcre-8.39.tar.gz

 

查看幫助

 

cd pcre-8.39

 

INSTALL 或者 README

 

配置

 

./configure

 

編譯

 

make

 

安裝

 

make install

 

 

 

拓展知識點:

 

linux中軟件安裝的通常流程

 

解壓

 

tar

 

解壓文件,獲取真正的配置文件

 

配置

 

configure

 

根據默認的配置項或者更改配置項,生成編譯配置文件(Makefile)

 

編譯

 

make

 

根據 Makefile 內容,編譯生成指定的軟件所須要的全部文件

 

安裝

 

make install

 

將編譯生成的全部文件,轉移到軟件指定安裝的目錄下面

 

--prefix

 

 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

 

 

 

nginx簡單操做

 

檢查

 

/data/server/nginx/sbin/nginx -t

 

開啓

 

/data/server/nginx/sbin/nginx

 

關閉

 

/data/server/nginx/sbin/nginx -s stop

 

重載

 

/data/server/nginx/sbin/nginx -s reload

 

 

 

---------------

 

 

 

6.3.4 nginx代理django

 

nginx配置簡介

 

nginx的目錄結構

 

admin-1@ubuntu:/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配置

 

 

 

nginx代理配置

 

需求:

 

訪問192.168.8.14/hello/ 跳轉到 127.0.0.1:8000/hello/django服務

 

 

 

代理配置項

 

#location ~ \.php$ {

 

#    proxy_pass   http://127.0.0.1;

 

#}

 

 

 

編輯配置文件實現代理功能

 

配置內容

 

62: location /hello/ {

 

63: proxy_pass http://127.0.0.1:8000;

 

64: }

 

 

 

配置文件生效

 

/data/server/nginx/sbin/nginx -t

 

/data/server/nginx/sbin/nginx -s reload

 

---------------

 

 

 

7 章 手工代碼發佈

 

7.1 方案分析

 

發佈需求:

 

手工方式部署代碼

 

 

 

 

 

發佈方案:

 

獲取代碼

 

sed -i 's#文件原始的內容#替換後的內容#g' 要更改到文件名

 

打包代碼

 

 

 

傳輸代碼

 

 

 

關閉應用

 

解壓代碼

 

放置代碼

 

備份老文件

 

 

 

放置新文件

 

 

 

開啓應用

 

檢查

 

 

 

7.2 方案實施

 

獲取代碼

 

mkdir /data/codes -p

 

cd /data/codes

 

sed -i 's#1.0#1.1#' django/views.py

 

sed -i 's#原內容#替換後內容#g' 文件

 

分隔符:# / @

 

 

 

打包代碼

 

cd /data/codes/

 

tar zcf django.tar.gz django

 

 

 

注意:

 

前面兩步在192.168.8.15 上操做

 

 

 

傳輸代碼

 

scp root@192.168.8.15:/data/codes/django.tar.gz ./

 

關閉應用

 

關閉nginx應用

 

/data/server/nginx/sbin/nginx -s stop

 

 

 

關閉django應用

 

根據端口查看進程號,

 

lsof -Pti :8000

 

殺死進程號

 

kill 56502

 

一條命令搞定它:

 

kill $(lsof -Pti :8000)

 

 

 

解壓代碼

 

cd /data/codes

 

tar xf django.tar.gz

 

 

 

放置代碼

 

備份老文件

 

需求:備份的格式:

 

文件名-時間戳

 

時間戳:年月日時分秒

 

date +%Y%m%d%H%M%S

 

 

 

mv /data/server/itcast/test1/views.py /data/backup/views.py-$(date +%Y%m%d%H%M%S)

 

 

 

放置新文件

 

cd /data/codes

 

mv django/views.py /data/server/itcast/test1/

 

 

 

開啓應用

 

開啓django應用

 

source /data/virtual/venv/bin/activate

 

cd /data/server/itcast/

 

python manage.py runserver >> /dev/null 2>&1 &

 

deactivate

 

 

 

開啓nginx應用

 

/data/server/nginx/sbin/nginx

 

 

 

檢查

 

netstat -tnulp | grep :80

 

---------------

 

 

 

8 章 腳本發佈代碼

 

關於腳本發佈代碼部分呢,咱們將這個代碼部署流程拆分紅兩部分:簡單腳本(遠端主機上執行)和大型腳本(線上機器執行),這樣咱們能從兩個方面來學習生產中的腳本如何編寫。

 

8.1 簡單腳本編寫

 

8.1.1 命令羅列

 

實現簡單的功能--- 簡單的命令羅列

 

admin-1@ubuntu:/data/scripts# cat tar_code.sh

 

#!/bin/bash

 

# 功能:打包代碼

 

# 腳本名:tar_code.sh

 

# 做者:python n 期全體

 

# 版本:V 0.1

 

# 聯繫方式:長安街1號 太和殿旁邊 中南海1號廳

 

 

 

cd /data/codes

 

[ -f django.tar.gz ] && rm -f django.tar.gz

 

tar zcf django.tar.gz django

 

腳本編寫完成後,進行測試:

 

sed -i 's#1.1#1.2#' /data/codes/django/views.py

 

bash /data/scripts/tar_code.sh

 

查看壓縮文件內容

 

zcat django.tar.gz

 

8.1.2 固定內容變量化 

 

腳本優化之 固定內容變量化

 

admin-1@ubuntu:/data/scripts# cat tar_code.sh

 

#!/bin/bash

 

# 功能:打包代碼

 

# 腳本名:tar_code.sh

 

# 做者:python n 期全體

 

# 版本:V 0.2

 

# 聯繫方式:長安街1號 太和殿旁邊 中南海1號廳

 

 

 

FILE='django.tar.gz'

 

CODE_DIR='/data/codes'

 

CODE_PRO='django'

 

 

 

cd "${CODE_DIR}"

 

[ -f "${FILE}" ] && rm -f "${FILE}"

 

tar zcf "${FILE}" "${CODE_PRO}"

 

腳本編寫完成後,進行測試:

 

sed -i 's#1.2#1.3#' /data/codes/django/views.py

 

bash /data/scripts/tar_code.sh

 

查看壓縮文件內容

 

zcat django.tar.gz

 

8.1.3 功能函數化

 

腳本優化之 功能函數化

 

admin-1@ubuntu:/data/scripts# cat tar_code.sh

 

#!/bin/bash

 

# 功能:打包代碼

 

# 腳本名:tar_code.sh

 

# 做者:python n 期全體

 

# 版本:V 0.3

 

# 聯繫方式:長安街1號 太和殿旁邊 中南海2號廳

 

 

 

FILE='django.tar.gz'

 

CODE_DIR='/data/codes'

 

CODE_PRO='django'

 

 

 

code_tar(){

 

cd "${CODE_DIR}"

 

[ -f "${FILE}" ] && rm -f "${FILE}"

 

tar zcf "${FILE}" "${CODE_PRO}"

 

}

 

code_tar

 

腳本編寫完成後,進行測試:

 

sed -i 's#1.2#1.3#' /data/codes/django/views.py

 

bash /data/scripts/tar_code.sh

 

查看壓縮文件內容

 

zcat /data/codes/django.tar.gz

 

8.1.4 遠程執行

 

遠程命令執行

 

格式:

 

ssh 遠程主機登陸用戶名@遠程主機ip地址 "執行命令"

 

效果

 

admin-1@ubuntu:/data/server/itcast# ssh root@192.168.8.15 "ifconfig eth0"

 

eth0      Link encap:Ethernet  HWaddr 00:0c:29:f7:ca:d4  

 

  inet addr:192.168.8.15  Bcast:192.168.56.255  Mask:255.255.255.0

 

  ...

 

 

 

遠程執行腳本測試

 

遠程更新文件內容

 

ssh root@192.168.8.15 "sed -i /'s#1.4#1.5#' /data/codes/django/views.py"

 

遠程查看腳本

 

ssh root@192.168.8.15 "ls /data/scripts"

 

遠程執行腳本

 

ssh root@192.168.8.15 "/bin/bash /data/scripts/tar_code.sh"

 

遠程檢查更新效果

 

ssh root@192.168.8.15 "zcat /data/codes/django.tar.gz"

 

8.2 大型腳本編寫

 

本地是指 192.168.8.14 主機(線上服務器)

 

編寫大型腳本有一個流程:

 

先寫框架 -- 再填命令 -- 完善功能

 

8.2.1 功能框架

 

需求:先將腳本所涉及的全部業務流程跑通

 

 

 

方案:

 

使用函數來體現

 

 

 

腳本實施:

 

#!/bin/bash

 

# 功能:打包代碼

 

# 腳本名:deploy.sh

 

# 做者:python n 期全體

 

# 版本:V 0.1

 

# 聯繫方式:長安街1號 太和殿旁邊 國務院1號廳

 

 

 

# 獲取代碼

 

get_code(){

 

  echo "獲取代碼"

 

}

 

 

 

# 打包代碼

 

tar_code(){

 

  echo "打包代碼"

 

}

 

 

 

# 傳輸代碼

 

scp_code(){

 

  echo "傳輸代碼"

 

}

 

 

 

# 關閉應用

 

stop_serv(){

 

  echo "關閉應用"

 

  echo "關閉nginx應用"

 

  echo "關閉django應用"

 

}

 

 

 

# 解壓代碼

 

untar_code(){

 

  echo "解壓代碼"

 

}

 

 

 

# 放置代碼

 

fangzhi_code(){

 

  echo "放置代碼"

 

  echo "備份老文件"

 

  echo "放置新文件"

 

}

 

 

 

# 開啓應用

 

start_serv(){

 

  echo "開啓應用"

 

  echo "開啓django應用"

 

  echo "開啓nginx應用"

 

}

 

 

 

# 檢查

 

check(){

 

  echo "檢查項目"

 

}

 

 

 

# 部署函數

 

deploy_pro(){

 

  get_code

 

  tar_code

 

  scp_code

 

  stop_serv

 

  untar_code

 

  fangzhi_code

 

  start_serv

 

  check

 

}

 

 

 

# 主函數

 

main(){

 

  deploy_pro

 

}

 

 

 

# 執行主函數

 

main

 

8.2.2 命令填充

 

需求:

 

在流程跑通的狀況下,執行完整的代碼部署過程

 

方案:

 

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

 

 

 

腳本實施:

 

 

 

#!/bin/bash

 

# 功能:打包代碼

 

# 腳本名:deploy.sh

 

# 做者:python n 期全體

 

# 版本:V 0.2

 

# 聯繫方式:長安街1號 太和殿旁邊 國務院2號廳

 

 

 

# 獲取代碼

 

get_code(){

 

  echo "獲取代碼"

 

}

 

 

 

# 打包代碼

 

tar_code(){

 

  echo "打包代碼"

 

  ssh root@192.168.8.15 "/bin/bash /data/scripts/tar_code.sh"

 

}

 

 

 

# 傳輸代碼

 

scp_code(){

 

  echo "傳輸代碼"

 

  cd /data/codes

 

  [ -f django.tar.gz ] && rm -f django.tar.gz

 

  scp root@192.168.8.15:/data/codes/django.tar.gz ./

 

}

 

 

 

# 關閉應用

 

stop_serv(){

 

  echo "關閉應用"

 

  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 "放置代碼"

 

  echo "備份老文件"

 

  mv /data/server/itcast/test1/views.py /data/backup/views.py-$(date +%Y%m%d%H%M%S)

 

  echo "放置新文件"

 

  mv /data/codes/django/views.py /data/server/itcast/test1/

 

}

 

 

 

# 開啓應用

 

start_serv(){

 

  echo "開啓應用"

 

  echo "開啓django應用"

 

  export WORKON_HOME=/data/virtual

 

  source /usr/local/bin/virtualenvwrapper.sh

 

  python manage.py runserver >> /dev/null 2>&1 &

 

  deactivate

 

  echo "開啓nginx應用"

 

  /data/server/nginx/sbin/nginx

 

}

 

# 檢查

 

check(){

 

  echo "檢查項目"

 

  netstat -tnulp | grep ':80'

 

}

 

 

 

...

 

8.2.3 增長日誌功能

 

需求:

 

1、追蹤記錄

 

2、數聽說話

 

 

 

方案:

 

增長日誌功能

 

1、日誌文件

 

/data/logs/deploy.log

 

2、日誌格式

 

日期 時間 腳本名稱 步驟

 

 

 

日期:date +%F

 

時間:date +%T

 

腳本:$0

 

 

 

腳本實施:

 

#!/bin/bash

 

...

 

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

 

# 增長日誌功能

 

write_log(){

 

  DATE=$(date +%F)

 

  TIME=$(date +%T)

 

  buzhou="$1"

 

  echo "${DATE} ${TIME} $0 : ${buzhou}" >> "${LOG_FILE}"

 

}

 

 

 

# 獲取代碼

 

get_code(){

 

  ...

 

  write_log "獲取代碼"

 

}

 

 

 

# 打包代碼

 

tar_code(){

 

  ...

 

  write_log "打包代碼"

 

}

 

 

 

# 傳輸代碼

 

scp_code(){

 

  ...

 

  write_log "傳輸代碼"

 

}

 

 

 

# 關閉應用

 

stop_serv(){

 

  ...

 

  write_log "關閉應用"

 

  ...

 

  write_log "關閉nginx應用"

 

  ...

 

  write_log "關閉django應用"

 

}

 

 

 

# 解壓代碼

 

untar_code(){

 

  ...

 

  write_log "解壓代碼"

 

}

 

 

 

# 放置代碼

 

fangzhi_code(){

 

  ...

 

  write_log "放置代碼"

 

  ...

 

  write_log "備份老文件"

 

  ...

 

  write_log "放置新文件"

 

}

 

 

 

# 開啓應用

 

start_serv(){

 

  ...

 

  write_log "開啓應用"

 

  ...

 

  write_log "開啓django應用"

 

  ...

 

  write_log "開啓nginx應用"

 

}

 

# 檢查

 

check(){

 

  ...

 

  write_log "檢查項目"

 

}

 

 

 

...

 

 

 

8.2.4 增長鎖文件功能

 

需求:

 

同一時間段內,只容許有一個用戶來執行這個腳本

 

若是腳本執行的時候,有人在執行,那麼輸出報錯:

 

腳本 deploy.sh 正在運行,請稍候...

 

 

 

設計:

 

鎖文件 /tmp/deploy.pid

 

腳本執行的時候,須要建立鎖文件

 

腳本執行結束的時候,須要刪除鎖文件

 

 

 

腳本實施

 

#!/bin/bash

 

...

 

PID_FILE='/tmp/deploy.pid'

 

...

 

# 增長鎖文件功能

 

add_lock(){

 

  echo "增長鎖文件"

 

  touch "${PID_FILE}"

 

  write_log "增長鎖文件"

 

}

 

 

 

# 刪除鎖文件功能

 

del_lock(){

 

  echo "刪除鎖文件"

 

  rm -f "${PID_FILE}"

 

  write_log "刪除鎖文件"

 

}

 

 

 

# 部署函數

 

deploy_pro(){

 

  add_lock

 

  ...

 

  del_lock

 

}

 

 

 

# 腳本報錯信息

 

err_msg(){

 

  echo "腳本 $0 正在運行,請稍候..."

 

}

 

 

 

# 主函數

 

main(){

 

if [ -f "${PID_FILE}" ]

 

then

 

      err_msg

 

else

 

      deploy_pro

 

fi

 

}

 

 

 

# 執行主函數

 

main

 

 

 

8.2.5 腳本流程知識點填充

 

需求:

 

若是我給腳本輸入的參數是deploy,那麼腳本才執行,不然的話,提示該腳本的使用幫助信息,而後退出

 

提示信息:腳本 deploy.sh 的使用方式: deploy.sh [ deploy ]

 

分析:

 

腳本傳參,就須要在腳本內部進行調用參數

 

使用 $1 來完成

 

腳本內容就須要對傳參的內容進行判斷

 

使用case語句來完成

 

腳本的幫助信息

 

使用一個usage函數來完成

 

方案:

 

1、腳本的傳參

 

腳本執行:bash deploy.sh deploy

 

2、腳本的幫助信息

 

完成一個usage函數

 

3、位置參數的調用

 

main函數中,結合case語句,對傳入的參數進行判斷

 

傳入參數匹配到deploy,那麼就執行代碼部署流程

 

若是匹配不到,那麼輸出腳本的幫助信息,而後退出

 

 

 

腳本實施

 

#!/bin/bash

 

...

 

 

 

# 腳本幫助信息

 

usage(){

 

  echo "腳本 $0 的使用方式: $0 [deploy]"

 

  exit

 

}

 

 

 

# 主函數

 

main(){

 

  case "$1" in

 

    "deploy")

 

      if [ -f "${PID_FILE}" ]

 

      then

 

         err_msg

 

      else

 

        deploy_pro

 

      fi

 

    ;;

 

    *)

 

      usage

 

    ;;

 

  esac

 

}

 

 

 

# 執行主函數

 

main $1

 

8.2.6 輸入參數安全優化

 

需求:

 

對腳本傳入的參數進行判斷,若是傳入的參數數量不對,直接提示腳本使用方式,而後退出

 

 

 

方案:

 

條件表達式 + $#

 

 

 

腳本實施

 

#!/bin/bash

 

...

 

 

 

# 執行主函數

 

if [ $# -eq 1 ]

 

then

 

  main $1

 

else

 

  usage

 

fi

 

8.3腳本調試功能

 

咱們介紹腳本調試的時候呢,主要分三種方式來介紹:

 

 

 

-n 檢查腳本中的語法錯誤

 

-v 顯示腳本全部內容,而後執行腳本,結果輸出,若是執行遇到錯誤,將錯誤輸出。

 

-x 將執行的每一條命令和執行結果都打印出來

 

 

 

8.4 生產腳本編寫總結

 

8.4.1 簡單腳本編寫總結

 

1、手工執行的命令必定要可執行

 

1、命令簡單羅列

 

2、固定的內容變量化

 

3、功能函數化

 

8.4.2 複雜腳本編寫總結

 

1、手工執行的命令必定要可執行

 

2、根據發佈流程編寫腳本的框架

 

3、將手工執行的命令填充到對應的框架函數內部

 

4、增長日誌功能,方便跟蹤腳本歷史執行記錄

 

5、主函數中邏輯流程控制好

 

6、設計安全的方面:

 

增長鎖文件,保證代碼發佈的過程當中不受干擾,

 

輸入參數數量

 

輸入參數匹配

 

腳本幫助信息

 

7、調試腳本

 

 

 

8.4.3 注意事項:

 

1、命令必定要保證能正常執行

 

2、成對的符號,要成對寫,避免丟失

 

3、函數調用,

 

寫好函數後,必定要在主函數中進行調用

 

4、避免符號出現中文

 

5、命令變量的寫法必定要規範

 

6、固定的內容必定要變量實現,方便之後更改

 

7、日誌的輸出

 

8、腳本的傳參和函數的傳參要區別對待

相關文章
相關標籤/搜索