天天看點

自動化運維工具Puppet

一、概述

1.1 puppet的概念

Puppet是一款使用GPLV2X協定授權的開源管理配置工具,用Ruby語言開發。其既可以通過用戶端–伺服器的方式運作,也可以獨立運作。Puppet可以為系統管理者提供友善、快捷的系統自動化管理。對于系統管理者來說通過Puppet配置管理系統,底層的作業系統的發行版本是透明的,Puppet通過(Provider又稱提供者)屬性來完成軟體的配置與安裝,管理者不必關心作業系統的種類與發行版本,

Puppet還可以提供一個強大的架構來完成系統管理功能,在架構的基礎上系統管理者可以通過Puppet語言來描述系統的一些事務,如安裝軟體、初始化系統、啟動、删除服務、推送配置檔案和差異化配置管理伺服器等。同時系統管理者和系統管理者之間可以分享用Puppet語言描述好的事務,進而減少重複勞動,提高工作效率。

1.2 puppet工作模型

<a href="https://s5.51cto.com/wyfs02/M02/08/BE/wKiom1nms4LxCDbDAACIPWq0UQA631.png" target="_blank"></a>

a.部署排程

puppet master在一台伺服器以守護程序方式運作,同時也包含用戶端各節點的配置資訊,puppet agent 在與master的通信過程中,通過标準的SSL協定進行加密和驗證,驗證通過後,agent從masteer上讀取響應節點資訊應用在本地。

b.配置語言和資源抽象

puppet使用描述性語言來定義配置項,在puppet中将配置項被稱為resource,當Agent連接配接Master時,Master并不知道Agent的作業系統型号和版本。Agent通過Facter工具收集系統相關資訊,并通過SSL協定将Agent的資訊傳遞給Master。Master根據Agent收集到的相關資訊,通過資源的提供者來為Agent服務。比如Package資源收到Agent的資訊後,會識别Agent的系統型号版本,并通過資源提供者(如yum aptitude pkgadd apt-get等)比對,為Agent服務。

c.事物層

Puppet事務層其實就是它的解析引擎。Puppet事務層配置每一台主機的過程包括:

解析和配置編譯。

将編譯好的配置同步到Agent。

在Agent上應用配置。

向Master報告運作結果。

首先Puppet會建立一個圖表來表示所有資源的關系和上下遊執行順序,以及和Agent的關系。然後

Puppet将按照資源之間的關系和上下遊順序依次執行。

接着Puppet為每一個Agent擷取相應的資源,并把它們編譯成“目錄”,然後将目錄依次分發到各

主機,并通過Agent來應用它們,最後應用結果以報告形式回報給Master。

1.3 puppet的細節和原理

<a href="https://s2.51cto.com/wyfs02/M00/08/BE/wKiom1nmuADTVFYZAAQlAlbERaQ464.png" target="_blank"></a>

Puppet采用了非常簡單的C/S架構,所有資料的互動都通過SSL進行,以保證安全。

1.用戶端Puppetd向Master發起認證請求,或使用帶簽名的證書。

2.Master告訴Client你是合法的。

3. 用戶端Puppetd調用Facter,Facter探測出主機的一些變量,例如主機名、記憶體大小、IP位址

等。Puppetd将這些資訊通過SSL連接配接發送到伺服器端。

4. 伺服器端的Puppet Master檢測用戶端的主機名,然後找到manifest對應的node配置,并對該

部分内容進行解析。Facter送過來的資訊可以作為變量處 理,node牽涉到的代碼才解析,其他

沒牽涉的代碼不解析。解析分為幾個階段,首先是文法檢查,如果文法錯誤就報錯;如果文法

沒錯,就繼續解析,解析的結 果生成一個中間的“僞代碼”(catelog),然後把僞代碼發給客

戶端。

5. 用戶端接收到“僞代碼”,并且執行。

6. 用戶端在執行時判斷有沒有File檔案,如果有,則向fileserver發起請求。

7. 用戶端判斷有沒有配置Report,如果已配置,則把執行結果發送給伺服器。

8. 伺服器端把用戶端的執行結果寫入日志,并發送給報告系統。

二、安裝部署

主機清單

主機名

IP位址

系統

puppet-master

172.20.4.50

CentOS release 6.9 (Final)

puppet-1

172.20.4.51

puppet-2

172.20.4.52

2.1 初始化環境:

1

2

3

4

<code>yum </code><code>install</code> <code>ntpdate -y &amp;&amp; ntpdate time1.aliyun.com                    </code><code>#同步時間</code>

<code>service iptables stop                                                 </code><code>#關閉iptables</code>

<code>sed</code> <code>-i </code><code>"s/SELINUX=enforcing/SELINUX=disabled/"</code>  <code>/etc/selinux/config</code>   <code>#關閉selinux</code>

<code>setenforce 0</code>

5

6

<code>設定主機直接可以通過主機名相關通路,在三台主機修改</code><code>/etc/hosts</code><code>檔案</code>

<code>127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4</code>

<code>::1         localhost localhost.localdomain localhost6 localhost6.localdomain6</code>

<code>172.20.4.50  puppet-server</code>

<code>172.20.4.51  puppet-1</code>

<code>172.20.4.52  puppet-2</code>

2.2 master端安裝配置

<code>rpm -ivh </code>

<code>yum </code><code>install</code> <code>-y puppet-server facter puppet</code>

編輯/etc/puppet/puppet.conf

7

8

9

10

11

<code>[main]</code>

<code>logdir = </code><code>/var/log/puppet</code>

<code>rundir = </code><code>/var/run/puppet</code>

<code>ssldir = $vardir</code><code>/ssl</code>

<code>[agent]</code>

<code>classfile = $vardir</code><code>/classes</code><code>.txt</code>

<code>localconfig = $vardir</code><code>/localconfig</code>

<code>certname = puppet-server      </code><code>#設定本機的certname名稱</code>

<code>server = puppet-server                </code><code>#設定指向puppetmaster進行身份驗證</code>

<code>[master]</code>

<code>certname = puppet-server      </code><code>###設定puppetmaster認證伺服器名稱</code>

<code>/etc/init</code><code>.d</code><code>/puppetmaster</code> <code>start</code>

<code>chkconfig puppetmaster on</code>

檢視端口和程序

<a href="https://s3.51cto.com/wyfs02/M00/08/C0/wKiom1nmwdySW4vPAABtOB2nm3o648.png" target="_blank"></a>

2.3 agent端安裝配置

<code>yum </code><code>install</code> <code>-y puppet facter</code>

<code>    </code><code>classfile = $vardir</code><code>/classes</code><code>.txt</code>

<code>    </code><code>localconfig = $vardir</code><code>/localconfig</code>

<code>    </code><code>certname = puppet-2                   </code><code>#設定本機的certname名稱</code>

<code>    </code><code>server = puppet-server            </code><code>#指向puppetmaster進行身份驗證</code>

啟動服務

<code>/etc/init</code><code>.d</code><code>/puppet</code> <code>start</code>

2.4 證書簽發

在master端檢視證書

<a href="https://s5.51cto.com/wyfs02/M00/08/C0/wKiom1nmxl_x1doWAABDpFaWnVA023.png" target="_blank"></a>

沒有帶“+”說明沒有進行身份驗證

<code>puppet cert --sign puppet-1  簽發證書</code>

<code>puppet cert --sign puppet-2</code>

<code>#puppet cert clean puppet-2   清理證書</code>

<a href="https://s1.51cto.com/wyfs02/M01/A7/70/wKioL1nmxBLg67R7AACML3_bSYQ972.png" target="_blank"></a>

在agent端驗證

<a href="https://s4.51cto.com/wyfs02/M02/08/C1/wKiom1nmx37RQVYZAAApYx2A4Kc840.png" target="_blank"></a>

三、puppet檔案資源

3.1 /etc/puppet配置目錄:

12

<code>[root@puppet-server ~]</code><code># tree /etc/puppet/</code>

<code>/etc/puppet/</code>

<code>├── auth.conf                        </code><code>#認證配置檔案</code>

<code>├── environments                 </code>

<code>│   └── example_env</code>

<code>│       ├── manifests</code>

<code>│       ├── modules</code>

<code>│       └── README.environment</code>

<code>├── fileserver.conf</code>

<code>├── manifests                  </code><code>#檔案存儲目錄(puppet 會先讀取該目錄的.PP 檔案&lt;site.pp&gt;)</code>

<code>├── modules                    </code><code>#定義子產品</code>

<code>└── puppet.conf                </code><code>##主配置配置檔案,詳細内容可執行 puppet --genconfig</code>

3.2 子產品目錄結構

13

14

15

16

17

18

19

20

21

22

23

24

25

<code>子產品:目錄結構</code>

<code>    </code><code>module_name/</code>

<code>        </code><code>manifests/</code>

<code>            </code><code>init.pp:包含一個與子產品名稱同名的類</code>

<code>            </code><code>*.pp:一個清單檔案通常隻包含一個類,而且建議清單檔案名與類名相同 nginx::web檔案名為web.pp</code>

<code>            </code><code>web/</code>

<code>                </code><code>*.pp</code>

<code>            </code><code>通路路徑:module_name::mainfest_file_name,module_name::subdir_name::manifest_file_name</code>

<code>        </code><code>files/</code>

<code>            </code><code>通路路徑:puppet:</code><code>///modules/module_nname/file_name</code>

<code>            </code><code>nginx_web/</code>

<code>                </code><code>puppet:</code><code>///modules/module_name/subdir/file_name</code>

<code>        </code><code>templates/</code>

<code>            </code><code>*.erb:使用子產品函數template()裝載并運作其中子產品語言,運作後會生成靜态檔案</code>

<code>            </code><code>通路路徑 templates(‘moduleName</code><code>/templates</code><code>’)</code>

<code>        </code><code>lib/</code>

<code>            </code><code>使用者自定義的插件目錄</code>

<code>        </code><code>tests/</code>

<code>            </code><code>目前子產品的使用說明和樣例</code>

<code>        </code><code>spec/</code>

<code>            </code><code>為lib目錄中的插件提供使用說明和樣例</code>

<code>        </code><code>在子產品根目錄下,通常還應該具有幾個文檔</code>

<code>            </code><code>LICENSE</code>

<code>            </code><code>Modulefile</code>

<code>            </code><code>README</code>

3.3 puppet指令

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

<code>puppet 指令總結</code>

<code>    </code><code>apply,agent,master,cert,describe</code>

<code>    </code><code>apply:應用本地清單檔案</code>

<code>    </code><code>agent:用戶端程序</code>

<code>    </code><code>master:服務端程序</code>

<code>    </code><code>cert:證書管理</code>

<code>    </code><code>describe:資源幫助資訊</code>

<code>    </code><code>module:子產品管理</code>

<code>    </code><code>kick:master觸發模式</code>

<code>    </code><code>幫助類指令</code>

<code>        </code><code>describe</code>

<code>        </code><code>doc:生成puppet文檔</code>

<code>        </code><code>help:檢視幫助</code>

<code>        </code><code>resource:檢視資源幫助</code>

<code>        </code><code>status:檢視puppe狀态</code>

<code>    </code><code>master指令的選項</code>

<code>        </code><code>--no-daemonize:非守護程序</code>

<code>        </code><code>--daemonize:-D</code>

<code>        </code><code>--debug -d</code>

<code>        </code><code>--verbase -</code><code>v</code>

<code>        </code><code>--genconfig</code>

<code>    </code><code>agent指令的常用選項</code>

<code>        </code><code>--daemonize,-D</code>

<code>        </code><code>--no-daemonize</code>

<code>        </code><code>--verbose -</code><code>v</code>

<code>        </code><code>--noop:no operation 模式,不真正應用catalog</code>

<code>        </code><code>--</code><code>test</code><code>:測試</code>

<code>        </code><code>--waitforcert:等待證書簽署成功</code>

<code>    </code><code>apply指令的常用選項</code>

<code>        </code><code>--execute -e</code>

<code>        </code><code>--modulepath</code>

<code>    </code><code>cert指令的常用操作</code>

<code>        </code><code>list</code>

<code>        </code><code>sign:簽署</code>

<code>        </code><code>clean:清除證書</code>

<code>        </code><code>revoke:吊銷證書</code>

<code>        </code><code>verify:驗證本地指定的證書</code>

<code>        </code><code>generate:為用戶端生成證書</code>

3.4 puppet資源清單

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

<code>puppet 資源</code>

<code>    </code><code>type</code> <code>{ </code><code>'title'</code><code>:</code>

<code>        </code><code>attibute =&gt; value,</code>

<code>    </code><code>}</code>

<code>    </code> 

<code>而資源定義的核心也可以抽象為</code><code>type</code><code>、title、attribute和value四個部分。</code>

<code>type</code><code>分類:</code>

<code>package:</code>

<code>    </code><code>puppet支援使用的軟體包管理器</code>

<code>        </code><code>yum,rpm,apt,ports,gem,msi,dpkg,pkg</code>

<code>    </code><code>常用的參數</code>

<code>        </code><code>ensure:程式包的目标狀态</code>

<code>        </code><code>name:資源的名稱,即軟體包的名字</code>

<code>        </code><code>provider:軟體包管理器</code>

<code>        </code><code>source</code><code>:指定程式封包件路徑</code>

<code>        </code><code>install_options:安裝選項,最常用的是通過INSTALLDIR來制定安裝目錄</code>

<code>        </code><code>window下安裝mysql</code>

<code>        </code><code>package{‘mysql:</code>

<code>            </code><code>ensure =&gt; </code><code>install</code><code>,</code>

<code>            </code><code>provider =&gt;</code><code>'msi'</code><code>,</code>

<code>            </code><code>source</code> <code>=&gt; </code><code>'D:\software\mysql-5.5.36.msi'</code><code>,</code>

<code>            </code><code>install_options =&gt; { </code><code>'INSTALLDIR'</code> <code>=&gt; </code><code>'c:\mysql'</code> <code>},</code>

<code>        </code><code>}</code>

<code>service:</code>

<code>    </code><code>常用參數:</code>

<code>        </code><code>ensure:服務的目标狀态,ture(啟動)和</code><code>false</code><code>(關閉)</code>

<code>        </code><code>enable</code><code>:是否開機自動啟動,ture(啟動)和</code><code>false</code><code>(關閉)</code>

<code>        </code><code>name:服務名稱</code>

<code>        </code><code>path:服務腳本路徑;預設為</code><code>/etc/init</code><code>.d下查找</code>

<code>        </code><code>start:定制啟動指令</code>

<code>        </code><code>stop:關閉</code>

<code>        </code><code>restart:重新開機</code>

<code>        </code><code>status:狀态</code>

<code>資源名稱僅是一個字元串,在同一個類型中必須唯一</code>

<code>在定義時,資源類型必須是小寫字母</code>

<code>file</code><code>:</code>

<code>    </code><code>管理檔案、目錄、軟連結;</code>

<code>    </code><code>生成檔案内容</code>

<code>    </code><code>管理檔案權限、屬性</code>

<code>    </code><code>也可以通過</code><code>source</code><code>屬性到指定位置下載下傳檔案</code>

<code>    </code><code>通過recurse屬性來擷取目錄</code>

<code>        </code><code>ensuce:absent(不存在) present(存在) </code><code>file</code><code>(檔案) directory(目錄)</code>

<code>        </code><code>backup:通過filebucket資源來備份檔案,值通常為filebucket資源的名稱</code>

<code>        </code><code>content:檔案内容,生成方式有三種(content,</code><code>source</code><code>,target),彼此互斥</code>

<code>        </code><code>source</code><code>:通過制定的url下載下傳檔案至本地,擷取檔案方式為puppet url 格式:puppet:</code><code>///modules/MODULE_NAME/file_names</code><code>;</code>

<code>        </code><code>target:為符号連結指定目标</code>

<code>        </code><code>links:檔案為符号連結,值為“follow”,“manage”</code>

<code>        </code><code>path: 檔案路徑,必須使用雙引号</code>

<code>        </code><code>mode:定義權限</code>

<code>        </code><code>owner:定義屬主</code>

<code>        </code><code>group:定義屬組</code>

<code>        </code><code>force: 強制執行删除檔案、連接配接或目錄,僅用于ensure為absent時。</code>

<code>        </code><code>purge:清空指定目錄中存在的,但未在資源中定義的檔案;</code>

<code>        </code><code>recurse:目錄遞歸,值</code><code>true</code><code>,</code><code>false</code><code>,inf,remote</code>

<code>        </code><code>replace:替換,本地存在的檔案與資源中指定的檔案内容不同時是否執行替換,預設為否;</code>

<code>exec</code><code>:</code>

<code>    </code><code>執行指令,通常在不得不用時才使用,慎用,通常用于完成puppet自身無法完成的功能</code>

<code>    </code><code>常用的參數:</code>

<code>        </code><code>command</code><code>:要執行的指令,通常為指令檔案的完整路徑</code>

<code>        </code><code>path:指令搜尋路徑 </code>

<code>        </code><code>group:執行指令的組</code>

<code>        </code><code>user:執行指令的使用者</code>

<code>        </code><code>onlyif:0,表示僅在指令的狀态傳回值為0時才執行此指令</code>

<code>        </code><code>refresh:定義接受到其他資源的通知時,則要重新執行此指令</code>

<code>        </code><code>refreshonly:僅當被依賴的資源發生改變時才被觸發 </code>

<code>        </code><code>tries:嘗試次數,預設為1</code>

<code>        </code><code>try_sleep:多次嘗試之間的時間間隔</code>

<code>group:管理系統上的使用者組</code>

<code>        </code><code>常用參數</code>

<code>            </code><code>ensure:目标狀态,present,absent</code>

<code>            </code><code>name:組名</code>

<code>            </code><code>gid:GID</code>

<code>            </code><code>system:系統組</code>

<code>user:管理使用者</code>

<code>        </code><code>常用屬性:</code>

<code>            </code><code>ensure:目标值狀态</code>

<code>            </code><code>name:</code>

<code>            </code><code>uid:</code>

<code>            </code><code>system:</code>

<code>            </code><code>home:</code>

<code>            </code><code>shell:</code>

<code>            </code><code>gid:</code>

<code>            </code><code>password:加密後的密碼</code>

<code>            </code><code>managehome: </code><code>true</code><code>,</code><code>false</code><code>(預設)</code>

<code>cron</code><code>:定義周期性任務</code>

<code>        </code><code>常用屬性</code>

<code>            </code><code>ensure:目标狀态</code>

<code>            </code><code>command</code><code>:指令或腳本</code>

<code>            </code><code>environment:運作時的環境變量</code>

<code>            </code><code>hour:</code>

<code>            </code><code>minute:</code>

<code>            </code><code>mouth:</code>

<code>            </code><code>monthday</code>

<code>            </code><code>weekday</code>

<code>            </code><code>name</code>

<code>            </code><code>user:預設為root</code>

<code>        </code><code>cron</code> <code>{ </code><code>'ntpdate'</code>

<code>         </code><code>ensure =&gt; present,</code>

<code>         </code><code>command</code> <code>=&gt; </code><code>'/usr/sbin/ntpdate 172.16.0.1'</code> <code>&amp;&gt; </code><code>/dev/null</code>

<code>         </code><code>minute =&gt; </code><code>'*/3'</code>

3.5 puppet資源引用

<code>元參數:用于定義資源間的依賴關系,及應用次序,通知機制等等</code>

<code>    </code><code>require:表示需要依賴</code>

<code>        </code><code>package { </code><code>'nginx'</code>

<code>            </code><code>ensure =&gt; present,</code>

<code>        </code><code>service{</code><code>'nginx'</code>

<code>            </code><code>ensure =&gt;ture,</code>

<code>            </code><code>enable</code> <code>=&gt;ture</code>

<code>            </code><code>require =&gt;Package[</code><code>'nginx'</code><code>]</code>

<code>    </code><code>before:先應用本資源</code>

<code>            </code><code>before =&gt;Service [</code><code>'nginx'</code><code>]</code>

<code>    </code><code>notify:将目前資源的變動資訊通知給别的資源,通知發出者</code>

<code>    </code><code>subscribe:定義在後一個資源中,通知接收者,訂閱</code>

<code>資源引用:</code>

<code>    </code><code>使用Type[</code><code>'title'</code><code>],首字母必須大寫</code>

<code>依賴關系</code>

<code>        </code><code>} -&gt;</code>

<code>            </code><code>restart =&gt; </code><code>'/etc/rc.d/init.d/nginx reload'</code>

<code>-&gt; 表示依賴</code>

<code>~&gt; 表示通知</code>

3.6 puppet表達式:

<code>puppet的條件表達式</code>

<code>    </code><code>if</code>

<code>    </code><code>單分支</code>

<code>    </code><code>雙分支</code>

<code>    </code><code>多分支</code>

<code>        </code><code>if</code> <code>條件 {</code>

<code>        </code><code>動作</code>

<code>        </code><code>} elsif 條件 {</code>

<code>        </code><code>} </code><code>else</code> <code>條件 {</code>

<code>    </code><code>case</code><code>:指定代碼塊</code>

<code>    </code><code>selectors:傳回結果</code>

四、驗證

編輯資源清單,在puppet-1安裝nginx,puppet-2安裝mysql并設定開機自啟動

<a href="https://s5.51cto.com/wyfs02/M02/A7/73/wKioL1nm52KzaqrHAABeMtqJfB4870.png" target="_blank"></a>

在agent端測試手動執行,(預設三十分鐘agent自動去master拉取)

<a href="https://s4.51cto.com/wyfs02/M01/08/C4/wKiom1nm6nfBUjr7AADBHgs4AG0236.png" target="_blank"></a>

<a href="https://s4.51cto.com/wyfs02/M00/A7/73/wKioL1nm59uzG2Z5AADD7lFFiAA185.png" target="_blank"></a>

五、puppet dashboard安裝配置

5.1 安裝并配置mysql資料庫

<code>yum </code><code>install</code> <code>-y ruby-mysql mysql-server </code>

<code>service mysqld start</code>

<code>mysqladmin -uroot password </code><code>"mysqladmin"</code>

建立資料庫并授權

<code>create database dashboard character </code><code>set</code> <code>utf8;</code>

<code>create user </code><code>'puppet'</code><code>@</code><code>'localhost'</code> <code>identified by </code><code>'puppetadmin'</code><code>;</code>

<code>grant all on dashboard.* to puppet@</code><code>'localhost'</code><code>;</code>

<code>flush privileges;</code>

<a href="https://s3.51cto.com/wyfs02/M02/A7/73/wKioL1nm6VuA5elaAABeMtqJfB4602.png" target="_blank"></a>

5.2 安裝并配置puppet-dashboard

<code>yum -y </code><code>install</code> <code>puppet-dashboard</code>

<code>vim </code><code>/usr/share/puppet-dashboard/config/database</code><code>.yml</code>

<a href="https://s1.51cto.com/wyfs02/M01/A7/73/wKioL1nm6k7SaQOYAABmfNfqgqM332.png" target="_blank"></a>

<code>vim </code><code>/usr/share/puppet-dashboard/config/environment</code><code>.rb</code>

<a href="https://s5.51cto.com/wyfs02/M00/A7/74/wKioL1nm6t2DiwNeAAAIwmFuKGk031.png" target="_blank"></a>

導入資料庫檔案

<code>cd</code> <code>/usr/share/puppet-dashboard/</code>

<code>rake gems:refresh_specs</code>

<code>rake RAILS_ENV=production db:migrate</code>

<a href="https://s5.51cto.com/wyfs02/M00/08/C4/wKiom1nm7g2QF6kvAAEa61tQvT4990.png" target="_blank"></a>

5.3 啟動服務,并測試通路

<code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/puppetmaster</code> <code>start  啟動服務</code>

<code>http:</code><code>//IP</code><code>:3000  浏覽器進行通路</code>

<a href="https://s5.51cto.com/wyfs02/M02/08/C4/wKiom1nm71iTSAiKAAAieSk1wns380.png" target="_blank"></a>

手工導入報告

<code>rake RAILS_ENV=production reports:</code><code>import</code>

<a href="https://s3.51cto.com/wyfs02/M02/08/C4/wKiom1nm77_CQOT9AAFuJTqU9nQ205.png" target="_blank"></a>

啟動報告

<code>env</code> <code>RAILS_ENV=production </code><code>/usr/share/puppet-dashboard/script/delayed_job</code> <code>-p dashboard -n 4 -m start</code>

檢視程序job

<a href="https://s1.51cto.com/wyfs02/M01/A7/74/wKioL1nm8AvCQJ1oAABZSm7_gv8508.png" target="_blank"></a>

檢視dashboard

<a href="https://s1.51cto.com/wyfs02/M00/08/C5/wKiom1nm8v3Tn3BfAAH0fKAlWUo226.png" target="_blank"></a>

本文轉自 KaliArch 51CTO部落格,原文連結:http://blog.51cto.com/kaliarch/1973736,如需轉載請自行聯系原作者

繼續閱讀