天天看點

一步一步學會puppet(一)--工作原理與資源

簡介

puppet是一種Linux、Unix、windows平台的集中配置管理系統;

使用自有的puppet描述語言,可管理配置檔案、使用者、cron任務、軟體包、系統服務等,puppet把這些系統實體稱之為資源;

puppet的設計目标是簡化對這些資源的管理以及妥善處理資源間的依賴關系

puppet的基礎架構

<a href="http://s3.51cto.com/wyfs02/M02/27/D4/wKioL1N05HCxRF9_AAKs4elQqbI030.jpg" target="_blank"></a>

puppet是集中式的配置管理工具,通過自有配置語言對節點進行目标狀态定義,并能夠基于網絡實作目标狀态的維護;

puppet的工作模型

<a href="http://s3.51cto.com/wyfs02/M02/27/D4/wKiom1N05NHh783aAAaOyl2zD-o470.jpg" target="_blank"></a>

puppet通過聲明性、基于子產品的方法進行IT自動化管理;

puppet的基本工作流程

<a href="http://s3.51cto.com/wyfs02/M00/27/D4/wKiom1N05SvzNLDUAAIlUMdNfsg897.jpg" target="_blank"></a>

重要概念

資源:定義目标狀态的核心元件;

核心資源包括:notify、package、group、user、file、exec、cron、service等;

子產品:以資源為核心,是類的集合,如mod1,mod2

節點:以被管理主機為為核心,如node1,node2

puppet利用子產品+節點的方式,實作目标狀态的定義

manifest:清單,用于定義并儲存資源,是一個資源組織工具;

facter:擷取各被管理節點資源使用情況的方式;

單機模式下的安裝使用

1

2

3

4

5

6

7

<code>yum -y </code><code>install</code> <code>ruby </code><code># 安裝ruby環境</code>

<code>yum -y localinstall facter-1.7.3-1.el6.x86_64.rpm </code><code># puppet 2.7版本依賴facter 2.0以下的版本</code>

<code>yum -y localinstall puppet-2.7.25-1.el6.noarch.rpm</code>

<code># 列出資源類型</code>

<code>puppet describe -l</code>

<code># 顯示資源notify的使用幫助</code>

<code>puppet describe notify</code>

執行個體解析

核心資源1--notify

<code># vi /tmp/test.pp</code>

<code>notify {</code><code>'notice'</code><code>:</code>

<code>    </code><code>message =&gt; </code><code>'welcome to puppet world'</code><code>, </code><code># notify的輸出的消息</code>

<code>}</code>

<code># puppet apply test.pp</code>

<code># puppet apply test.pp -v # 顯示詳細資訊,包括配置應用版本号</code>

<code># puppet apply test.pp -v -d # 開啟debug功能</code>

核心資源2--package

<code># vi nginx.pp</code>

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

<code>    </code><code>ensure =&gt; present, </code><code># 程式包已安裝狀态</code>

<code>    </code><code>name =&gt; nginx,    </code><code># 安裝的程式包名</code>

<code># puppet apply nginx.pp -v</code>

核心資源3--file

8

9

10

11

12

<code># vi file.pp</code>

<code>file</code> <code>{</code><code>'abc.txt'</code><code>:</code>

<code>    </code><code>ensure =&gt; present, </code><code># 檔案存在</code>

<code>    </code><code>content =&gt; </code><code>'hello puppet'</code><code>, </code><code># 檔案内容</code>

<code>    </code><code>path =&gt; </code><code>"/tmp/abc2.txt"</code><code>, </code><code># 生成的檔案</code>

<code>file</code> <code>{</code><code>'fstab.symbolic'</code><code>:</code>

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

<code>    </code><code>target =&gt; </code><code>"/etc/fstab"</code><code>,    </code><code># 連結的源檔案</code>

<code>    </code><code>path =&gt; </code><code>"/tmp/fstab.symbolic"</code><code>, </code><code># 生成的檔案</code>

<code>    </code><code>links =&gt; follow, </code><code># 表示為軟連結</code>

核心資源4--exec

<code># vi command.pp</code>

<code>exec</code> <code>{</code><code>'echo command'</code><code>:</code>

<code>    </code><code>command</code> <code>=&gt; </code><code>'mktemp /tmp/tmp.XXXXX'</code><code>, </code><code># 執行的指令</code>

<code>    </code><code>path =&gt; </code><code>'/bin:/sbin:/usr/bin:/usr/sbin'</code><code>, </code><code># 指令搜尋的路徑</code>

核心資源5--user/group

13

14

<code># vi group_user.pp</code>

<code>group {</code><code>'testgrp'</code><code>:</code>

<code>    </code><code>ensure =&gt; present,    </code><code># 保證使用者組存在</code>

<code>    </code><code>gid =&gt; 1001, </code><code># 使用者組GID</code>

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

<code>user {</code><code>'testuser'</code><code>:</code>

<code>    </code><code>ensure =&gt; present,    </code><code># 保證使用者存在</code>

<code>    </code><code>gid =&gt; 1001,</code>

<code>    </code><code>uid =&gt; 1001,</code>

<code>    </code><code>home =&gt; </code><code>'/home/test'</code><code>, </code><code># 使用者家目錄</code>

<code>    </code><code>shell =&gt; </code><code>'/bin/tcsh'</code><code>, </code><code># 使用者的shell</code>

<code>    </code><code>password =&gt; </code><code>'$1$7990650b$sAvnSF1/5e4aIWdBMrH7U/'</code><code>, </code><code># 使用者密碼</code>

<code>    </code><code>managehome =&gt; </code><code>true</code><code>, </code><code># 指定建立使用者家目錄</code>

核心資源6--cron

<code># vi cron.pp</code>

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

<code>    </code><code>command</code> <code>=&gt; </code><code>'/usr/sbin/ntpdate 172.16.0.1 &amp;&gt; /dev/null'</code><code>, </code><code>#執行的指令</code>

<code>    </code><code>minute =&gt; </code><code>'*/5'</code><code>, </code><code># 指定cron運作的時間間隔,其它時間段預設都為*</code>

核心資源7--資源次序require/before

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

<code>     </code><code># before =&gt; Service['nginx'], # 也可在此指定程式包安裝的後續操作</code>

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

<code>    </code><code>enable</code> <code>=&gt; </code><code>true</code><code>, </code><code># 保證服務開機啟動</code>

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

<code>    </code><code>require =&gt; Package[</code><code>'nginx'</code><code>], </code><code># 指定服務安裝的前提條件</code>

核心資源8--資源次序notify/subsribe

<code># vi order.pp</code>

<code>file</code> <code>{</code><code>'/tmp/test4.txt'</code><code>:</code>

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

<code>    </code><code>content =&gt; </code><code>"hello puppet"</code><code>,</code>

<code>     </code><code># notify =&gt; Exec['monitor'], # 也可在此指定檔案建立後,主動通知下一步的指令執行</code>

<code>exec</code> <code>{</code><code>'monitor'</code><code>:</code>

<code>    </code><code>command</code> <code>=&gt; </code><code>'echo "/tmp/test4.txt changed." &gt;&gt; /tmp/monitor.txt'</code><code>,</code>

<code>    </code><code>refreshonly =&gt; </code><code>true</code><code>, </code><code># 指定隻在檔案内容發生改變時,才重新執行此處指令</code>

<code>    </code><code>subscribe =&gt; File[</code><code>'/tmp/test4.txt'</code><code>], </code><code># 追蹤上一步建立的檔案資源改變情況</code>

<code>    </code><code>path =&gt; </code><code>'/bin:/sbin:/usr/bin:/usr/sbin'</code><code>,</code>

核心資源9--資源次序 -&gt;(次序鍊)/~&gt;(通知鍊)

<code># vi order2.pp</code>

<code>} ~&gt;     </code><code># 在此為通知鍊,作用類似notify</code>

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

變量定義及引用

<code># vi var.pp</code>

<code>$pkgname=</code><code>'haproxy'</code>

<code>package {$pkgname:    </code><code># 引用使用者自定義變量</code>

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

<code>    </code><code>content =&gt; </code><code>"worker_processes : $processorcount"</code><code>, </code><code># 引用facters變量</code>

if語句的使用

<code># vi if.pp</code>

<code>if</code> <code>$operatingsystem =~ /^(?i-mx:(centos|redhat|fedora))/ { </code><code># 正規表達式作為if語句的判斷條件</code>

<code>    </code><code>notice(</code><code>"Welome to $1 linux world."</code><code>)</code>

<code>if</code> <code>$operatingsystem == </code><code>'CentOS'</code> <code>{ </code><code># 等值比較運算作為if語句的判斷條件</code>

<code>    </code><code>notify {</code><code>'centos'</code><code>: message =&gt; </code><code>"Welcome to CentOS linux world."</code><code>,}</code>

<code>} elsif $operatingsystem == </code><code>'Fedora'</code> <code>{</code>

<code>    </code><code>notify {</code><code>'fedora'</code><code>: message =&gt; </code><code>"Welcome to Fedora linux world."</code><code>,}</code>

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

<code>    </code><code>notify {</code><code>'unkown'</code><code>: message =&gt; </code><code>"Unkown Operating System"</code><code>,}</code>

case語句的使用

<code># vi case.pp</code>

<code>case</code> <code>$operatingsystem { </code><code># case語句進行多值比較,并執行比對的響應代碼塊</code>

<code>    </code><code>/^(?i-mx:centos|fedora|redhat)/ : {package{</code><code>"httpd"</code><code>:ensure =&gt; present,provider =&gt; yum,}}</code>

<code>    </code><code>/^(?i-mx:ubuntu|debian)/ :{package{</code><code>"apache2"</code><code>:ensure =&gt; present,provider =&gt; apt,}}</code>

<code>    </code><code>default: {notify {</code><code>"notice"</code><code>:message =&gt; </code><code>"unknown system"</code><code>,}}</code>

seletor語句的使用,文法與case類似

<code># vi selector.pp</code>

<code>$webserver = $operatingsystem ? { </code><code># seletor類似三目運算符,直接傳回比對項的value值</code>

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

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

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

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

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

<code>package {$webserver:</code>

<code>    </code><code>provider =&gt; $webprovider,</code>

puppet的類使用

<code># vi class.pp</code>

<code>class nginx {</code>

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

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

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

<code>include nginx </code><code># 聲明類</code>

<code># class {nginx:} # 聲明類的另一種方式</code>

puppet的帶參數的類使用

15

16

17

<code># vi class2.pp</code>

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

<code>class httpd ($pkgname=</code><code>'apache2'</code><code>) {</code>

<code>    </code><code>package {</code><code>"$pkgname"</code><code>:</code>

<code>    </code><code>service {</code><code>"$pkgname"</code><code>:</code>

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

<code>        </code><code>require =&gt; Package[</code><code>"$pkgname"</code><code>],</code>

<code>class {</code><code>'httpd'</code><code>:     </code><code># 聲明類,并将pkgname變量的值帶入</code>

<code>    </code><code>pkgname =&gt; $webserver,</code>

puppet子產品的使用--執行個體1

18

19

20

21

22

23

24

25

26

27

28

29

30

31

<code># vi class3.pp</code>

<code>class nginx::rproxy inherits nginx { </code><code># 定義nginx的子類rproxy,繼承nginx類的相關屬性</code>

<code>    </code><code>file</code> <code>{</code><code>'/etc/nginx/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>"/tmp/nginx/nginx.reverse_proxy.conf"</code><code>,</code>

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

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

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

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

<code>class nginx::web inherits nginx {    </code><code># 定義nginx的子類web,繼承nginx類的相關屬性</code>

<code>        </code><code>source</code> <code>=&gt; </code><code>"/tmp/nginx/nginx.web.conf"</code><code>,</code>

<code># vi node.pp</code>

<code>import</code> <code>"/tmp/class3.pp"</code>

<code>include nginx::web    </code><code># 聲明子類</code>

<code># puppet applay -v node.pp</code>

puppet子產品的使用--構模組化塊nginx

32

33

34

35

36

37

38

39

40

41

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

<code>mkdir</code> <code>-pv nginx/{files,lib,manifests,templates} </code><code># 建立子產品nginx所需的目錄結構</code>

<code>.</code><code>/nginx/files</code><code>:    </code><code># 編輯類中所需的靜态檔案</code>

<code>total 8</code>

<code>-rw-r--r-- 1 root root 1062 May 15 18:15 nginx.reverse_proxy.conf</code>

<code>-rw-r--r-- 1 root root 1059 May 15 18:15 nginx.web.conf</code>

<code>.</code><code>/nginx/manifests</code><code>:    </code><code># 定義子產品所需的清單檔案,init.pp檔案是必須的</code>

<code>total 12</code>

<code>-rw-r--r-- 1 root root 131 May 15 18:33 init.pp</code>

<code>-rw-r--r-- 1 root root 246 May 15 18:15 rproxy.pp</code>

<code>-rw-r--r-- 1 root root 213 May 15 18:34 web.pp</code>

<code># vi init.pp    # 定義nginx主類</code>

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

<code># vi rproxy.pp    # 定義nginx的子類之一</code>

<code>class nginx::rproxy inherits nginx {</code>

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

<code># vi web.pp    # 定義nginx的子類之一</code>

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

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

<code>puppet apply -</code><code>v</code> <code>-e </code><code>'include nginx'</code> <code># 調用子產品,執行nginx服務安裝配置</code>

總結

通過以上執行個體的了解和學習,可以對puppet中主要的資源類型和用法加深了了解,最後2個執行個體已經開始嘗試已子產品化的結構去運作puppet了,下一篇将會介紹puppet更多用法,敬請期待!

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

繼續閱讀