日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

puppet全方位学习之总结

發布時間:2025/3/19 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 puppet全方位学习之总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

puppet總結

一、基礎知識

??? 1. Puppet是開源的基于Ruby的系統配置管理工具,依賴于C/S的部署架構。Puppet這樣的自動化配置管理工具可以幫助系統管理員更加方便的完成多臺服務器的升級軟件包、管理配置文件、系統服務、cron任務、添加新的配置、修復錯誤等重復工作。

2. Puppet的運作是典型的C/S模式,一個Server,多個Client。這個Server被稱作master,而Client被叫作agent,也就是指屬于master的node(節點)。在每個instance上,無論它是master還是agent,Puppet都作為daemon程序常駐進程,agent們通過SSL標準與master建立加密認證連接,而master就作為接收上級(也就是用戶)的命令并向agent們發送命令的指揮官。

3. Puppet的語法允許你創建一個單獨腳本,用來在你所有的目標主機上建立一個用戶。所有的目標主機會依次使用適用于本地系統的語法解釋和執行這個模塊。

4. 在大規模的生成環境中,如果只有一臺puppetmaster會忙不過來的,因為puppet是用ruby 的,ruby是解析型語言,每個客戶端來訪 問,都要解析一次,當客戶端多了就忙不過來,所以需要擴展成一個服務器組。puppetmaster可以看作一個web服務器,實際上也是由ruby提供 web服務器模塊來做的。因此可以利用web代理軟件來配合puppetmaster做集群設置。

5. puppet,可以運行一個服務器端,然后每個客戶端通過ssl證書連接服務器,得到本機器的配置列表,然后更加列表的來完成配置工作,所以如果硬件配置好,在一天之內配置好上千上萬臺機器是很容易實現的事情,前提得大部分機器配置類似。

6. ?puppet是一種Linux、Unix平臺的集中配置管理系統,所謂配置管理系統,就是管理機器里面諸如文件,用戶,進程,軟件包這些資源,其設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關系。puppet使用一種描述性語言來定義配置項,配置項中被稱為”資源”,描述性語言可以聲明你的配置的狀態---比如聲明一個軟件包應該被安裝或者一個服務應該被啟動。

7. 在中心的Server上安裝puppet-server包,并運行puppetmasterd進程;在被管理機上安裝puppet包,并運行puppetd進程。另外,在每臺主機上配置好自己的hostname,之后每臺機器要hostname區分

8. puppet的服務器端保存著所有的對客戶端服務器的配置代碼,在puppet里面叫做manifest. 客戶端下載manifest之后,可以根據manifest對服務器進行配置,例如軟件包管理,用戶管理和文件管理等等。這樣就把日常的系統管理任務代碼化了,代碼化的好處是可以分享,保存,避免重復勞動,也可以快速恢復以及快速的大規模部署服務器。同時,manifest可以的根據客戶端服務器的配置情況(硬件和軟件)來動態生成。

Puppet 結構

9. puppet的代碼主要就是由這些資源和資源的屬性構成。

10. puppet兩種執行模式,一是直接運行puppetd file.manifest ,二是puppetd --server puppetmaster.server.com;前面一種是直接讀取file.mainfest文件進行配置,后一種是從服務端下載manifest進行配置。

11. 編寫一個manifest文件/tmp/1.pp,內容如下:

f i l e {

" /tmp/ t e s t " :

content=>" h e l l o \n" ,

mode => 0644;

}

然后執行puppetd /tmp/1.pp ;執行完成以后,將會在/tmp目錄下面生成一個文件test,文件內容是"hello";第一行的file表明是什么類型的資源,第二行的"/tmp/test"叫做這個資源的title;用來代表這個資源,后面兩行設置這個資源的屬性。

12.

package {

[ " gcc " , "make" ] :

ensure => i n s t a l l e d ;

}

這是配置一個包資源,包是gccmake, 第三行是指定這兩個包的屬性,在這里是installed,表示要安裝這兩個軟件包。再次提醒:不同的資源有不同的屬性,但是又有一些屬性是所有資源都共有的,例如tag,這種屬性叫做元屬性。

13. puppetmaster的第一個執行的代碼是在/etc/puppet/manifest/site.pp 因此這個文件必須存在,而且其他的代碼也要通過代碼來調用. 現在,建立一個最簡單的site.pp文件,內容如下

node default {

f i l e { " /tmp/temp1 . t x t " :

content => " h e l l o " ; }

}

?

二、原理

??? Puppet是一個C/S架構的配置管理工具,在中央服務器上安裝puppet-server軟件包(被稱作Puppet master)。在需要管理的目標主機上安裝puppet客戶端軟件(被稱作Puppet Client)。當客戶端連接上Puppet master后,定義在Puppet master上的配置文件會被編譯,然后在客戶端上運行。每個客戶端默認每半個小時(可以設置runinterval=30)和服務器進行一次通信,確認配置信息的更新情況。如果有新的配置信息或者配置信息已經改變,配置將會被重新編譯并發布到各客戶端執行。也可以在服務器上主動觸發一個配置信息的更新,強制各客戶端進行配置。如果客戶端的配置信息被改變了,它可以從服務器獲得原始配置進行校正。

1)客戶端通過facter收集客戶端信息并發送至服務端

2)連接服務端并請求catalog日志

3)請求節點(node)的信息

4)從服務器端接收節點(node)的實例

5)編譯代碼(包括語法檢查等工作)

6)查詢是否有exported 虛擬資源

7)如有,則從數據庫接收虛擬資源

8)接收完整的catalog日志

9)存儲catalog日志到數據庫

10)客戶端接收完整的catalog日志

?

Puppet的工作細節分成如下幾個步驟:

1、客戶端puppetd調用facterfacter會探測出這臺主機的一些變量如主機名、內存大小、IP地址等。然后puppetd把這些信息發送到服務器端。

2、服務器端的puppetmaster檢測到客戶端的主機名,然后會到manifest里面對應的node配置,然后對這段內容進行解析,facter送過來的信息可以作為變量進行處理的,node牽涉到的代碼才解析,其它的代碼不不解析,解析分幾個過程:語法檢查、然后會生成一個中間的偽代碼,然后再把偽代碼發給客戶機。

3、客戶端接收到偽代碼之后就會執行,客戶端再把執行結果發送給服務器。

4、服務器再把客戶端的執行結果寫入日志。

?

?

?

實驗效果圖:

?

?

三、基本安裝

注意:要在安裝軟件以前先設置主機名,因為生成證書的時候要把主機名寫入證書,如果證書生成好了再改主機名,就連不上,這是很多初學者遇到問題。每個客戶端的證書要經過根證書簽名才能和服務器連接。

?

系統配置:centos i386 5.x???? 最小化安裝+ Developtool

服務端ip: 192.168.10.1? hostname:master.perofu.com

客戶端ip: 192.168.10.3? hostname:client.perofu.com

?

準備情況:ruby必須是1.8.5的,以上的不兼容。

一、 服務器端安裝

1.

??? echo "192.168.10.1 master.perofu.com" >>/etc/hosts

echo "192.168.10.3 client.perofu.com" >>/etc/hosts

?

2.

??? hostname master.perofu.com

???

3.

??? vi /etc/sysconfig/network

??????? HOSTNAME=master.perofu.com

?

4.安裝ruby1.8.5,(1.8.6)不支持。如果需要查看幫助文檔,才需要安裝ruby-rdoc ruby-irb

??? yum -y install ruby ruby-libs ruby-rdoc ruby-irb

?

5.安裝NTP同步時間,統一master和client上的時間(每天凌晨5點10分同步time.nist.gov,并將 Linux 時間寫入 BIOS時)

??? yum install ntp -y

??? chkconfig --level 35 ntpd on

??? crontab -e

??? 10 5 * * * root /usr/sbin/ntpdate time.nist.gov ; /sbin/hwclock –w

??? service crond restart

??? ntpdate pool.ntp.org; hwclock –w

?

6.安裝facter

??? tar -axf facter-latest.tgz -C /usr/local/src/

??? cd /usr/local/src/facter-1.6.8/

??? ruby install.rb

?

7.安裝puppet

??? tar -axf puppet-2.6.3.tar.gz -C /usr/local/src/

??? cd /usr/local/src/puppet-2.6.3/

??? ruby install.rb

mkdir -p /etc/puppet/manifests

cp conf/auth.conf /etc/puppet/

cp conf/redhat/fileserver.conf /etc/puppet/

cp conf/redhat/puppet.conf /etc/puppet/

cp conf/redhat/server.init /etc/init.d/puppetmaster

chmod +x /etc/init.d/puppetmaster

chkconfig --add puppetmaster

chkconfig puppetmaster on

puppetmasterd --mkusers???? #生成pupput用戶,#如出現錯誤,則執行groupadd puppet;useradd -g puppet puppet

mkdir -p /var/lib/puppet/rrd

chown puppet:puppet /var/lib/puppet/rrd

/etc/init.d/puppetmaster start? #啟動

netstat -anplt |gerp :8140? #是否已啟動

?

8.測試

??? puppetca -s -a??????????? #為所有的客戶端簽證書,僅對某個客戶端第一次使用

?

??? vi /etc/puppet/manifests/site.pp

??????? file { "/tmp/testfile":

??????? ensure => present,

??????? mode => 644,

??????? owner => root,

??????? group => root

??????? }

??? ?/etc/init.d/puppetmaster restart?? #第一次創建site.pp,必須重啟

?

?

?

?

二、 客戶端安裝

1.

??? echo "192.168.10.1 master.perofu.com" >>/etc/hosts

echo "192.168.10.3 client.perofu.com" >>/etc/hosts

?

2.

??? hostname client.perofu.com

?

3.

??? vi /etc/sysconfig/network

??????? HOSTNAME=client.perofu.com

?

4.安裝ruby1.8.5,(1.8.6)不支持。如果需要查看幫助文檔,才需要安裝ruby-rdoc ruby-irb

??? yum -y install ruby ruby-libs ruby-rdoc ruby-irb

?

5.安裝NTP同步時間,統一master和client上的時間(每天凌晨5點10分同步time.nist.gov,并將 Linux 時間寫入 BIOS時)

??? yum install ntp -y

chkconfig --level 35 ntpd on

crontab -e

??? 10 5 * * * root /usr/sbin/ntpdate time.nist.gov ; /sbin/hwclock –w

service crond restart

ntpdate pool.ntp.org; hwclock –w

?

6.安裝facter

tar -axf facter-latest.tgz -C /usr/local/src/

cd /usr/local/src/facter-1.6.8/

ruby install.rb

?

7.安裝puppet

tar -axf puppet-2.6.3.tar.gz -C /usr/local/src/

cd /usr/local/src/puppet-2.6.3/

ruby install.rb

mkdir -p /etc/puppet

cp conf/auth.conf /etc/puppet/

cp conf/namespaceauth.conf /etc/puppet/

cp conf/redhat/puppet.conf /etc/puppet/

cp conf/redhat/client.init /etc/init.d/puppet

chmod +x /etc/init.d/puppet

chkconfig --add puppet

chkconfig puppet on

puppetd --mkusers?????? #如出現錯誤,則執行groupadd puppet;useradd -g puppet puppet

mkdir -p /var/lib/puppet/rrd

chown puppet:puppet /var/lib/puppet/rrd

/etc/init.d/puppet start

?

8.測試(服務器的第8步先執行)

??? puppetd --test --server master.perofu.com #向服務器發送證書請求,等待服務器的簽收

??? puppetd --test --server master.perofu.com #簽過之后,再次向服務器發起請求

??? 出現以下內容,表示服務器和客戶端能正常通訊

??? ??? notice: Finished cactlog run in 0.02 seconds

??? puppetd --test --server master.perofu.com

#請求服務器的/etc/puppet/manifests/下的內容

??? ll /tmp/testfile????????????? #如有,則表示測試成功

?

四、語法

1.puppet的代碼主要就是由這些資源和資源的屬性構成. 每個資源都包含有類型(type),標題(title)和一些其他屬性的列表。

這是一個典型的resource(資源)的結構:

type { "title ":

    attribute =>"value",

????????????? ...

????????????? attribute => "value",

  }

2. type是有規定的,并不是自己隨便寫的,在Puppet的官方文檔里有所有可用的typeaugeascomputercronexecfilefilebucketgrouphostinterfacek5loginmacauthorization

mailaliasmaillistmcxmountnagios_commandnagios_contactnagios_contactgroupnagios_hostnagios_hostdependencynagios_hostescalationnagios_hostextinfonagios_hostgroupnagios_servicenagios_servicedependencynagios_serviceescalationnagios_serviceextinfonagios_servicegroupnagios_timeperiodnotifypackageresourcerouterscheduleselbooleanselmoduleservicessh_authrized_keysshkeystagetidyuservlanyumrepozfszonezpool

3. 不同的title(標題),表示不同的資源;冒號前的那一部分,就是資源的標題(title;在標題后面,緊跟的是特定的Attributes(屬性),屬性用來告訴Puppet如何去配置資源。

4. 屬性和值的結構:attribute => "value",

5. 每一個屬性鍵值對后面都要有一個逗號,最后一個屬性鍵值對后面可以使用逗號也可以使用分號。

6. 如果一個資源只有一個屬性,它可以被聲明成一行,像這樣:

file { "/etc/group": owner => "root" }

7. 每個資源寫多行的結構。多個資源可以被配置在一個資源類型里面如:
file {
"/etc/passwd":
ensure => present;
"/etc/group" :
owner => "root",
group => "root";
}

8. 首字母大寫的資源類型永遠是一個引用,而小寫的是一個聲明。由于資源只能被聲明一次,所以重復兩次相同的聲明會導致錯誤。這是Puppet保證你的配置模塊化的重要特性之一。

9.除了每個資源類型的屬性外,Puppet同時具有稱作元參數(Metaparameters)的全局屬性。元參數可以與任何資源類型協作。

10. 有時你需要為一組資源指定一個默認的參數值;Puppet使用一個首字母大寫并且沒有標題(title)的資源格式來實現這個功能。例如,在下面的例子中,我們將為所有的命令設定一個默認路徑:

Exec { path => "/usr/bin:/bin:/usr/sbin:/sbin" }

exec { "echo this works": }

這個代碼段中的第一個聲明為可執行(exec)資源提供了一個默認值;資源Exec需要一個絕對路徑或者能夠找到可執行程序的路徑。這樣減少了代碼量,同 時,在需要時這個路徑能被單獨的資源覆蓋。通過這種方法,你可以為整個配置文件指定一個默認路徑,然后在需要的時候覆蓋掉這個值。

11. Puppet中,資源的默認值對任何資源均生效。

12. 類的關鍵字是class,它的內容由一對大括號包裹。下面這個例子創建了一個用于管理兩個獨立文件的類:

class unix { ??? file { ??????? "/etc/passwd": ????????????owner => "root", ????????????group => "root", ????????????mode? => 644; ??????? "/etc/shadow": ????????????owner => "root", ????????????group => "root", ????????????mode? => 440; ??? } }

?

13. 定義使用和類相同的基本形式,不同的是它們使用關鍵字define(而不是class),并且定義支持參數但不支持繼承。就像之前所提到的,定義可以接收 參數并在相同的系統上多次重用。比如我們可能會在一個系統內創建多個版本庫,這里可以使用定義而不是類。下面是一個例子:

define svn_repo($path) { ??? exec { "/usr/bin/svnadmin create $path/$title": ??????? unless => "/bin/test -d $path", ??? } } ? svn_repo { puppet_repo: path => "/var/svn_puppet" } svn_repo { other_repo:? path => "/var/svn_other" }

注意變量是怎么在定義中使用的。我們使用$符號表示變量。注意上面的變量$title。這里有一點專業知識,在Puppet 0.22.3及以后的版本中,定義可以分別使用變量$title$name表示標題和名字。默認情況下,$title$name被設置成相同值,不過 你可以設置一個標題值,同時將一個不同的名字值作為參數進行傳遞。$title$name只在定義中生效,類或其他資源均不生效。

?

<一>變量和數組

?

1.變量

puppet用$符號定義變量,變量的內容。

?

聲明格式:$變量名="值"

引用格式: ${變量名}

?

$test=" hello , guys "

file {"/tmp/ test " :

content => ${test};

}

?

2.數組

??? puppet利用方括號定義數組,數組的內容逗號分割,分別用雙引號括起來

[ "apache2" , " httpd " , " ssh " ]

?

?

?

<二>資源:

定義一個資源,需要指定資源的type(類型)和資源的title(標題)

這是一個典型的resource(資源)的結構:

type { "title1 ",…,"title ":

    attribute => "value",

????????????? ...

????????????? attribute => "value",

  }

看一個例子:

file{

"/etc/passwd":

name => "/etc/passd",

owner => root,

group => root,

mode => 644;

}

上面的代碼讓/etc/passwd的權限保持644,并且屬于root用戶和root用戶組,file是指定資源的類型是"file"類型,第二行的"/etc/passwd"是資源的title, title的作用是讓puppet能唯一標識這個資源。第三行的name指定了要對那個文件操作,默認情況下,name都等于title,所以很多時候name是可以省略的。這點要注意。看下面的例子:

file{

"sshdconfig":

name => $operatingsystem ? {

solaris => "/usr/local/etc/ssh/sshd_config",

default => "/etc/ssh/sshd_config",

},

owner => root,

group => root,

mode => 644,

}

資源的title是sshdconfig,但是name卻可以通過判定操作系統自己選擇合適的值。這樣,當其他的資源要依賴sshdconfig的時候,只需要說明依賴sshdconfig就行,不需要關心文件到底在什么路徑下面。例如下面的代碼:

service {"sshd":

subscribe => File[sshdconfig],

}

指定了一個sshd的服務,這個服務如果發現文件資源sshdconfig 有變動,就會自己reload配置文件。是不是很方便呢?注意上面的subscribe后面的File,第一個字母要大寫,定義資源關系的時候,這里的字母要大寫

通常,在puppet代碼里面可能會定義很多相同的資源,可以用[]把所有資源的title寫在一起,例如:

file{

["/etc/passwd","/etc/hosts"]:

owner => root,

group => root,

mode => 644;

}

你可能已經發現了,每次定義文件的時候如果都輸入mode,owner,group會很繁瑣,因此你可以在puppet的site.pp的開頭定義資源的默認值。定義資源的默認值需要把資源的第一個資源大寫。例如下面的代碼讓所有的file資源的mode是644,owner是root。

File{owner => root,mode => 644;}

默認值可以被后面的設置覆蓋。

在puppet里面可以定義資源之間的關系,例如前面提到的,如果sshdconfig文件如果有修改,sshd服務就重啟。puppet里面還有另一個資源關系,依賴。例如資源A依賴資源B,如果資源B不存在,資源A就不被執行。定義資源依賴的屬性是requre 。例如:

file{

"/etc/apache2/port.conf":

content => "80",

require => Package["apache2"];

}

package{

"apache2":

ensure =>installed;

}

file資源設置port.conf的內容為80,但是在設置file資源之前,要求apache2這個軟件包配置好了(即file資源依賴Package["apache2"])

?

<三>資源的類型:

?

puppet的資源是由具體的系統管理任務抽象而來的,系統管理中遇到什么任務,就會有相應的資源類型,目前puppet支持的資源類型有:

file?????????? 文件/目錄的管理

package??????? 軟件包的管理(yum install|remove)

service??????? 某服務的管理(start|restart|stop|status)

cron?????????? crontab定時任務的管理

user?????????? 添加用戶

group????????? 添加用戶組

exec?????????? shell命令

notify???????? 資源之間的通訊

???

<四>常用資源:

puppet管理不同的資源,是利用不同的provider來管理的。例如管理package資源,在debian上面是用的apt-get,在redhat上面是用的yum 。在這里,apt,yum就是provider。在定義資源的時候,可以明確指定provider。但是通常都是puppet自己探測。

?

file資源

?

?

?

?

file {"title":????????????????????? #一般是文件名

??? ensure => present|absent|file|directory|link

content => "content",?? #文件內容(必須有,否則,文件的內容為空)

??? user => "username",

??? group => "groupname",

??? mode => 權限,?????? #四位八進制數

??? path => "title",

??? source => "puppet:///URL",

??? #指定到master上文件的絕對路徑或agent上本地文件絕對路徑

???

??? target =>?????????????? #指定目標文件,用于ln -s $target $title

??? recurse => true,??????????? #遞歸

??? purge => true,????????????? #將不再資源中管理的其他數據,刪除

??? force => true,????????????? #如不加,則不會刪除

}

?

content???? content => "字符串",

文件的內容(title或name)設置為content 參數后面的字符串, 新行,tab,空格可用 escaped syntax 表示(必須有,否則,文件的內容為空,除非你不需要)

?

ensure????? ensure => {absent|present|file|directory|link},

如果文件本來不存在是否要新建title名的文件,

present,檢查該文件是否存在,如果不存在就新建title名的文件,

absent, 文件存在,就會刪除title名的文件(如果recurse => true ,就會刪除目錄).

??????????? file, 不存在就新建title名的文件

??????????? directory, 不存在就新建title名的目錄

?

group?????? group => {gid|組名},

指定那個該文件的用戶組,值可以是gid或者組名

?

mode??????? mode => {rwx},

mode用于設置文件的權限(數字)r=4,w=2,x=1

?

owner?????? owner => {用戶名},

設置文件的屬主

?

path??????? path => "文件的路徑",

??????????? 指定要管理文件的路徑,必須用引號引起來, 這也是一個資源的 namevar ,通常path 等于資源的title

?

source????? source => {"puppet:///URL"|"完整的文件路徑"},

拷貝一個文件覆蓋當前文件,用checksum來判斷是否有必要進行復制,可以設置的值是一個引用master或agent的完整的文件路徑,或者是URI,當前支持的URI只有puppet和file ; 這是一個對文件常用的操作,可以讓puppet修改系統的配置文件.

?

backup????? backup => {|.文件名|false},

??? ?決定文件的內容在被修改前是否進行備份. 利用filebucket對文件進行備份,按文件的md5sum進行歸類,便于恢復文件的時候找到文件.可以把文件備份到 puppet 客戶端,也可以通過設置backpup => bucket_name 把文件備份到網絡上的其他機器. 如果backup的值是一個點號”.”開頭的字符串,puppet會把文件備份在同一目錄下,備份文件的擴展名就是 bakcup里面的那個字符串.如果設置 backup => false , 該文件不做備份.

?

recurse???? recurse => { true|false|inf|remote},

設置是否以及如何進行遞歸操作,即可以管理子目錄recurse,purge和force連用,用于刪除子目錄中,不在資源控制的文件或目錄

?

purge ????? purge => {true|false},?????????????

將不再資源中管理的其他數據,則刪除

?

force?????? force => {ture|false},

force是否可以刪除文件或目錄,與ignore相反

?

ignore????? ignore => {文件名|正則表達式},

??????????????? 當用recursion 方法復制一個目錄的時候,可以用ignore來設定過濾條件,符合過濾條件的文件不被復制或刪除. 使用ruby自帶的匹配法則.因此shell級別的過濾表達式完全支持,例如[a-g]*, 與force相反

?

target????? target => {"源文件或目錄"}

??????????? 是為創建鏈接文件的,即將target的值,作為源文件,title的值,作為目標文件。如lin -s $target $title。當且僅當ensure => link, 才可以使用

?

checksum??? checksum => {md5|mtime|time|timestamp},

怎樣檢查文件是否被修改,這個狀態用來在復制文件的時候使用, 這里有幾種檢測方式,包括md5 ,mtime,time,timestamp等.默認的檢測是用md5,

?

links?????? link => {follow|manage},

定義操作符合鏈接文件.文件拷貝的時候,

follow,會拷貝文件的內容,而不是只拷貝符合鏈接本身,

manage ,會拷貝符合鏈接本身.

?

recurselimit??? recurselimit => {數字},

遞歸的深度,設置的值可以匹配/^[0-9]+$/.

?

replace???????? replace => {true|false},

是否覆蓋已經存在的文件。可以設置的值是(true,yes),(false,no),注,true和yes一樣,false和no是一樣。

?

selrange??? 文件內容是否屬于SElinux哪個組成部分,只適于開啟了Selinux的機器。

selrole???? 文件所屬的SeLinux 角色

seltype???? 文件所屬的Selinux?? type

seluser???? 文件所屬的Selinux user

sourceselect??? 選擇拷貝目錄級別,默認,source是遞歸的

type??????? 檢查文件是否只讀。

?

?

例:

?

?

file資源在puppet里面用的挺多,屬性包括大家已經屬性的owner,group,mode,content等等。file還有兩個重要的命令,sourcetemplate.通常,一個文件的內容可以由content屬性來包含固定的內容,但是也可以用source命令來從其他url復制文件內容。目前puppet只支持puppet這個url,表示從puppet的fileserver去下載文件內容。例如:

source => "puppet://${fileserver}/lvs/${corp}.${idc}.keepalived.conf "

其中fileserver后面的lvs表示是lvs模塊的files目錄這個路徑。正如前面提到的一樣。用source就可以把很多配置文件放到puppet服務器端統一管理。

file資源的另一個template命令是一個功能強大的命令。利用template,可以通過erb模板生成文件內容,erb模板可以使用變量。而且還可以對變量進行計算和操作。這是puppet強大的地方,舉一個例子,你配置兩臺squid服務器,兩臺服務器的內存不一樣,那么在squid.conf里面有關內存的配置命令就要根據硬件配置來設置。在過去,你只能手工去判定和修改,現在puppet自己搞定。看下面的代碼:

file {

"/etc/squid/squid.conf":

mode => 0644,

content => template("squid/squid.conf.erb");

}

這里的template里面的"squid/squid.conf.erb"表示的路徑是squid模塊下面templates目錄

下的squid.conf.erb這個路徑。看看squid.conf.erb里面的部分內容1

cache_mem <%= Integer(vmx_memsize.to_i*0.45) -%> MB

visible_hostname <%= fqdn %>

在這里,cache_mem設置成總內存的45%大小,visible_hostname 設置成主機名。更多有

趣的功能也可以實現。

?

在使用puppet過程中,有時有個類需要使用到多個file 資源. 而這些資源有相同的屬性,例如,用戶和組相同,權限相同,你還是每次都照樣寫嗎?這里給大家提供一個小的技巧.其實這里我們可以給file 設置默認的屬性.就不用重復寫了.大大地簡化我們的代碼.

例如:
File {? ?? ?? ? ##這里的大寫,表示默認屬性,下面的兩個文件,屬主和組都會被設置為root且權限為644??
ensure => "present",
owner??=> "root",??
group??=> "root",??
mode? ?=> 644,
}
file {??"/etc/cobbler/modules.conf":
??content => template("cobbler/modules.conf"),
}
file { "/etc/cobbler/dhcp.template":
??content => template("cobbler/dhcp.template"),
}

其實我們可以再優化下寫法,如下:
File {? ?? ?? ?
ensure => "present",
owner??=> "root",??
group??=> "root",??
mode? ?=> 644,
}
file {??"/etc/cobbler/modules.conf":
??content => template("cobbler/modules.conf"),
? ???"/etc/cobbler/dhcp.template":
content => template("cobbler/dhcp.template"),??
}

?

package資源

1.package資源的屬性

packae {"package name":

??? ensure => {present|absent|latest|version|purged},

??? #present??? 只要存在即可,或installed

??? #absent???? 刪除(無依賴),當別的軟件包依賴時,不可刪除

??? #latest???? 升級到最新版本

??? #version??? 指定安裝具體的某個版本號(yum list),格式:ensure => "版本號",

??? #purged???? 刪除該包,和依賴包(有風險,勿用)

??? name => "package name",???? #應該省略,寫到title部分即可

}

package資源管理系統的軟件包安裝,默認是yum源(/etc/yum.repo.d/)的,通過puppet來自動安裝的軟件包均是通過yum來安裝的,所以需要配置好yum,該資源的主要屬性是ensure;設置該軟件包應該在什么狀態. installed 表示要安裝該軟件,也可以寫成present; absent 表示反安裝該軟件,pureged 表示干凈的移除該軟件,latest 表示安裝軟件包的最新版本.

?

?

ensure => {installed|absent|pureged|latest}

?

installed:title的軟件必須安裝好了

absent:title的軟件是需要卸載的

pureged:title的軟件是需要全部刪除, 深度卸載,刪除所有配置文件和依賴包,有潛在風險,慎用

latest:title的軟件是需要被更新到最新

?

2.package資源的應用

例如:

package{

["vim","iproute","x-window-system"]:

ensure => installed;

["pppoe","pppoe-conf"]:

ensure => absent;

}

安裝vim等包,刪除pppoe,pppoe-conf包。如果你的系統安裝的是編譯的軟件包,建議你

打包成操作系統的包格式,建立你自己的軟件倉庫。

?

package {"screen":

??? ensure => latest,

}

?

Package { ensure => "installed" }?? #設置默認屬性

package { "screen": } package { "strace": } package { "sudo": }

?

請注意,第一個P是大寫,這就是意味著對軟件包管理設置了一個全局的的參數,即如果沒有提供參數,那么默認就是要installed,即安裝

?

service資源

1.service資源的屬性

service {"title":?????????????????????? #title為服務名,mysqld

??? ensure => {running|stopped},??????? #當前service的狀態

??? enable => {true|false},???????? #service是否開機啟動

??? {status|start|stop|restart} => "cmd ",?

#指定命令的路徑,當且僅當,啟動腳本不在/etc/init.d/下的,才需要,一般用于源碼包安裝的,且命令不再/etc/init.d/下的

??? hasrestart => {true|false},????

#重啟service的步驟,true->restart; false->stop,start

??? hasstatus => {true|false},?????

#是從命令行查詢還是從進程表(有沒有該進程)中,查詢service的狀態

}

2.service資源的應用

service {"httpd":

??? ensure => running,

??? start => "/usr/local/apache2/bin/apachectl start",

}

?

service {"httpd":

??? ensure => running,

??? restart => "/usr/local/apache2/bin/apachectl restart",

??? hasrestart => "true",

}

?

exec資源

?

exec {"title":?????????????

#一般寫上要執行的命令,如不寫,則需要指定command

??? cwd => "目錄的絕對路徑",???

#在那個目錄下執行,也可不要

??? path => "/bin:/sbin:...",??

#命令執行的搜索路徑,如不要,則需指定命令的絕對路徑

??? command => "執行的命令",???

#寫上要執行的命令,一般不需要,可在title中寫上

??? creates => "文件名(絕對路徑)",

#當且僅當,該文件名不存在,命令才被執行,可不要

??? user => "用戶名",??????

#定義運行命令的用戶。 注意如果你使用了這個參數,那么任何的錯誤輸出不會在當下被捕捉,這是Ruby的一個bug

??? logoutput => "true|false",?

#是否記錄輸出,可取的值為:true,false和其他合法的日志等級。

??? onlyif => "命令",??????

#如onlyif中命令的執行結果為0(執行正確),才執行title或command中的目錄,與unless相反

??? unless => "命令",??????

#如unless中命令的執行結果不為0(執行出錯),才執行title或command中的目錄,與onlyif相反

}

?

?

puppet執行外部命令,多次反復用這個方式執行命令是有威脅性的,因此建議對執行的命令進行加鎖或者類似的處理.

建議每個exec資源的名字最好是唯一的.

建議屬性值的目錄、命令或文件,最好是絕對路徑

?

puppet exec 參數介紹

?

command:??? command => "執行的命令",

將會被執行的命令,必須為被執行命令的絕對路徑,或者得提供該命令的搜索路徑。如果命令被成功執行,所有的輸出會被記錄在實例的正常(normal)日志里,但是如果命令執行失敗(既返回值與我們所指定的不同),那么所有的輸出會在錯誤(err)日志中被記錄。這個是exec資源類型的名變量(namevar)。

?

creates:??? creates => "文件名(絕對路徑)",

指定命令所生成的文件。如果提供了這個參數,那么命令只會在所指定的文件不存在的情況的被執行

?

cwd:??????? cwd => "目錄的絕對路徑",

指定命令執行的目錄。如果目錄不存在,則命令執行失敗。

?

user??? ??? user => "用戶名",

定義運行命令的用戶。 注意如果你使用了這個參數,那么任何的錯誤輸出不會在當下被捕捉,這是Ruby的一個bug。

If you are using Puppet to create this user, the exec will automatically require the user, as long as it is specified by name

?

onlyif????? onlyif => "命令",

如onlyif中命令的執行結果為0(執行正確),才執行title或command中的目錄,與unless相反。例如:

exec { "logrotate": path => "/usr/bin:/usr/sbin:/bin", onlyif => "test `du /var/log/messages | cut -f1` -gt 100000" }

只有在test返回true的時候logrotate才會被運行。

需要注意的是onlyif定義的命令跟主命令遵循同樣的規則,也就是說如果path沒有被設置的話,需要使用絕對路徑。

除此之外,onlyif還可以接受數組做為其值,例如:

onlyif => ["test -f /tmp/file1", "test -f /tmp/file2"]

上面的代碼限定了只有在所有數組中的條件返回true時exec才會被執行。

?

unless????? unless => "命令",

如unless中命令的執行結果不為0(執行出錯),才執行title或command中的目錄,與onlyif相反。例如:

exec { "/bin/echo root >> /usr/lib/cron/cron.allow":

????????? ? path => "/usr/bin:/usr/sbin:/bin",

????????? ? unless => "grep root /usr/lib/cron/cron.allow 2>/dev/null"

????????? ? }

上面這段代碼先用grep在cron.allow文件(Solaris系統中)中找root,如果沒有找到,就寫入root。

要注意的是這個參數里的命令跟主命令遵循同樣的規則,也就是說如果path沒有被設置的話,需要使用絕對路徑。

?

path??????? path => "/bin:/sbin:...",

命令執行的搜索路徑。如果path沒有被定義,命令需要使用絕對路徑。路徑可以以數組或以冒號分隔的形式來定義。

?

logoutput?? logoutput => "true|false",

是否記錄輸出。默認會根據exec資源的日志等級(loglevel) 來記錄輸出。若定義為on_failure,則僅在命令返回錯誤的時候記錄輸出。可取的值為:true,false和其他合法的日志等級。

?

env:

我們不建議使用這個參數,請使用‘environment’。這一部分還未完成。

?

environment

為命令設定額外的環境變量。要注意的是如果你用這個來設定PATH,那么PATH的屬性會被覆蓋。多個環境變量應該以數組的形式來設定。

?

group

定義運行命令的用戶組。在不同的平臺下的運行的結果無法確定,由于不同用戶運行命令的時候,變量是不變的,所以這是平臺的問題,而不是Ruby或Puppet的問題。

?

refresh

定義如何更新命令。當exec收到一個來自其他資源的事件時,默認只會重新執行一次命令。不過這個參數允許你定義更新時執行不同的命令。

?

refreshonly

該屬性可以使命令變成僅刷新觸發的,也就是說只有在一個依賴的對象被改變時,命令才會被執行。僅當命令與其他對象有依賴關系時,這個參數才有意義。當你要觸發某個行為時,會顯得很有用:

# Pull down the main aliases file file { "/etc/aliases": source => "puppet://server/module/aliases" } # Rebuild the database, but only when the file changes exec { newaliases: path => ["/usr/bin", "/usr/sbin"], subscribe => File["/etc/aliases"], refreshonly => true }

要注意的是只有subscribe和notify可以促發行為,而不是require,所以在使用refreshonly時,只有同時使用subscribe或notify才有意義。有效的值為true, false。

?

returns

指定返回的代碼。如果被執行的命令返回了其他的代碼,一個錯誤(error)會被返回。默認值是0,可以定義為一個由可以接受的返回代碼組成的數組或單值。

?

timeout???? timeout => "秒數",

命令運行的最長時間。如果命令運行的時間超過了timeout定義的時間,那么這個命令就會被終止,并作為運行失敗處理。當定義為負值時就會取消運行時間的限制。timeout的值是以秒為單位的。

?

?

?

exec資源在不到萬不得已的時候不要去用,簡單說來exec資源就是在執行puppet的時

候,調用shell執行一條shell語句,例如:

exec {"delete config":

path => "/bin:/usr/bin",

command => "rm /etc/ssh/ssh_config";

}

exec可以用path指定命令執行的預搜索路徑,create屬性表明該exec將創建一個文件,當下一次puppet執行的時候,如果發現了這個文件,就不再執行這個exec資源

exec資源是不太好掌控的資源,如果能用腳本實現,盡量寫成腳本通過file資源分發到服務器上面。然后用其他的方式來調用腳本。例如crontab。說來crontab資源,羅嗦一句,雖然puppet提供了crontab資源,但是你完全可以用file資源來把crontab任務放到/etc/cron.d目錄下來實現crontab資源的管理。使用puppet的時候,盡量用最簡單的語法,越是花哨的語法也越容易出錯。

?

cron資源

?

1.cron資源的屬性

minute hour month monthday weekday command

?

cron {"title":

??? ensure => {present|absent},

#決定該計劃任務的目標狀態,present 如該cron不存在,則添加之;absent 如該cron已存在,則刪除之

??? command => "命令",????? #欲執行的命令或腳本路徑,也可不寫,默認是title

??? user => "用戶",???????? #執行該cron的用戶身份

??? minute => "值",???????? #同crontab,不寫,代表*

??? hour => "值",??????????

??? month => "值",

??? monthday => "值",

??? weekday => "值",

}

除了用戶和command兩個參數以外,其他的參數都是可選項.

ensure ???? ensure => {present|absent},

決定該計劃任務的目標狀態,

present 如該cron不存在,則添加;

absent 如該cron已存在,則刪除之

?

command ??? command => "命令",?????

欲執行的命令或腳本路徑,也可不寫,默認是title

?

user??? ??? user => "用戶",????????

把該crontab加到那個用戶的crontab列表,默認是運行puppet的用戶

?

minute? ??? minute => "值", ???????

運行crontab的分鐘,可設置成0-59,同crontab,不寫,代表*

?

hour??? ??? hour => "值",??????????

??????????? 運行crontab的小時,可設置成0-23

?

monthday??? monthday => "值",

??????????? 一個月份中的日子,1-31

?

month?? ??? month => "值",

??????????? 設置crontab運行的月份,1-12

?

weekda? ??? weekday => "值",

??????????? 運行crontab的星期數,0-7,周日是為07.

?

2.cron資源的應用

cron {"logrotate":

command => “/usr/sbin/logrotate”,

user => root,

hour => 2,

minute => 0

}

上述例子執行的結果就是在crontab中增加了一行:

crontab –e –u root

0 2 * * * /usr/sbin/logrotate

?

user資源

1.user資源的屬性

?

user {"title":????????????? #用戶名,同name一樣

??? name => "用戶名",?????? #用戶名,可以不寫,默認與title一樣

??? ensure => {present|absent},

??? #指定用戶的目標狀態present 該用戶不存在則生成;absent 該用戶存在則刪除

??? uid => "值",???????????

??? gid => "值",

??? groups => "組名",?????? #groups該用戶所屬用戶組名,可為列表

??? home => "絕對路徑",????

#該用戶分配的家目錄,如沒有managehome => true, 則不會創建家目錄

??? managehome => {true|false},

#是否自動生成家目錄,默認為false,表示,即使指定home,也不會創建;true表示創建home的目錄

??? shell => "shell的絕對路徑", ??? #用戶登錄后默認分配的shell

??? password => '密鑰',????

#指定用戶的結過MD5加密碼后的密碼(grub-md5-crypt)。最好以‘’引起來,記著,用單引號,因為經過MD5加密后可能會出$符號。

}

?

name??????? name => "用戶名",??????

指定創建的用戶名,可以不寫,默認與title一樣

?

ensure? ??? ensure => {present|absent},

指定用戶的目標狀態。

present 該用戶不存在則生成;

absent 該用戶存在則刪除

uid???? ??? uid => "值",

??????????? 用戶的uid

?

gid???? ??? gid => "值",

??????????? 用戶的gid

?

groups? ??? groups => "組名",??????

groups該用戶所屬用戶組名,可為列表

?

home??? ??? home => "絕對路徑",????

該用戶分配的家目錄,如沒有managehome => true, 則不會創建家目錄

?

managehome? managehome => {true|false},

是否自動生成家目錄,默認為false,表示,即使指定home,也不會創建;true表示創建home的目錄

???

shell?????? shell => "shell的絕對路徑",

用戶登錄后默認分配的shell

password??? password => '密鑰',

指定用戶的結過MD5加密碼后的密碼(grub-md5-crypt)。最好以‘’引起來,記著,用單引號,因為經過MD5加密后可能會出$符號。

?

2.user資源的應用

?

①.我要創建一個名為test的用戶.

代碼示例

user { "test":

uid => 2000,

gid => 2000,

home => "/home/test",

shell => "/bin/bash";

}

?

注意:puppet在創建用戶的時候,并不會創建用戶的home目錄

?

②.比如test用戶離職了,需要刪除test用戶。

?

代碼示例:

user { "test":

ensure => "absent",

}

?

③. 創建test用戶并管理用戶目錄

?

代碼示例

user { "test":

ensure => "present",

managehome => true,

?}

?

④.創建test用戶,且讓test用戶是屬于sa組。

?

代碼示例

?

user { "test":

ensure => "present",

managehome => true,

groups => sa,

?}

?

注意,用戶所屬的SA組要先創建

?

關于如何創建組,在接下來的會為大家講,這里給舉個例子.

?

代碼示例:

group { "sa":

ensure => "present",

gid => 3000,

}

?

user { ???? "test": ???? ensure?? => present, ???? shell =>"/bin/bash", ???? home? => "/home/test", ???? managehome => true, ???? comment =>"www.mysqlops.com test by sky add? test", ???? password => '$1$Nnh0M0$t9s7Bbwx2fFer6IP/QGdA0', ?????? } 使用grub-md5-crypt生成密碼

?

總結:用戶和密碼跟系統管理員關系密切,管理用戶的切不可馬虎。方便快捷,實用的管理才是王道,今天運維自動化管理

?

<二>引用資源

當我們引用一個資源時,需要大寫資源類型的首字母,例如File[sshdconfig]。當看到一個大寫的資源類型,需要明白那實際上就是一個資源引用小寫字母是用來定義的。資源只能定義一次,重復定義相同的資源會導致錯誤。

?

1.資源的引用:

??? 基本格式:????????? Type ["title",…, "title"]

注:Type:表示資源的類型,且第一個字母必須大寫

??? title:表示該資源的title,多個title,可用逗號分隔,必須存在

常用于require => Type ["title",…, "title"]

表示require之后的引用,必須先存在或正確執行

?

2.例子

file { 'sshdconfig': ??? path => $operatingsystem ? { ??????? solaris => '/usr/local/etc/ssh/sshd_config', ??????? default => '/etc/ssh/sshd_config', ??? }, ??? owner => 'root', ??? group => 'root', ??? mode? => '0644', } service { 'sshd': ??? subscribe => File['sshdconfig'], }

?

<五>資源默認值

為某類資源指定一個默認的參數。使用沒有標題大寫資源首字母方式。

格式:???? Type { 屬性 => 值,…, 屬性 => 值}

注:Type:表示資源的類型,且第一個字母必須大寫,不需要title

例如,為所有的執行命令設置默認的path參數:

Exec { path => '/usr/bin:/bin:/usr/sbin:/sbin' } exec { 'echo this works': }

第一行代碼為exec資源提供一個默認的path參數。exec資源需要一個完整的限定路徑或者能夠通過path參數找到具體的可執行文件。資源定 義時若有必要可以覆蓋path的默認設置。這種情況下我們可以為所有的配置指定一個默認path參數,特殊情況時覆蓋它就可以了。

Puppet默認值支持所有的資源類型。

默認值不是全局的 - 它只在當前范圍和當前范圍下面有效。如果你想為所有的配置設置默認值,唯一選擇是在任意類的外面定義它們。

?

<六>資源之間相互關系

?

①puppet 資源之間簡單依賴關系

puppet 資源之間簡單依賴關系,主要是有下面的三個參數。

before:在某個資源之前執行

?

after: 在某個資源之后執行

?

require: 某個資源必須存在或者正確執行后,才執行相應的資源。常用

?

為了便于理解,下面就給大家看個代碼示例:

代碼示例:

? file {"/etc/ssh/sshd_config":

??????? .....

??? require => Package["openssh-server"],?? #引用package {"openssh-server": …}

?? }

package { “openssh-server”:

……

before => File["/etc/ssh/sshd_config"]

}

?

上面例 子我們可以知道:/etc/ssh/sshd_config必須在openssh-server這個軟件包安裝后,才會生成。

after和before相反,就不舉例說明了。那大家會有個問題,那/etc/ssh/sshd_config有改動的時候,那要怎么辦呢,接下來就為大家介紹,puppet資源之間觸發更新動作。

?

class admin::ntp {

???? package { "ntp":

???????? ensure => installed,

???????? require => File["/etc/ntp.conf"],

???? }

??? ?service { "ntp":

???????? ensure? => running,

???????? require => Package["ntp"],

???? }

???? file { "/etc/ntp.conf":

???????? source? => "puppet:///modules/admin/ntp.conf",

???????? notify? => Service["ntp"],

???????? require => Package["ntp"],

???? }

?}

Package["ntp"] -> File["/etc/ntp.conf"] ~> Service["ntp"]

?

?

②puppet 資源之間觸發更新

puppet資源之間觸發更新主要是由下面二個參數。在執行Services,Exec資源中非常有用。

notify:用來通知某個資源進行更新

?

subscribe:該資源有更新時,通知另一個資源執行相應的動作

?

其實這兩個效果參數效果是一樣的。接下來看下代碼示例,更好的理解上面的兩個參數。

?

?file {"/etc/ssh/sshd_config":

?????? .....

?????? notify => Service[sshd],

????? }

? service {"sshd":

?????????? ......

?????????? subscribe => File["/etc/ssh/sshd_config"],

????? }

上面的例子,我們可以看到,當/etc/ssh/sshd_config文件發生更新時,就會通知sshd服務,進行reload.

?

大家可以接合上面的兩個例子來看,可以看到整個流程是這樣的,sshd服務運行,需要/etc/ssh/sshd_config配置文件,而/etc/ssh/sshd_config是要由openssh-server軟件包安裝來生成。

?

?

?

?

?

<七>類(class)

類可以把多個相關的資源定義在一起,組成一個類,一起使用,例如把sshd和他的配置文件做成一個ssh類,其他的地方要用到就直接包含ssh類就可以了,方便寫出更簡潔的代

碼,便于維護。類可以繼承。少用

??? class 是一個資源的集合,它代表節點上一個單獨的配置項目,SSH服務或者NFS包,class在一個結點上僅僅形成1(即在相同的系統上僅能使用一次),因為已經完成的配置應該僅僅存在一次

?

1.定義類

類定義以class關鍵字開始,內容放在花括號里面

class 類名 {

??? type { "title ":

    ?? attribute => "value",

?????? ...

?????? attribute => "value",

  ?? }

??? ...(各種資源)

??? type { "title ":

    ?? attribute => "value",

?????? ...

?????? attribute => "value",

  ?? }

}

2. 繼承

類也有用基類(父類)子類來實現簡單的繼承和覆蓋的模型,一個子類可以繼承基類的值并且能夠實現它一個或者多個值對基類的值進行覆蓋.

?????? 子類的作用完成某個任務,基本同父類的作用,但只是某些參數的不同

?

class 類名(新建)inherits 父類名(已存在){

?????? Type ["title"] {attribute => "value",}

}

注:Type:表示資源的類型,且第一個字母必須大寫且必須存在于父類中

{attribute => "value",}:表示修改父類的某些屬性的值

{attribute => "value",…, attribute => "value",}??? 表示修改父類的某些屬性的值

②{attribute => undef,…,attribute => undef,}??????? 表示取消父類的某個屬性的值

③{attribute +> "value"}

{[attribute +> "value",…, attribute +> "value",]} 表示增加父類沒有的某些屬性的值或者中概括([])中的數組值

?

3. 禁用資源

為繼承和覆蓋最常見的用法是禁止服務或者其它資源:

class apache::disabled inherits apache { Service["apache2"] { enable => false, ensure => stopped, } }

?

?

4.實例

class unix {

??? file { "/etc/password":

???????? owner => "root",

???????? group => "root",

???????? mode? => 644;

??? }

??? file { "/etc/shadow":

? ???????owner => "root",

???????? group => "root",

???????? mode? => 440;

??? }

}

class freebsd inherits unix {

??? File["/etc/passwd"] { group => undef }

}

在上面的例子中,包含類unix的節點的password文件的組名將被設置為“wheel”,而包含類freebsd的節點的password文件的組名則不會被設置(既保持原來的值,不去修改)。

?

你可以同時覆蓋多個值,比如:

class freebsd inherits unix {

??? File["/etc/passwd","/etc/shadow"] { group => wheel }

}

?

可以使用操作符‘+>’(‘再賦值’)來追加資源的參數:

?

class apache {

??? service { "apache": require => Package["httpd"] }

}

?

class apache-ssl inherits apache {

??? # host certificate is required for SSL to function

??? Service[apache] { require +> File["apache.pem"] }

}

?

上面的例子中使第二個類依賴了所有第一個類所依賴的包,同時增加對包'apache.pem'的依賴。

?

當追加多個依賴時,使用中括號和逗號:

?

class apache {

??? service { "apache": require => Package["httpd"] }

}

?

class apache-ssl inherits apache {

??? Service[apache] { require +> [ File["apache.pem"], File["/etc/httpd/conf/httpd.conf"] ] }

}

?

?

class myclass {

class nested {

??? file { "/etc/passwd":

??? owner => "root",

??? group => "root",

??? mode? => 644;

??? }

}

}

?

class anotherclass {

include myclass::nested

}

?

在這個例子中,在外層類中的嵌套類可以通過在名為anotherclass的類中以myclass::nested包括進來。在這里順序很重要,如果要讓這個例子正確的運行的話,myclass類一定要在anotherclass類被求值之前被求值。

?

<>函數(定義)

定義使用和類相同的基本形式,不同的是它們使用關鍵字define(而不是class),并且定義支持參數不支持繼承。就像之前所提到的,定義可以接收參數并在相同的系統上多次重用

注:使用define最好在定義時,使用變量,負責就可以使用class

?

1.無變量

define 函數名() {

?????? type { "title ":

    ?????? attribute => "value",

????????????? ...

????????????? attribute => "value",

  ?????? }

?????? ...(各種資源)

?????? type { "title ":

    ?????? attribute => "value",

????????????? ...

????????????? attribute => "value",

  ?????? }

}

?

②有變量

define 函數名(變量名1,...,變量名n) {???????????? #格式:$var

?????? type { "title ":

    ?????? attribute => "變量名",????????? #格式:${var},下同

????????????? ...

????????????? attribute => "變量名",

  ?????? }

?????? ...(各種資源)

?????? type { "title ":

    ?????? attribute => "變量名",

????????????? ...

????????????? attribute => "變量名",

  ?????? }

}

?

③在class中定義define

class 類名 {

define 函數名 (變量名1,...,變量名n) {

?????? type { "title ":

    ?????? attribute => "變量名",????????? #格式:${var},下同

????????????? ...

????????????? attribute => "變量名",

  ?????? }

?????? ...(各種資源)

?????? type { "title ":

    ?????? attribute => "變量名",

????????????? ...

????????????? attribute => "變量名",

  ?????? }

}

}

?

?

2.引用define

①一般情況(無class

函數名 {

?????? 變量名 => "",

?????? ...

?????? 變量名 => "",

}

?

class

類名::函數名 {

?????? 變量名 => "",

?????? ...

?????? 變量名 => "",

}

?

3.實例

定義了一個definition 用來執行一個腳本去配置一個新的主機.

define newip ( $ip ) {
exec { "/sbin/ifconfig" $title $ip ":
}
}

#引用

newip { eth0:
ip => "11.11.11.11"
}
#

newip(11.11.11.11) {"eth0":

}

?

我們創建了一個definition叫做newip并且有一個參數叫做$ip,內部定義了我們用來執行資源類型內部二進制代碼,這里是ifconfig 命令,我們已經指出變量$ip和使用的另一個變量$title$name

?

②同上,不過使用了類class

class virtuals {

define newip ( $ip ) {

exec { "/sbin/ifconfig $title $ip":

}

}

}

?

virtuals::newip { eth0:

ip => "11.11.11.11",

}

?

?

③聲明多個參數列表,逗號分割:

?

define webapp( $domain, $path, $platform ) {

??? ...

}

webapp { "mywizzoapp":

????????? domain?? => "mywizzoapp.com",

????????? path???? => "/var/www/apps/mywizzoapp",

????????? platform => "Rails",

}

?

④創建了一個函數(define),并只添加了一個參數,參數又

是實例的名字.但是,我們也可以添加任何我們想要的參數,因此我們只要在函數

中進行聲明.??

define tmpfile( $greeting ) {

file { "/tmp/$name":

content => $greeting,

}

}

?

在聲明實例資源的時候,并傳遞相應的變量值.?

tmpfile{ "foo": greeting => "Hello, world" }

?

⑤為每一個參數指定一個默認的值
define config_file(owner = root, group = root, mode = 0644,
source, backup = false, recurse = false, ensure = file ) {
file{ $name:
mode => $mode,
owner => $owner,
group => $group,
backup => $backup,
recurse => $recurse,
ensure => $ensure,
source => "puppet:///$source"
}
}

config_file { "/etc/vnc.conf":
source => "vnc/vnc.conf",
mode => "0640"
}

我們創建了config_file定義, 然后對其應用,這跟函數調用差不多

?

?

4. VS 定義

類和定義的創建過程都很相似(雖然類不接收參數),不過他們使用起來非常不同。

定義是用來定義在一個主機上包含多個實例的可重用對象的,所以定義不能包含任何只能有一個實例的資源。比如,多次使用同一個定義不能創建相同的文件。

另一方面,類是獨一無二的——無論你包含它們多少次,你只會得到資源的一個副本。

大多數時候,服務會被定義成,服務的包,配置文件以及正在運行的服務都會被定義在類中,因為通常在每一個主機上它們都只有一個副本。(這些有時被慣稱為服務————文件)。

定義是被用來管理類似虛擬主機這樣可以有許多的資源,或者使用一個可重用的封裝來包裝一些簡單的信息,以此來減少代碼量。

?

?

<>模塊

?

如果是你配置的應用,守護進程,或函數包含很多類、文件或模板。最簡單的方法就是將這些資源放到一個包里面,Modules使管理配置文件的集合更簡單和更結構化

?

使用模塊的步驟:

1.創建必要的模塊目錄及文件

?????? mkdir -p /etc/puppet/modules/模塊名/{manifests,files,templates}

?????? touch /etc/puppet/modules/模塊名/manifests/init.pp

?

2.init.pp中導入別的pp文件(也可直接在init.pp中寫上puppet的語法)

?????? vi /etc/puppet/modules/模塊名/manifests/init.pp

????????????? import "*"?? ????????????????????????????????????????????????? #相當于node … { import模塊名}

?

3.寫上puppet的語法,完成某些功能,最好是單獨寫,利于管理

?????? vi 模塊名.pp?

?

4.根據“模塊名.pp”的內容,考慮是否需要在files目錄下創建,所需的文件。

?

5.定義一個節點,并使用新的模塊(/etc/puppet/modules/模塊名

?????? vi /etc/puppet/manifests/site.pp

????????????? node 節點名 {

???????????????????? include 模塊名

????????????? }

?

注:

?????? /etc/puppet/modules/模塊名/manifests? :存放該模塊的所有配置文件,格式:文件名.pp

?????? /etc/puppet/modules/模塊名/files???????? :存放該模塊中所需要的文件

?????? /etc/puppet/modules/模塊名/templates? :存放模板文件的目錄,文件格式:文件名.erb

/etc/puppet/modules/模塊名/manifests/init.pp????? init.pp文件是該模塊的初始文件,導入一個模塊的時候,會init.pp開始執行。可以把所有的代碼都寫到init.pp里面,也可以分成多個pp文件,init再去包含其他文件(import "*.pp"

?

Modules組織起來很簡單。他們存儲在一個指明的文件夾下,modulepath的配置在puppet.conf中指出,默認在$confdir/modules /usr/share/puppet/modules目錄,我們可以指出多個module路徑用冒號隔開,如:
modulepath = /etc/uppet/modules:/usr/share/puppet/modules

?

引入的時候使用
import "mysql"
Puppet是如何知道加載什么資源的呢,一個module被用一個文件夾去進行組織的,調用一個init.pp的文件進行初始化,每一個module至少應該有下面的這些目錄結構
module_path/

module_name/

module_name/manifests/
module_name/manifests/init.pp
當引入一個moduleinit.pp文件是自動處理的,init.pp應該被放到默認的module
/etc/puppet/modules/mysql/manifests/init.pp
這個init.pp有兩重的功能,它包含了一個核心的classes被用做提供一個引入類和定義的位置,它應該被放到manifests文件夾下面,下面是一個init.pp文件的例子
class mysql {
package { "mysql-server":
...
}
service { "mysqld":
...
}
}
我們聲明了一個叫做mysqlclass在這里我們配置了packageservice的資源,所以當我們引入一個module的時候,比如是 mysql modulePuppet將在所以的包含mysql的路徑中進行查找,它將查出來的manifests文件夾下的init.pp文件并且加載它的內容.

Puppet 也允許一些聰明的命名方法使使用模塊更加容易,創建一個mysql名空間,使用這個名空間,比如,mysql module創建了一個名空間叫做mysql,使用這個名空間,我們能夠很容易的在我們的模塊定義和引用其他的class,比如我們要在mysql module里面添加一個叫做serverclass,為了做到這樣,我們需要定義一個叫做mysql::server的類并且存儲在一個叫做 server.pp的文件中,我們使用這個模塊只需要簡單地這樣寫:
include mysql::server
Puppet會認出它的名空間并且會在正確的模塊和文件中去加載這個類名空間的魔法功能也可以擴展到模板和文件,為了充分利用這個特性,我們在root模塊下創建了兩個附加的目錄,叫做templatesfiles,這些目錄應該包含這個模塊下的任意templates和任意文件,這樣你的模板就能夠通過指定模塊名和模板的名字被引用了
template("mysql/my.cnf.erb")
Puppet將會自動的在正確的模塊路徑下去加載需要的模板。
在你模塊包含的文件能夠使用Puppet的文件服務的功能,每一個模塊自動創建它自己的文件服務模塊,并且加載任意模塊文件路徑下的存儲的文件,比如在你的mysql模塊,文件能使用source屬性被使用
source => "puppet://puppetmaster/mysql/my.cnf"
這將會到mysql模塊下的文件目錄下去找my.cnf,在你的fileserver.conf中,那要定義一個特殊的文件模塊叫做modules,這個允許你去進行訪問控制,定義這個文件模塊沒用path語句,限制文件訪問在所有的模塊中。

?

最重要的一件事可以去做,那就是把puppet 代碼組織成模塊,以更易于維護并使puppet的代碼結構更加清晰。一個模塊可以是一個簡單的分組相關的東西:例如:web服務器模塊可以包括一個web服務器必需要的一切:Apache的配置文件,虛擬主機模板,和必要的puppet代碼去部署這些。

分離成模塊,使得代碼更容易重新使用和共享代碼,也是最合乎邏輯的方式組織代碼。在這個例子中,我們將創建一個模塊用來管理memcached.memcache是一個內存緩存系統與web應用程序常用在一起。

1.明確你的模塊路徑模塊路徑是在puppet.conf里設置,默認值是/etc/puppet/modules.如果你的代碼已經使用的版本控制系統,像之前我建議你的方式去做,然后使用你的工作副本目錄用來部署到/etc/puppet/moudules/,并替代原目錄。

memcached實例

?

# puppet --genconfig |grep modulepath

modulepath = /etc/puppet/modules:/usr/share/puppet/modules

# cd /etc/puppet/modules

2. 創建memcached目錄:

# mkdir memcached

3. memcached目錄下創manifestsfiles兩個目錄:

# cd memcached

# mkdir manifests files

4. manifests目錄,創建init.pp文件,init.pp文件內容如下:

vi manifests/init.pp

import "*"

5. manifests目錄,創建另外一個文件名稱為memcached.pp,其內容如下:

class memcached {

package { "memcached":

ensure => installed,

}

file { "/etc/memcached.conf":

source => "puppet:///modules/memcached/memcached.conf",

}

service { "memcached":

ensure => running,

enable => true,

require => [ Package["memcached"],

File["/etc/memcached.conf"] ],

}

}

6. 切換到files目錄,創建memcached.conf文件,其內容如下:

-m 64

p 11211

-u nobody

-l 127.0.0.1

7. 定義一個節點,并使用新的模塊(/etc/puppet/modules/memcached)

node cookbook {

include memcached

}

8.運行puppet 測試新的配置

# puppet agent --test

info: Retrieving plugin

info: Caching catalog for cookbook.bitfieldconsulting.com

info: Applying configuration version '1300361964'

notice: /Stage[main]/Memcached/Package[memcached]/ensure: ensure

changed 'purged' to 'present'

...

info: /Stage[main]/Memcached/File[/etc/memcached.conf]:

Filebucketed /etc/memcached.conf to puppet with sum a977521922a151

c959ac953712840803

notice: /Stage[main]/Memcached/File[/etc/memcached.conf]/content:

content changed '{md5}a977521922a151c959ac953712840803' to '{md5}f

5c0bb01a24a5b3b86926c7b067ea6ba'

notice: Finished catalog run in 20.68 seconds

# service memcached status

* memcached is running

?

puppet 會自動尋找并自動加載init.pp這個文件,這是模塊在所有導入的類的時候必須的

在我們的例子:

import "*"

memcache類是定義在memcached.pp這個文件里,這將是由 init.pp加載。現在的話,我們在結點上執行類:

include memcached

memached類中,我們提到了memcached.conf文件:

file { "/etc/memcached.conf":

source => "puppet:///modules/memcached/memcached.conf",

}

正如我們在puppet的文件服務器中自定義掛載點里所看到的片斷。 上面的source參數告訴puppet所要尋找的源文件路徑。

MODULEPATH/

memcached/files/memcached.conf

?

學習著去熱愛模塊,因為他們讓你管理puppet的生活會輕松許多,模塊并不復雜。然而,實踐和經驗會幫助我們判斷何時應該組織劃分為模塊,以及如何更好的安排你的模塊結構,這里有一些幫助你正確上路的技巧。

?

?

模板

模板作為模塊的一部分,如果你需要使用模板,可以把模板放到MODULE_NAME/templates目錄下,用法可以參考這樣:

file { "/etc/memcached.conf":

content => template("memcached/memcached.conf"),

}

puppet 會在下面路徑尋找文件:

MODULEPATH/memcached/templates/memcached.conf

Facts,functions(函數)types(類型)providers

模塊可以包含自定義的Facts,自定義函數,和自定義類型以及providers.如需有關這些的詳細信息,請參閱外部工具和puppet的生態系統(ecosystem)

?

使用標準的命名約定

給模塊和類取個合適且簡單明了的名稱是非常有用的,尤其是別人要維護你的代碼的時候,或者有其他人需要閱讀并使用你的代碼工作的時候.

1. puppet模塊名以他們所管理的軟件或者服務名:例如:apache或者haproxy

2. 以模塊的功能或者所提供的服務來命名類名,例如:apache::vhost或者rails::dependencies.

譯者說明 apache就是所提供的服務,vhost是功能,中間以::分格.

3.如果模塊內提供禁止提供某服務 ,就可以命名為disabled.例如:一個用于停止apache的類應該被命令為

apache::disabled.

譯者說明:比如iptables服務,有時需要開啟,或者需要關閉,那么就分成兩個類, iptables::disablediptables::enable.

4. 如果一個節點需要提供多種服務,請在節點定義定義后為每個服務執行所需要的類,或者導入模塊.

node server014 inherits server {

include puppet::server

include mail::server

include repo::gem

include repo::apt

include zabbix

}

5.管理用戶的模塊應該命名為user.

6.在用戶模塊里,聲明你的虛擬用戶類名為user::virtual

7.在用戶模塊里,為特定的用戶群體可以設置為子類,子類應該被命名為用戶組.舉例,

user::sysadmins或者user::contractors.

8.如果你需要覆蓋特定節點上的一個類或者服務,可以使用繼承,繼承類的話前綴是子類的

名稱.舉例,如果一個節點名稱為cartman 需要特定的ssh配置,你想覆蓋ssh,可以這樣做:

class cartman_ssh inherits ssh {

[ override config here ]

}

9.當你需要運行puppet為不同的服務布署配置文件時,完整的配置文件名以服務開頭,使用點為分隔符,

后面為文件功能.舉例:

Apache的初始化腳本:apache.init

Railssnippet的定時處理日志配置文件:rails.logrotate

mywizzoappNginx的虛擬主機配置文件:mywizzoapp.vhost.nginx

standalone 服務的mysql配置文件:standalone.mysql

?

<十一>模板

?

puppet管理的時候,我們會根據業務進行劃分,將其分為如webdbmemcache,為了方便統一管理,這個時候,在puppet實戰中我們就可以使用模板,比如上面,有web類型,db類型的,memcache類型的,新業務上線的時候,這時候運維自動化,運用puppet就非常有意義,我們使用pupet模板,可以節約我們很多時間和精力,又大大地減少犯錯的幾率的。接下來就為大家介紹,puppet管理中什么是模板,如何使用模板,運用模板,這些都是實際生產中積累。

?

1.puppet進階之ERB基礎

?????? puppet管理中,puppet通過erb(embedded Ruby)支持模板,模板是為資源設置統一的格式,puppet 模板主要是用于文本文件,且模板的文件名必須erb結尾,例如nginx配置文件等.

. puppet管理中如何在模板中使用變量?

:使用這種格式<%= name %>, 變量name必須先定義.

?

. puppet管理默認模板是路徑是?

答:默認是/var/lib/puppet/templates.

?

. puppet管理中如何查找當前模板路徑

答:可以使用如下命令:puppet configprint templatedir

?

. puppet實戰中puppet模板是如何存放?

答:一般都是放在模塊名下的templates目錄下。例 如模塊名nginx,那么模板一般會放在nginx/templates下。

?

puppet 管理apache的虛擬主機模板創建實例

1. 創建模塊名,以及templates,files目錄。

?

mkdir -p /etc/puppet/modules/apache/{manifests,templates,files}

?

2. 創建/etc/puppet/modules/apache/manifests/init.pp內容為import *.

?

echo 'import "*" '> /etc/puppet/modules/apache/manifests/init.pp

?

3. 創建/etc/puppet/modules/apache/manifests/apache.pp,類名為apache

?

class apache {

????? package { "http":

???????????????? ensure => present,

????? }

????? services { "http":

????????????????? ......

????????????????? require => Package["http"],

????? }

????? define apache_conf ($sitedomain) {

???????????? file { "httpd_conf":

???????????????????? ......

???????????????????? content => template("apache/httpd.conf.erb"),

???????????????????? require => package["httpd"],

???????????? }

????? }

}

?

5. 創建/etc/puppet/modules/apache/templates/httpd.conf.erb

?

1)復制一個標準的httpd.conf為模板。

?

cp httpd.conf /etc/puppet/modules/apache/templates/httpd.conf.erb

?

2)根所實際情況修改/etc/puppet/modules/apache/templates/httpd.conf.erb

以下是貼出部分以供示例:

?

<VirtualHost *:80>

ServerName <%= sitedomain %>

ServerAdmin admin@<%= sitedomain %>

DocumentRoot /var/www/<%= sitedomain %>

ErrorLog logs/<%= sitedomain %>-error_log

CustomLog logs/<%= sitedomain %>-access_log common

</VirtualHost>

?

6. 檢查模板是否有錯誤

?

erb -x -T '-' /etc/puppet/modules/apache/templates/httpd.conf.erb | ruby -c

?

7. 測試,使用一個node ,名為 c2.inanu.net 進行測試

?

node 'c2.inanu.net' {

????? import? "apache"???????????? #可省略,在init.pp中,已有import *

????? include "apache"

????? apache::apache_conf { "inanu":

???????????????????????????? sitedomain => "inanu.net",

????????????????????????? }

}

?

8. 在客戶端運行puppet test server puppetmaster

?

puppet --test --server c1.inanu.net

?

注意第 7 步中 apache::apache_conf,我在虛擬機里測試的時候,需要添加的類名,但在實際生產中不需要添加,可能是版本差異,另外下面幾點需要注意下:

1. puppet 模板中,也可以使用數組,這時常用的循環遍歷。

?

示例:

?

$values = [val1, val2, otherval]

<% values.each do |val| -%>

Some stuff with <%= val %>

<% end -%>

?

2. puppet模板中也可以使用條件語句

?

示例:

?

<% if broadcast != "NONE" %> broadcast <%= broadcast %> <% end %>

?

3. 模板也可以作為變量

?

示例:

$template = 'apache/vhost.erb'

4. 測試變量是否定義

?

示例

?

<% if has_variable?("myvar") then %>

??? myvar has <%= myvar %> value

<% end %>

?

5. 變量的作用域

?

<%= scope.lookupvar('apache::user') %>

?

puppet 管理使用模板總結

puppet 管理過程中會遇到各種問題,而puppet 模板是方便,快捷,容易處理,這樣,我們在puppet 運維自動化過程充分利用puppet 模板減少出錯的機會的,puppet模板上面介紹的比較少,在寫的過程中可以使用ERB測試別忘記,要按照puppet指南規范代碼。更多可以參閱官方:http://docs.puppetlabs.com/guides/templating.html

?

?

?

?

<十二>節點

?

node(節點)的作用:區分不同的客戶端,并且給不同的服務端分配manifest。

?

1. 習慣:

實際生成中,不建議直接在site.pp定義node,因為當node過多的時候,不利于閱讀和理解,建議創建一個名叫nodes.pp專門用來存放node信息的

??? vi /etc/puppet/manifests/site.pp

import "nodes.pp"

#建立節點文件

touch /etc/puppet/manifests/nodes.pp

?

?

2.節點的定義

①默認節點的定義:表示沒有定義的節點都是使用default。default的作用可以在多臺nodes(節點) 需要執行相同的操作的時候,省去多次書寫node(節點名稱),帶來方便。

?

node default {

??? 變量的聲明????????? ??? #聲明格式:$變量名="值" 引用格式: ${變量名}

??? include 類名,...,類名?????? #已定義好的類class

}

?

②客戶端節點的定義:

?

node '客戶端的主機名' {

??? 變量的聲明????????? ??????? #聲明格式:$變量名="值" 引用格式: ${變量名}

??? include 類名,...,類名?????? #已定義好的類class

}

?

?

3.節點的繼承(不講,同類的繼承inherits

?

4.實例;

node 'test01.test.com' {

?????????? file { "/tmp/temp1.txt" :

????????????????? content => "hello world.

????????????????? died, java."

???????????????? }

?}

?

<十三>使vim支持puppet的pp文件的語法

?

1.在用戶根目錄創建目錄

??? mkdir -p ~/.vim/{syntax,ftdetect}

?

2.創建puppet.vim文件

??? vim ~/.vim/syntax/puppet.vim

??????? " puppet syntax file

??????? " Filename: puppet.vim

??????? " Language: puppet configuration file

??????? " Copied from the cfengine, ruby, and perl syntax files

??????? " For version 5.x: Clear all syntax items

??????? " For version 6.x: Quit when a syntax file was already loaded

?

??????? if version < 600

??????? syntax clear

??????? elseif exists("b:current_syntax")

??????? finish

??????? endif

?

??????? syn region puppetDefine start="^\s*\(class\|define\|site\|node\)" end="{" contains=puppetDefType,puppetDefName,puppetDefArguments

??????? syn keyword puppetDefType class define site node inherits contained

??????? syn keyword puppetInherits inherits contained

??????? syn region puppetDefArguments start="(" end=")" contains=puppetArgument

??????? syn match puppetArgument "\w\+" contained

??????? syn match puppetArgument "\$\w\+" contained

??????? syn match puppetArgument "'[^']+'" contained

??????? syn match puppetArgument '"[^"]+"' contained

??????? syn match puppetDefName "\w\+" contained

?

??????? syn match puppetInstance "\w\+\s*{" contains=puppetTypeBrace,puppetTypeName,puppetTypeDefault

??????? syn match puppetTypeBrace "{" contained

??????? syn match puppetTypeName "[a-z]\w*" contained

??????? syn match puppetTypeDefault "[A-Z]\w*" contained

?

??????? syn match puppetParam "\w\+\s*=>" contains=puppetTypeRArrow,puppetParamName

??????? syn match puppetParamRArrow "=>" contained

??????? syn match puppetParamName "\w\+" contained

??????? syn match puppetVariable "$\w\+"

??????? syn match puppetVariable "${\w\+}"

??????? syn match puppetParen "("

??????? syn match puppetParen ")"

??????? syn match puppetBrace "{"

??????? syn match puppetBrace "}"

?

??????? syn region puppetString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=puppetVariable

?

??????? syn keyword puppetBoolean true false

??????? syn keyword puppetKeyword import inherits include

??????? syn keyword puppetControl case default

?

??????? " comments last overriding everything else

??????? syn match puppetComment "\s*#.*$" contains=puppetTodo

??????? syn keyword puppetTodo TODO NOTE FIXME XXX contained

?

??????? " Define the default highlighting.

??????? " For version 5.7 and earlier: only when not done already

??????? " For version 5.8 and later: only when an item doesn't have highlighting yet

??????? if version >= 508 || !exists("did_puppet_syn_inits")

??????? if version < 508

??????? let did_puppet_syn_inits = 1

??????? command -nargs=+ HiLink hi link <args>

??????? else

??????? command -nargs=+ HiLink hi def link <args>

??????? endif

?

??????? HiLink puppetVariable Identifier

??????? HiLink puppetBoolean Boolean

??????? HiLink puppetType Identifier

??????? HiLink puppetDefault Identifier

??????? HiLink puppetKeyword Define

??????? HiLink puppetTypeDefs Define

??????? HiLink puppetComment Comment

??????? HiLink puppetString String

??????? HiLink puppetTodo Todo

??????? " HiLink puppetBrace Delimiter

??????? " HiLink puppetTypeBrace Delimiter

??????? " HiLink puppetParen Delimiter

??????? HiLink puppetDelimiter Delimiter

??????? HiLink puppetControl Statement

??????? HiLink puppetDefType Define

??????? HiLink puppetDefName Type

??????? HiLink puppetTypeName Statement

??????? HiLink puppetTypeDefault Type

??????? HiLink puppetParamName Identifier

??????? HiLink puppetArgument Identifier

?

??????? delcommand HiLink

??????? endif

?

??????? let b:current_syntax = "puppet"

?

3.創建ftdetect/puppet.vim

??? vim ~/.vim/ftdetect/puppet.vim?

??????? au BufRead,BufNewFile *.pp setfiletype puppet

?

4.測試

??????????? vim /etc/puppet/manifests/site.pp

?

?

五、配置、管理、使用

puppet命令

?

?

1.puppet.comf文件詳解

①[main]命名空間選項(全局配置):

?

confdir 配置文件目錄,默認在/etc/puppet

?

vardir 動態數據目錄,默認在/var/lib/puppet

?

logdir 日志目錄,默認在/var/log/log

?

rundir puppet PID目錄,默認在/var/run/puppet

?

statedir state目錄,默認在$vardir/state

?

statefile state文件,默認在$statedir/state.yaml

?

ssldir SSL證書目錄,默認在$vardir/ssl

?

trace 發生錯誤時顯示跟蹤信息,默認false

?

filetimeout 檢測配置文件狀態改變的時間周期,單位秒,默認15秒

?

syslogfacility 指定syslog功能為user級,默認為daemon級

?

②[puppetmasterd]命名空間選項(服務器的配置):

?

user 后臺進程執行的用戶

?

group 后臺進程執行的組

?

mainfestdir mainfests文件存儲目錄,默認為$confdir/mainfests

?

mainfest mainfest站點文件的名字,默認為site.pp

?

bindaddress 后臺進程綁定的網卡地址接口

?

masterport 后臺進程執行的端口,默認為8140

?

③[puppet]命名空間選項(客戶端的配置):

?

server puppet puppet服務器名,默認為puppet

?

runinterval seconds puppet應用配置的時間間隔,默認1800秒(0.5小時)

?

puppetdlockfie file puppet lock文件位置,默認$statedir/puppetdlock

?

puppetport port 后臺進程執行的端口,默認8139

?

2.文件服務配置文件(fileserver.conf)的詳解:

?

[files]

?

path /var/lib/puppet/files

?

allow 121.14.1.*

?

allow 60.28.228.0/24

?

allow *.house.sina.com.cn

?

deny *.sina.com.cn

?

path定義文件存放路徑,通過allow/deny來控制訪問權限。

?

3. puppet命令集(建議使用puppet 類型 參數)

?

①puppet 用于執行用戶所寫獨立的mainfests文件

?

語法:

puppet [-h|--help] [-V|--version] [-d|--debug] [-v|--verbose][--detailed-exitcodes] [-l|--logdest ]

?

用法:

# puppet -l /tmp/manifest.log manifest.pp

?

?

?

②puppetd 運行在被管理主機上的客戶端程序

?

語法:

puppetd [-D|--daemonize|--no-daemonize] [-d|--debug] [--disable] [--enable][-h|--help] [--fqdn ] [-l|--logdest syslog||console][-o|--onetime] [--serve ] [-t|--test] [--noop][-V|--version] [-v|--verbose] [-w|--waitforcert ]

?

用法:

# puppetd –server puppet.domain.com

?

?

?

③puppetmasterd 運行在管理機上的服務器程序

?

語法:

puppetmasterd [-D|--daemonize|--no-daemonize] [-d|--debug] [-h|--help][-l|--logdest |console|syslog] [--nobucket] [--nonodes] [-v|--verbose] [-V|--version]

?

用法:

# puppetmasterd

?

?

?

④puppetca puppet認證程序

?

語法:

puppetca [-a|--all] [-h|--help] [-V|--version] [-d|--debug] [-v|--verbose] [-g|--generate] [-l|--list] [-s|--sign] [-r|--revoke] [-p|--print] [-c|--clean] [--verify] [host]

?

用法:

# puppetca –l

# puppetca -s culain.madstop.com

#puppetca -a -s? ?????????????????? #為所有的客戶端進行認證

?

?

?

⑤puppetrun 用于連接客戶端,強制運行在本地配置文件下

語法:

puppetrun [-a|--all] [-c|--class ] [-d|--debug] [-f|--foreground] [-h|--help] [--host ] [--no-fqdn] [--ignoreschedules] [-t|--tag ] [--test] [-p|--ping]

?

用法:

# puppetrun -p 10 –host host1 –host host2 -t remotefile -t webserver

?

?

⑥filebucket 客戶端用于發送文件到puppet file bucket的工具

語法:

filebucket [-h|--help] [-V|--version] [-d|--debug] [-v|--verbose] [-l|--local] [-r|--remote] [-s|--server ] [-b|--bucket ] …

?

用法:

# filebucket -b /tmp/filebucket /my/file

?

⑦ralsh 轉換配置信息到puppet配置代碼

語法:

ralsh [-h|--help] [-d|--debug] [-v|--verbose] [-e|--edit] [-H|--host ] [-p|--param] [-t|--types] type

?

用法:

# ralsh user luke

user {

?

  ‘luke’:

  home => ‘/home/luke’,

  uid => ‘100′,

  ensure => ‘present’,

  comment => ‘Luke Kanies,,,’,

  gid => ‘1000′,

  shell => ‘/bin/bash’,

  groups => ['sysadmin','audio','video','puppet']

}

?

?

?

⑧puppetdoc 打印puppet參考文檔

語法:

puppetdoc [-a|--all] [-h|--help] [-o|--outputdir ] [-m|--mode ] [-r|--reference <[type]|configuration|..>] [manifest-file]

?

用法:

# puppetdoc -r type > /tmp/type_reference.rst

# puppetdoc –outputdir /tmp/rdoc –mode rdoc /path/to/manifests

# puppetdoc /etc/puppet/manifests/site.pp

?

?

附:我的puppetmaster的配置文件

?

[main]

??? vardir? = /var/puppet

??? logdir = /var/log/puppet

??? rundir = /var/run/puppet

??? ssldir = $vardir/ssl

??? confdir = /etc/puppet

[puppetd]

??

??? classfile = $vardir/classes.txt

??? # Where puppetd caches the local configuration.? An

??? # extension indicating the cache format is added automatically.

??? # The default value is '$confdir/localconfig'.

??? localconfig = $vardir/localconfig

[puppetmasterd]

??? environment = production

??? reports = store,log,mydefine

??? logdir = /var/log/puppet

??? modulepath = /etc/puppet/modules:/usr/share/puppet/modules

??? config = /etc/puppet/puppet.conf

??? manifestdir = /etc/puppet/manifests

??? manifest = /etc/puppet/manifests/site.pp

??? fileserverconfig = /etc/puppet/fileserver.conf

??? templatedir = /etc/puppet/templates

??? reportdir = /var/lib/puppet/reports

??? autosign=true?????????? #自動認證客戶端

??? clientyamldir = /var/lib/puppet/client_yaml

?

客戶端的配置文件

?

? [main]

??? vardir = /var/lib/puppet

??? logdir = /var/log/puppet

??? rundir = /var/run/puppet

??? ssldir = $vardir/ssl

[puppetd]

??? server = pu.server.com

??? authconfig = /etc/puppet/namespaceauth.conf

??? classfile = $vardir/classes.txt

??? localconfig = $vardir/localconfig

??? puppetdlog = /var/log/puppet/puppetd.log

??? runinterval = 600

??? report = true???????????????? #這個默認是false如果不填寫就沒有報表了!

??? reportserver = pu.server.com

?

?

常用命令:

?

1.#puppetmasterd --genconfig > /etc/puppet/puppet.conf.default

?

2.#puppetmasterd -d -v --no-daemonize

?

3.#puppetd -v -d --no-daemonize

轉載于:https://my.oschina.net/fufangchun/blog/131680

總結

以上是生活随笔為你收集整理的puppet全方位学习之总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本高清一区二区视频 | 韩国一区二区在线观看 | 色老头免费视频 | 精品国产一区二区三区性色 | 九九久久国产精品 | 两个女人互添下身爱爱 | 成人黄网免费观看视频 | 简单av在线 | 日日噜噜噜 | 国产精品久久久久久久久久久久久久久久 | 奇米影视一区二区 | 国产丝袜视频在线 | 欧美草逼视频 | 欧美a视频 | 欧美日韩成人在线观看 | 女同性做爰全过程 | 香蕉午夜视频 | 亚色综合| 男插女动态图 | 69xxx少妇按摩视频 | 激情内射亚洲一区二区三区爱妻 | 日韩一区二区影院 | 人妻少妇精品无码专区二区 | 性综艺节目av在线播放 | 无码人妻少妇色欲av一区二区 | 日本在线中文 | 领导揉我胸亲奶揉下面 | 在线播放成人 | 欧美福利影院 | 亚洲国产一区在线观看 | 国产有码 | 青草操 | 99草视频| 森泽佳奈在线播放 | 国产精品女人精品久久久天天 | 国产综合激情 | 欧美黄色成人 | 草久免费视频 | 国产成人啪免费观看软件 | 欧美三级免费看 | 成人激情小视频 | 欧美熟妇精品黑人巨大一二三区 | 国产精品无码一区二区无人区多人 | av私库| 经典三级av在线 | 欧美超碰在线观看 | 久久久久亚洲av成人网人人网站 | 国产精品视频999 | 亚洲一区欧美 | www.日本com| 人人妻人人澡人人爽人人精品 | 无码成人精品区在线观看 | 26uuu精品一区二区在线观看 | japanese av在线| 777毛片 | 人妻射精一区二区 | 欧美三日本三级少妇三级99观看视频 | 久久精品区 | 亚洲日本中文字幕 | 天堂www中文在线资源 | 国产精品456 | 亚洲视频二 | 色臀av | 黄色av视屏 | 国产馆视频 | 校花被c到呻吟求饶 | 日韩在线视频免费观看 | 中文字幕免费一区 | xxx一区二区 | 国产视频首页 | 日韩在线观看一区 | 欧美日韩一二三区 | 91久久一区 | 婷婷综合另类小说色区 | 激情五月激情综合网 | 国产精品丝袜视频无码一区69 | 超能一家人电影免费喜剧在线观看 | 色av免费| 欧美一区二区大片 | 亚洲色图首页 | 国产精品视频全国免费观看 | 日韩不卡 | 五月激情久久 | 葵司一区二区 | 热久久久久久久 | 美美女高清毛片视频免费观看 | 视频一区二区中文字幕 | 欧美精品黑人 | 欧美一区二区视频免费观看 | 国产91清纯白嫩初高中在线观看 | 国产亚洲色婷婷久久 | 亚洲一区在线播放 | 国产一级理论片 | 久久精品这里 | 欧美不卡视频 | 性生交大片免费看视频 | 一区二区免费在线观看视频 | 粉嫩久久99精品久久久久久夜 | 红桃av|