天天看點

自動化運維工具puppet的基礎使用

puppet是一種開源的、新一代的集中化的配置管理工具。可管理的平台有windows,Linux,Unix等。有自己的配置語言(資源申報語言),可管理檔案、軟體包、系統服務、使用者等。這些統稱為puppet的資源。puppet是采用ruby語言研發的。

如下圖:

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411296X3QI.png" target="_blank"></a>

單機模型:實作定義多個manifests --&gt; complier --&gt; catalog --&gt; apply

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411297Cjwz.png" target="_blank"></a>

master/agent模型:集中式管理

架構:

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411300lcVW.png" target="_blank"></a>

工作原理:

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411302tdfp.png" target="_blank"></a>

資源:是puppet的核心,通過資源申報,定義在資源清單中。

類:一組資源清單。

子產品:包含多個類。

站點清單:以主機為核心,應用哪些子產品。

puppet的安裝可以使用源碼安裝,也可以使用rpm(官方提供)、epel源、官方提供的yum倉庫來安裝(通過下載下傳官方提供的rpm包可以指定官方的yum倉庫)。

這裡使用的是2.7系列的,使用epel倉庫

1

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

puppet從以下三個次元來都資源完成抽象:

2

3

4

5

<code>1、相似的資源被抽象成同一種資源“類型,”如程式包資源、使用者資源及服務資源等</code>

<code>2、将資源屬性或狀态的描述與其實作方式剝離開來,如僅說明安裝一個程式包而不用關系其具體</code>

<code>  </code><code>是yum、pkgadd、prots或其他方式實作</code>

<code>3、僅描述資源的目标狀态,也即期望其實作的結果,而不是其具體過程,如“确定nginx運作起來”</code>

<code> </code><code>而不是具體描述為“運作nginx指令将啟動起來”</code>

這三個也被稱為puppet的資源抽象層(RAL)。RAL由type(類型)和provide(提供者,即不同的OS上的特定實作)組成。

 資源是puppet用于模型化系統配置的基礎單元,每個資源都從某個角度描述了系統屬性,如某程式包必須安裝或某使用者必須移除等,在puppet,用于完成此類功能的代碼也即“資源申報”

<code>type</code> <code>{ ‘title’:</code>

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

<code>}</code>

資源的檔案統一以.pp結尾。在定義時,資源類型必須使用小寫字母,而資源名稱僅是一個字元串,但要求在同一類型中期必須唯一。

6

7

8

9

10

11

12

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

<code>puppet describe [-s] package</code>

<code>puppet支援使用的軟體包管理器:yum,rpm,apt,prots,gem,msi,dpkg,pkg</code>

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

<code>ensure:程式包的目标狀态,值有present(installed)、absent(不存在)、purged、held、</code>

<code>  </code><code>latest</code>

<code>name:資源的名稱,即軟體包的名字,可以省略,如果省略,将繼承title的值</code>

<code>provide:軟體包管理器,會自動識别</code>

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

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

<code>puppet describe [-s] service</code>

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

<code> </code><code>ensure:服務的額目标狀态,值有</code><code>true</code><code>(running)和</code><code>false</code><code>(stopped) </code>

<code> </code><code>enable</code><code>:是否開機自動啟動,值有</code><code>true</code><code>和</code><code>false</code>

<code> </code><code>name:服務名稱,可以省略,如果省略,将繼承title的值</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>

13

14

15

16

17

18

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

<code>puppet describe [-s] </code><code>file</code> 

<code>ensuce:目标狀态,值有*absent*, *present*, *</code><code>file</code><code>*, 和*directory*.</code>

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

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

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

<code>    </code><code>puppet:</code><code>///modules/MODULE_NAME/file_names</code><code>,使用子產品時會用到</code>

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

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

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

<code>mode:定義權限,通常為8進制數字</code>

<code>owner: 定義檔案的屬主</code>

<code>group:定義檔案的屬組</code>

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

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

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

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

<code>package { [</code><code>"httpd"</code><code>,</code><code>'mysql-server'</code><code>,</code><code>'php'</code><code>]:</code>

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

<code>} </code>

<code>service { [</code><code>"httpd"</code><code>,</code><code>'mysqld'</code><code>]:</code>

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

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

<code>file</code><code>{</code><code>'my.cnf'</code><code>:</code>

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

<code>        </code><code>source</code>  <code>=&gt; </code><code>'/root/my.cnf'</code><code>,</code>

<code>        </code><code>path    =&gt; </code><code>'/etc/my.cnf'</code><code>,</code>

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411304nyUz.png" target="_blank"></a>

<code>puppet describe [-s] </code><code>exec</code>

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

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

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

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

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

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

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

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

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

<code>puppet describe [-s] group</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>puppet describe [-s] user</code>

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

<code>name:使用者名</code>

<code>uid:使用者uid</code>

<code>system:系統使用者</code>

<code>home:使用者家目錄</code>

<code>shell:使用者預設shell</code>

<code>gid:使用者的gid</code>

<code>password:密碼,使用加密後密碼</code>

<code>managehome: 是否建立家目錄,預設為</code><code>false</code>

<code>常見屬性</code>

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

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

<code>hour:小時</code>

<code>mouth:月</code>

<code>monthday:日</code>

<code>weekday:周</code>

<code>minute:分</code>

<code>name:名稱</code>

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

<code>message:資訊</code>

<code>name:資訊名稱</code>

常見的資源就是這些。更詳細的可以使用puppet describe指令檢視。

使用Type['title'],首字母必須大寫

puppet提供了before、require、notify、subscribe四個元參數來定義資源之間的相關性。

<code>require:表示需要依賴于某個資源</code>

<code>before:表示應該先執行本資源,在執行别的資源</code>

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

<code>subscribe:表示定義某資源的變動資訊,為通知的接收者</code>

依賴關系還可以使用-&gt;和~&gt;來表示

<code>-&gt; 表示後資源需要依賴前資源</code>

<code>~&gt; 表示前資源變動通知後資源調用</code>

例如:

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

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

<code>file</code><code>{</code><code>'nginx.conf'</code><code>:</code>

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

<code>    </code><code>source</code>    <code>=&gt; </code><code>'/root/nginx.conf'</code><code>,</code>

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

<code>    </code><code>path    =&gt; </code><code>'/etc/nginx/nginx.conf'</code><code>,</code>

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

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

<code>    </code><code>enable</code>    <code>=&gt; </code><code>true</code><code>,</code>

<code>    </code><code>subscribe =&gt; File[</code><code>'nginx.conf'</code><code>],</code>

6、puppet變量

puppet的變量名稱以“$”開頭,指派操作符為“=”

19

20

21

22

23

<code>puppet的變量類型:</code>

<code>布爾型:</code><code>true</code><code>和</code><code>false</code><code>,不能加引号,</code><code>if</code><code>語句的測試條件和比較表達式都會傳回布爾型值,</code>

<code>   </code><code>另外,其他資料類型也可以自動轉換為布爾型,如空字元串為</code><code>false</code><code>等</code>

<code>undef:從未聲明的變量的值類型即為undef,也可以手動為某變量賦予undef值,</code>

<code>    </code><code>即直接使用不加引号的undef字元串</code>

<code>字元型:非結構化的文本字元串,可以使用引号,也可以不用。單引号中的變量不會替換,</code>

<code>   </code><code>而雙引号中的能夠進行變量替換;字元型也支援使用轉移符</code>

<code>數值型:可為整數或浮點數,不過,puppe隻有在數值上下文才把數值當數值對待,</code>

<code>   </code><code>其他清理下一律以字元型處理</code>

<code>數組:數組值為中括号“[]”中的以逗号分隔的項目清單,最後一個項目後面可以有逗号;</code>

<code>   </code><code>數組中的袁術可以為任何可用資料類型,包括</code><code>hash</code><code>或其他數組,屬組索引為從0開始的整數,</code>

<code>   </code><code>也可以使用負數索引</code>

<code>hash</code><code>:即為外鍵值資料類型,鍵和值之間使用“=&gt;”分隔,鍵值對定義在“{ }”中,</code>

<code>  </code><code>彼此間以逗号分隔;其鍵位字元型資料,而值可以為puppet支援的任意資料類型,</code>

<code>  </code><code>訪</code><code>hash</code><code>類型的資料元素要使用“鍵”當作索引進行。實際上和關聯數組應屬于同一資料類型</code>

<code>正規表達式:屬于puppet的非标準資料類型,不能指派給變量,僅能用于有限的幾個接收正則</code>

<code>  </code><code>表達式的地方,即接受使用“=~”及“!~”比對操作符的位置,通常包括</code><code>case</code><code>語句中的</code>

<code>  </code><code>selector,已經節點名稱比對的位置,他們不能傳遞給函數或用于資源屬性的定義</code>

<code>facter變量:可以通過facter檢視</code>

<code>内置變量:</code>

<code>    </code><code>例如:agent端:$environment,$clientcert,$clentbversion</code>

<code>    </code><code>server端:$servername,$serverip,$serverversion</code>

puppet中的正規表達式支援使用(?&lt;ENABLED OPTION&gt;:&lt;SUNPATTERN&gt;)和(?-&lt;DISABLED OPTION&gt;:&lt;SUNPATTERN&gt;)兩個特殊的符号,如下面的示例,表示做正規表達式比對時啟用選項“i(忽略字元大小寫)”,但不支援使用“m(把.當作換行符)”和啟用“x(忽略模式中的空白字元和注釋)”

<code>$packages = $operatingsystem ? {</code>

<code>    </code><code>/(?i-mx:ubuntu|debian)/        =&gt; </code><code>'apache2'</code><code>,</code>

<code>    </code><code>/(?i-mx:centos|fedora|redhat)/ =&gt; </code><code>'httpd'</code><code>,</code>

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

<code>puppet的判斷語句主要有三種分别為</code><code>if</code><code>,</code><code>case</code><code>,selector</code>

<code>puppet的操作符有:比較操作符,布爾操作符,算術操作符</code>

<code>if</code><code>語句分為單分支,雙分支和多分支        </code>

<code>單分支:</code>

<code>    </code><code>if</code> <code>CONDITION {</code>

<code>        </code><code>statement</code>

<code>        </code><code>...</code>

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

<code>雙分支:</code>

<code>    </code><code>else</code> <code>{</code>

<code>多分支:</code>

<code>    </code><code>elsif CONDITION {</code>

<code>case</code><code>語句的文法</code>

<code>    </code><code>case</code> <code>CONTROL_EXPRESS {</code>

<code>        </code><code>case1,...: { statement... }</code>

<code>        </code><code>case2,...:{ statement... }</code>

<code>        </code><code>... ...</code>

<code>        </code><code>default:{ statement... }</code>

<code>selector語句的用法    </code>

<code>    </code><code>CONTROL_VARIABLE ? {</code>

<code>        </code><code>case1 =&gt; value1</code>

<code>        </code><code>case2 =&gt; value2</code>

<code>        </code><code>default =&gt; valueN</code>

例如:判斷一個系統的OS的類型,并輸出“welcome to OS”的資訊

<code>if</code> <code>$operatingsystem  == /^(?i-mx:centos|fedora|redhat)/ {</code>

<code>    </code><code>notice </code><code>"welcome to redhat OS Family"</code>

<code>}elsif $operatingsystem  == ubuntu {</code>

<code>    </code><code>notice </code><code>"welcome to ubuntu server"</code>

<code>}</code><code>else</code> <code>{</code>

<code>    </code><code>notice </code><code>"unkown server"</code>

<code>#################################################################</code>

<code>  </code> 

<code>case</code> <code>$operatingsystem {</code>

<code>     </code><code>'Solaris'</code><code>:          { notice(</code><code>"Welcome to Solaris"</code><code>) }</code>

<code>     </code><code>'RedHat'</code><code>, </code><code>'CentOS'</code><code>: { notice(</code><code>"Welcome to RedHat OSFamily"</code><code>) }</code>

<code>     </code><code>/^(Debian|Ubuntu)$/:{ notice(</code><code>"Welcome to $1 linux"</code><code>) }</code>

<code>     </code><code>default:            { notice(</code><code>"Welcome, alien *_*"</code><code>) }</code>

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

<code>$welcome =$operatingsystem ? {</code>

<code>                </code><code>/^(?i-mx:centos|fedora|redhat)/ =&gt; </code><code>'redhat OS Family'</code><code>,</code>

<code>                </code><code>/^(?i-mx:ubuntu)/        =&gt; </code><code>'ubuntu'</code><code>,</code>

<code>                </code><code>/^(?i-mx:debian)/        =&gt; </code><code>'debebian'</code><code>,</code>

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

<code>notify { </code><code>"$welcome"</code><code>:</code>

<code>    </code><code>message =&gt; </code><code>"welcome to $welcome"</code><code>,</code>

<code>class my_class {</code>

<code>   </code><code>...puppet code ...</code>

<a href="http://blog.51cto.com/guoting/1568590#">?</a>

<code>class nginx {</code>

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

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

<code>        </code><code>name   =&gt; nginx,</code>

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

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

<code>        </code><code>enable</code> <code>=&gt; </code><code>true</code><code>,</code>

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

以上是類的定義,類似于函數。需要使用的話,要調用。調用時,使用關鍵在include即可。

類可以基于父類調用,在調用時,應該指定通過inherits關鍵字調用父類。例如:

<code>class nignx::web inherits nginx {</code>

<code>    </code><code>enable</code> <code>=&gt; </code><code>true</code><code>,</code>

<code>include nignx::web</code>

也支援類的覆寫和重寫:

<code>=&gt;:在子類中覆寫父類中的資源</code>

<code>+&gt;:在子類中為父類中的資源新增額外的屬性</code>

puppet子產品:為了實作某種完備功能而組織成的一個獨立的、自我包含的目錄結構  

子產品名:目錄名

<code>目錄結構:</code>

<code>Module_name:</code>

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

<code>        </code><code>init.pp: 必須聲明一個類,類名與子產品名相同;                     </code>

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

<code>            </code><code>MODULE_NAME::[SUBDIR_NAME]::MANIFESTS_FILE_NAME</code>

<code>    </code><code>files:靜态檔案</code>

<code>        </code><code>puppet url:puppet:</code><code>///modules/MODULE_NAME/</code><code>[SUBDIR_NAME]</code><code>/FILE_NAME</code> 

<code>        </code><code>file</code><code>{</code><code>'nginx.conf'</code><code>:</code>

<code>            </code><code>source</code>     <code>=&gt; puppet:</code><code>///modules/nginx/nginx</code><code>.conf</code>

<code>    </code><code>templates: 模闆檔案:*.erb</code>

<code>        </code><code>template(</code><code>'MODULE_NAME/TEMPLATE_FILE_NAME'</code><code>); </code>

<code>            </code><code>content     =&gt; template(</code><code>'模闆檔案'</code><code>),</code>

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

<code>    </code><code>lib: 插件</code>

<code>    </code><code>tests: 子產品使用說明文檔</code>

<code>    </code><code>spec: lib目錄下的插件使用說明文檔</code>

三、使用maste/agent模式,部署LAMP平台

Master/Agent模型之間通信是靠主機名通信的,大緻步驟是:

<code>1、master啟動時會為自己的key,自簽</code>

<code>2、agent啟動前要生成自己的key,生成簽署請求</code>

<code>3、master收到請求書,驗證合法性,簽署證書</code>

實驗環境:

<code>Master端:172.16.10.9 server.magedu.com</code>

<code>Agent端:172.16.10.77 basic.example.com</code>

<code>    </code><code>172.16.10.122 node2.example.com</code>

<code>### 安裝軟體</code>

<code>在172.16.10.9:</code>

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

<code>在172.16.10.77,172.16.10.122:</code>

<code>### 提供主機名解析名檔案</code>

<code># 172.16.10.9 172.16.10.77 172.16.10.122</code>

<code># /etc/hosts</code>

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

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

<code>172.16.10.77 basic.example.com</code>

<code>172.16.10.9 server.magedu.com</code>

<code>172.16.10.122 node2.example.com</code>

<code>### 配置3台機器時間同步</code>

46

47

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

<code>## Master端 目錄檔案,如下:</code>

<code>[root@server modules]</code><code># pwd</code>

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

<code>[root@server modules]</code><code># tree </code>

<code>.</code>

<code>├── mysql</code>

<code>│   ├── </code><code>file</code>

<code>│   │   └── my.cnf</code>

<code>│   └── manifests</code>

<code>│   └── init.pp</code>

<code>└── nginx</code>

<code>    </code><code>├── files</code>

<code>    </code><code>│   └── nginx.conf</code>

<code>    </code><code>└── manifests</code>

<code>        </code><code>└── init.pp</code>

<code>6 directories, 4 files</code>

<code>[root@server modules]</code><code># cat mysql/manifests/init.pp </code>

<code>class mysql {</code>

<code>    </code><code>package{</code><code>'mysql-server'</code><code>:</code>

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

<code>    </code><code>file</code><code>{</code><code>'my.cnf'</code><code>:</code>

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

<code>        </code><code>source</code>  <code>=&gt; </code><code>'puppet:///modules/mysql/my.cnf'</code><code>,</code>

<code>        </code><code>path    =&gt; </code><code>'/etc/my.cnf'</code><code>,</code>

<code>        </code><code>require =&gt; Package[</code><code>'mysql-server'</code><code>],</code>

<code>    </code><code>service{</code><code>'mysqld'</code><code>:</code>

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

<code>        </code><code>enable</code>  <code>=&gt; </code><code>true</code><code>,</code>

<code>        </code><code>subscribe =&gt; File[</code><code>'my.cnf'</code><code>],</code>

<code>[root@server modules]</code><code># cat nginx/manifests/init.pp </code>

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

<code>    </code> 

<code>    </code><code>file</code><code>{</code><code>'nginx.conf'</code><code>:</code>

<code>        </code><code>source</code>  <code>=&gt; </code><code>'puppet:///modules/nginx/nginx.conf'</code><code>,</code>

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

<code>        </code><code>path    =&gt; </code><code>'/etc/nginx/nginx.conf'</code><code>,</code>

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

<code>        </code><code>subscribe =&gt; File[</code><code>'nginx.conf'</code><code>],</code>

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

<code>## 說明:my.cnf nginx.cnf是配置檔案</code>

<code>[root@server manifests]</code><code># pwd</code>

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

<code>[root@server manifests]</code><code># tree </code>

<code>├── server</code>

<code>│   ├── basic.pp</code>

<code>│   └── node2.pp</code>

<code>└── site.pp</code>

<code>1 directory, 3 files</code>

<code>[root@server manifests]</code><code># cat server/node2.pp </code>

<code>node </code><code>'node2.example.com'</code> <code>{</code>

<code>    </code><code>include nginx,mysql</code>

<code>[root@server manifests]</code><code># cat server/basic.pp </code>

<code>node </code><code>'basic.example.com'</code> <code>{</code>

<code>    </code><code>include nginx,</code>

<code>[root@server manifests]</code><code># cat site.pp </code>

<code>import</code> <code>"server/*.pp"</code>

建立好目錄清單後,此時需要啟動服務。第一次啟動時,可手動啟動。

Master端啟動:

<code>[root@server ~]</code><code># puppet master -v -d --no-daemonize</code>

<code>debug: Failed to load library </code><code>'rubygems'</code> <code>for</code> <code>feature </code><code>'rubygems'</code>

<code>debug: Puppet::Type::User::ProviderUser_role_add: </code><code>file</code> <code>roleadd does not exist</code>

<code>debug: Puppet::Type::User::ProviderPw: </code><code>file</code> <code>pw does not exist</code>

<code>debug: Puppet::Type::User::ProviderDirectoryservice: </code><code>file</code> <code>/usr/bin/dscl</code> <code>does not exist</code>

<code>debug: Puppet::Type::User::ProviderLdap: </code><code>true</code> <code>value when expecting </code><code>false</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/yaml</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/private</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/etc/puppet/auth</code><code>.conf]: Autorequiring File[</code><code>/etc/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/lib</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/facts</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/certificate_requests</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/etc/puppet/manifests/site</code><code>.pp]: Autorequiring File[</code><code>/etc/puppet/manifests</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/rrd</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/log/puppet/masterhttp</code><code>.log]: Autorequiring File[</code><code>/var/log/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/private_keys</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/reports</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/etc/puppet/puppet</code><code>.conf]: Autorequiring File[</code><code>/etc/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/state</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/etc/puppet/fileserver</code><code>.conf]: Autorequiring File[</code><code>/etc/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/server_data</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/etc/puppet/manifests</code><code>]: Autorequiring File[</code><code>/etc/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/bucket</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/public_keys</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl</code><code>]: Autorequiring File[</code><code>/var/lib/puppet</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/certs</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/yaml</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/rrd</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/reports</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/facts</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/private_keys</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/public_keys</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/certs</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/state</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/private</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/lib</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/bucket</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/certificate_requests</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/server_data</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: Finishing transaction 70003525843560</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca/signed</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl/ca</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca/requests</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl/ca</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca/private</code><code>]: Autorequiring File[</code><code>/var/lib/puppet/ssl/ca</code><code>]</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca/signed</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca/private</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: </code><code>/File</code><code>[</code><code>/var/lib/puppet/ssl/ca/requests</code><code>]</code><code>/ensure</code><code>: created</code>

<code>debug: Finishing transaction 70003525749380</code>

<code>info: Creating a new SSL key </code><code>for</code> <code>ca</code>

<code>info: Creating a new SSL certificate request </code><code>for</code> <code>ca</code>

<code>info: Certificate Request fingerprint (md5): E4:F9:A5:7C:CD:DC:D5:F4:30:C5:97:D4:4B:75:E2:1A</code>

<code>notice: Signed certificate request </code><code>for</code> <code>ca</code>

<code>notice: Rebuilding inventory </code><code>file</code>

<code>debug: Using cached certificate </code><code>for</code> <code>ca</code>

<code>info: Creating a new certificate revocation list</code>

<code>info: Creating a new SSL key </code><code>for</code> <code>server.magedu.com</code>

<code>info: Creating a new SSL certificate request </code><code>for</code> <code>server.magedu.com</code>

<code>info: Certificate Request fingerprint (md5): EC:52:9E:3B:8A:92:A3:E2:82:FB:D6:EF:7B:36:50:1F</code>

<code>notice: server.magedu.com has a waiting certificate request</code>

<code>debug: Using cached certificate_request </code><code>for</code> <code>server.magedu.com</code>

<code>notice: Signed certificate request </code><code>for</code> <code>server.magedu.com</code>

<code>notice: Removing </code><code>file</code> <code>Puppet::SSL::CertificateRequest server.magedu.com at </code><code>'/var/lib/puppet/ssl/ca/requests/server.magedu.com.pem'</code>

<code>notice: Removing </code><code>file</code> <code>Puppet::SSL::CertificateRequest server.magedu.com at </code><code>'/var/lib/puppet/ssl/certificate_requests/server.magedu.com.pem'</code>

<code>notice: Starting Puppet master version 2.7.25</code>

<code>debug: Finishing transaction 70003524197780</code>

<code>debug: No modules </code><code>mount</code> <code>given; autocreating with default permissions</code>

<code>debug: No plugins </code><code>mount</code> <code>given; autocreating with default permissions</code>

出現以上資訊時,證明測試沒有問題,此時可以使用:

<code>service puppetmaster start</code>

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411310PLp7.png" target="_blank"></a>

以172.16.10.122為例:

<code>[root@node2 ~]</code><code># puppet agent --server=server.magedu.com --no-daemonize -d</code>

<code>### 會出現以下資訊:</code>

<code>info: Creating a new SSL key </code><code>for</code> <code>node2.example.com</code>

<code>info: Caching certificate </code><code>for</code> <code>ca</code>

<code>info: Creating a new SSL certificate request </code><code>for</code> <code>node2.example.com</code>

<code>info: Certificate Request fingerprint (md5): 1B:D4:E5:D9:15:A8:87:5B:67:C0:4B:C2:72:\</code>

<code> </code><code>15:45:BA</code>

<code>###############################################################</code>

<code>此時在Master端:</code>

<code>[root@server ~]</code><code>#  puppet cert --list</code>

<code>  </code><code>"node2.example.com"</code> <code>(1B:D4:E5:D9:15:A8:87:5B:67:C0:4B:C2:72:15:45:BA)</code>

<code>簽名:</code>

<code>[root@server ~]</code><code>#  puppet cert --sign node2.example.com</code>

<code>notice: Signed certificate request </code><code>for</code> <code>node2.example.com</code>

<code>notice: Removing </code><code>file</code> <code>Puppet::SSL::CertificateRequest node2.example.com at \</code>

<code>'/var/lib/puppet/ssl/ca/requests/node2.example.com.pem'</code>

<code>#####################################################################</code>

<code>此時Agent端出現:</code>

<code>debug: Using cached certificate </code><code>for</code> <code>node2.example.com</code>

<code>notice: Starting Puppet client version 2.7.25</code>

<code>表明簽署成功。</code>

<code>####################################################################</code>

<code>確定上述agent相關操作不存在問題後,便可以将--server選項指定的資訊存儲與agent的配置檔案中</code>

<code>,并以服務的方式啟動puppet agent了。</code>

<code>其配置檔案為</code><code>/etc/puppet/puppet</code><code>.conf</code>

<code>echo</code> <code>"server=server.magedu.com"</code> <code>&gt;&gt; </code><code>/etc/puppet/puppet</code><code>.conf</code>

<code>service puppet start</code>

172.16.10.77同樣的配置。

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414411311IKZU.png" target="_blank"></a>

puppet用戶端預設每30分鐘很伺服器通訊一次,但是有時,我們希望伺服器能夠給用戶端緊急推送一些任務,于是就有了puppet kick(puppet 2.6以前叫puppetrun)。

<code>1)編輯用戶端配置檔案</code><code>/etc/puppet/puppet</code><code>.conf在[agent]端中添加如下</code>

<code>listen=</code><code>true</code>

<code>2)在用戶端編輯或建立新檔案</code><code>/etc/puppet/namespaceauth</code><code>.conf,包含下面内容</code>

<code>[puppetrunner]</code>

<code>allow *.magedu.com</code>

<code>3)在用戶端編輯檔案auth.conf,添加如下内容</code>

<code>path    </code><code>/run</code>

<code>  </code><code>method  save</code>

<code>  </code><code>auth    any</code>

<code>  </code><code>allow   server.magedu.com</code><code>## 注意,這一項放到 path /前面</code>

<code>4)推送方法,在伺服器端運作指令</code>

<code>[root@server puppet]</code><code># puppet kick -p 1 --host node2.example.com</code>

<code>Triggering node2.example.com</code>

<code>Getting status</code>

<code>status is success</code>

<code>node2.example.com finished with </code><code>exit</code> <code>code 0</code>

<code>Finished</code>

配置基本完成。

本文轉自 羊木狼 51CTO部落格,原文連結:http://blog.51cto.com/guoting/1568590,如需轉載請自行聯系原作者