一、關于Puppet
puppet是一個IT基礎設施自動化管理工具,它能夠幫助系統管理者管理基礎設施的整個生命周期:供應(provisioning)、配置(configuration)、關聯(orchestration)及報告(reporting),基于puppet,可以實作自動化重複任務,快速部署關鍵性應用以及在本地或雲端完成主動管理變更和快速擴充架構規模等。
puppet資源
如果把OS的所有配置,如使用者賬号、特定的檔案、檔案所屬的目錄、運作的服務、程式包以及cron任務等,看作是許多獨立原子單元的集合的話,這些所謂的“單元”就是“資源”,不過,這些資源在其大小、複雜程度以及生命周期的跨度上等多個次元上可能會各不相同。
通常來說,類屬于同一種資源的屬性是相近的,如檔案都有其屬主和屬組,而使用者賬号則由使用者名、UID、GID等組成。但,即便是同一種資源,其在不同OS上的實作方式卻又可能各不相同,例如,在windows上和Linux上啟動和停止服務的方式相去甚遠。
是以,puppet從以下三個次元來對資源完成抽象:
相似的資源被抽象成同一種資源“類型”,如程式包資源、使用者資源及服務資源等;
将資源屬性或狀态的描述與其實作方式剝離開來,如僅說明安裝一個程式包而不用關心其具體是通過yum、pkgadd、ports或是其它方式實作;
僅描述資源的目标狀态,也即期望其實作的結果,而不是其具體過程,如“确定nginx運作起來”而不是具體描述為“運作nginx指令将其啟動起來”;
這三個也被稱作puppet的資源抽象層(RAL)。RAL由type(類型)和provider(提供者,即不同OS上的特定實作)組成。
puppet資源解構
在為puppet定義一個資源時,這種文法被稱作“資源申報(resource declaration)”,它是puppet語言的核心組成部分。上述的定義中,僅描述了資源的目标狀态而沒有提到為達成目标所需要采取的任何步驟。而資源定義的核心也可以抽象為type、title、attribute和value四個部分。
puppet有許多内置的資源類型,而通過安裝插件還可以繼續新增額外的類型。可以通過puppet官方的類型參考頁面(http://docs.puppetlabs.com/references/latest/type.html)擷取詳細的資訊。也可以使"puppet describe"指令來擷取puppet目前所支援的類型清單及每種類型的詳細資訊,下面給出了一個簡要的使用說明。
puppet describe -l:例如puppet支援的所有資源類型及其描述資訊;
puppet describe -s <TYPE>:列出指定資源的簡要說明;
puppet describe <TYPE>:顯示指定資源的詳細說明;
下面說一下,puppet幾個常用的資源使用方法:
首先安裝puppet
1
2
3
4
<code># 更新facter版本</code>
<code>[root@node1 ~]</code><code># rpm -Uvh facter-1.7.3-1.el6.x86_64.rpm</code>
<code># 添加epel安裝源,安裝puppet</code>
<code>[root@node1 ~]</code><code># yum -y localinstall puppet-2.7.23-1.el6.noarch.rpm</code>
package資源使用:
5
6
7
8
9
10
11
<code># 安裝nginx</code>
<code>[root@node1 ~]</code><code># vi test.pp</code>
<code>package {</code><code>'nginx'</code><code>:</code>
<code> </code><code>ensure => </code><code>true</code><code>, </code><code>#確定nginx是被安裝的</code>
<code>}</code>
<code># 執行test.pp</code>
<code>[root@node1 ~]</code><code># puppet apply test.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Package</code><code>[nginx]</code><code>/ensure</code><code>: ensure changed </code><code>'1.0.15-5.el6'</code> <code>to </code><code>'true'</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.77 seconds</code>
<code>[root@node1 ~]</code><code># rpm -q nginx</code>
<code>nginx-1.0.15-5.el6.x86_64</code>
service資源使用
12
13
14
15
16
17
<code> </code><code>ensure => </code><code>true</code><code>,</code>
<code>service {</code><code>'nginx'</code><code>:</code>
<code> </code><code>ensure => </code><code>true</code><code>, </code><code>#確定服務是被啟動的</code>
<code> </code><code>require => Package[</code><code>'nginx'</code><code>], </code><code>#確定是在安裝nginx之後啟動</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Service</code><code>[nginx]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>
<code>notice: Finished catalog run </code><code>in</code> <code>1.02 seconds</code>
<code>[root@node1 ~]</code><code># ps aux | grep nginx</code>
<code>root 8562 0.0 0.0 94572 2024 ? Ss 11:31 0:00 nginx: master process </code><code>/usr/sbin/nginx</code> <code>-c </code><code>/etc/nginx/nginx</code><code>.conf</code>
<code>nginx 8563 0.0 0.0 94916 2580 ? S 11:31 0:00 nginx: worker process </code>
<code>root 8568 0.0 0.0 6384 656 pts</code><code>/0</code> <code>R+ 11:31 0:00 </code><code>grep</code> <code>nginx</code>
<code># 發現nginx已經啟動</code>
group資源使用:
<code>[root@node1 ~]</code><code># vi test2.pp</code>
<code>group {</code><code>'hellopuppet'</code><code>:</code>
<code> </code><code>ensure => present, </code><code>#確定hellopuppet是被建立的</code>
<code> </code><code>gid => 1001, </code><code># gid為1001</code>
<code>[root@node1 ~]</code><code># puppet apply test2.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Group</code><code>[hellopuppet]</code><code>/ensure</code><code>: created</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.08 seconds</code>
<code>[root@node1 ~]</code><code># cat /etc/group | grep hellopuppet</code>
<code>hellopuppet:x:1001:</code>
user資源使用:
18
19
20
21
22
<code> </code><code>ensure => present,</code>
<code> </code><code>gid => 1001,</code>
<code>user {</code><code>'hellopuppet'</code><code>:</code>
<code> </code><code>ensure => present, </code><code>#確定使用者被建立</code>
<code> </code><code>gid => 1001, </code><code>#指定基本組ID</code>
<code> </code><code>uid => 1001, </code><code>#指定uid</code>
<code> </code><code>home => </code><code>'/home/hellopuppet'</code><code>, </code><code>#指定家目錄</code>
<code> </code><code>managehome => </code><code>true</code><code>, </code><code>#建立家目錄</code>
<code> </code><code>password => </code><code>'$1$2b2a85db$liwf2K3dQzc2oaRq/RnUg/'</code><code>, </code><code>#給使用者建立密碼,可以使用openssl passwd -1 -salt `openssl rand -hex 4`指令生成随機串,然後粘貼在這裡</code>
<code> </code><code>require => Group[</code><code>'hellopuppet'</code><code>], </code><code>#在建立hellopuppet組之後,建立使用者</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//User</code><code>[hellopuppet]</code><code>/ensure</code><code>: created</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.09 seconds</code>
<code>[root@node1 ~]</code><code># cat /etc/passwd | grep hellopuppet</code>
<code>hellopuppet:x:1001:1001::</code><code>/home/hellopuppet</code><code>:</code><code>/bin/bash</code>
<code>[root@node1 ~]</code><code># cat /etc/shadow | grep hellopuppet</code>
<code>hellopuppet:$1$2b2a85db$liwf2K3dQzc2oaRq</code><code>/RnUg/</code><code>:16173:0:99999:7:::</code>
<code># 發現使用者已被建立,并且生成密碼</code>
cron資源使用:
<code>[root@node1 ~]</code><code># vi test3.pp</code>
<code>cron</code> <code>{</code><code>'ntpdate'</code><code>:</code>
<code> </code><code>command</code> <code>=> </code><code>"/usr/sbin/ntpdate 8.8.8.8"</code><code>, </code><code>#執行的指令</code>
<code> </code><code>user => root, </code><code>#指定執行使用者</code>
<code> </code><code>minute => </code><code>'*/3'</code><code>, </code><code>#指定每3分鐘執行一次</code>
<code> </code><code>ensure => present, </code><code>#確定被建立任務 </code>
<code> </code>
<code>[root@node1 ~]</code><code># puppet apply test3.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Cron</code><code>[ntpdate]</code><code>/ensure</code><code>: created</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.03 seconds</code>
<code>[root@node1 ~]</code><code># crontab -l</code>
<code># Puppet Name: ntpdate</code>
<code>*</code><code>/3</code> <code>* * * * </code><code>/usr/sbin/ntpdate</code> <code>8.8.8.8</code>
<code># 發現cron任務已經被建立</code>
file資源使用:
<code>[root@node1 ~]</code><code># cp /etc/nginx/nginx.conf /tmp/nginx.conf</code>
<code>[root@node1 ~]</code><code># mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak</code>
<code>[root@node1 ~]</code><code># vi test4.pp</code>
<code>file</code> <code>{</code><code>'/etc/nginx/nginx.conf'</code><code>:</code>
<code> </code><code>ensure => </code><code>file</code><code>, </code><code>#確定nginx.conf是一個檔案</code>
<code> </code><code>mode => 0644, </code><code>#定義權限</code>
<code> </code><code>source</code> <code>=> </code><code>'/tmp/nginx.conf'</code><code>, </code><code>#定義檔案的源位址,如過沒就從source複制</code>
<code>[root@node1 ~]</code><code># puppet apply test4.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/ensure</code><code>: defined content as </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.02 seconds</code>
<code>[root@node1 ~]</code><code># ls /etc/nginx/nginx.conf</code>
<code>/etc/nginx/nginx</code><code>.conf</code>
資源間的應用次序
<code>[root@node1 ~]</code><code># yum -y remove nginx</code>
<code> </code><code>ensure => running,</code>
<code> </code><code>enable</code> <code>=> </code><code>true</code><code>,</code>
<code>Package[</code><code>'nginx'</code><code>] -> Service[</code><code>'nginx'</code><code>]</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Package</code><code>[nginx]</code><code>/ensure</code><code>: created</code>
<code>notice: Finished catalog run </code><code>in</code> <code>2.27 seconds</code>
<code>root 13589 0.0 0.0 94572 2028 ? Ss 11:57 0:00 nginx: master process </code><code>/usr/sbin/nginx</code> <code>-c </code><code>/etc/nginx/nginx</code><code>.conf</code>
<code>nginx 13590 0.0 0.0 94916 2576 ? S 11:57 0:00 nginx: worker process </code>
<code>root 13596 0.0 0.0 6384 652 pts</code><code>/0</code> <code>R+ 11:57 0:00 </code><code>grep</code> <code>nginx</code>
<code># Package['nginx'] -> Service['nginx'] 表示先安裝nginx,然後啟動nginx</code>
exec資源使用
23
<code>exec</code> <code>{</code><code>'chkconfig nginx'</code><code>:</code>
<code> </code><code>path => </code><code>"/sbin"</code><code>, </code><code>#執行指令的,程式路徑</code>
<code> </code><code>command</code> <code>=> </code><code>"chkconfig --add nginx; chkconfig nginx off"</code><code>, </code><code>#執行的指令</code>
<code> </code><code>user => root, </code><code>#執行使用者</code>
<code> </code><code>group => root,</code>
<code>Package[</code><code>'nginx'</code><code>] -> Service[</code><code>'nginx'</code><code>] -> Exec[</code><code>'chkconfig nginx'</code><code>]</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Exec</code><code>[chkconfig nginx]</code><code>/returns</code><code>: executed successfully</code>
<code>notice: Finished catalog run </code><code>in</code> <code>2.05 seconds</code>
<code>[root@node1 ~]</code><code># chkconfig --list nginx</code>
<code>nginx 0:off 1:off 2:off 3:off 4:off 5:off 6:off</code>
發現資源按照順序依次執行
資源間通知的使用:
24
25
26
27
<code> </code><code>ensure => </code><code>file</code><code>,</code>
<code> </code><code>mode => 0644,</code>
<code> </code><code>source</code> <code>=> </code><code>'/tmp/nginx.conf'</code><code>,</code>
<code>service { </code><code>'nginx'</code><code>:</code>
<code> </code><code>ensure => running,</code>
<code> </code><code>enable</code> <code>=> </code><code>true</code><code>,</code>
<code>File[</code><code>'/etc/nginx/nginx.conf'</code><code>] ~> Service[</code><code>'nginx'</code><code>]</code>
<code>[root@node1 ~]</code><code># vi /tmp/nginx.conf</code>
<code># 修改源檔案中啟動線程為4</code>
<code>worker_processes 4</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/content</code><code>: content changed </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code> <code>to </code><code>'{md5}95f45f10386878664af2b7ccd1536ea4'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Service</code><code>[nginx]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.50 seconds</code>
<code>root 15452 0.0 0.0 94572 2024 ? Ss 12:05 0:00 nginx: master process </code><code>/usr/sbin/nginx</code> <code>-c </code><code>/etc/nginx/nginx</code><code>.conf</code>
<code>nginx 15453 0.0 0.0 94916 2612 ? S 12:05 0:00 nginx: worker process </code>
<code>nginx 15454 0.0 0.0 94916 2696 ? S 12:05 0:00 nginx: worker process </code>
<code>nginx 15456 0.0 0.0 94916 2696 ? S 12:05 0:00 nginx: worker process </code>
<code>nginx 15457 0.0 0.0 94916 2676 ? S 12:05 0:00 nginx: worker process </code>
<code>root 15463 0.0 0.0 6384 656 pts</code><code>/0</code> <code>R+ 12:05 0:00 </code><code>grep</code> <code>nginx</code>
<code># 啟動程序變為4個,</code>
<code># File['/etc/nginx/nginx.conf'] ~> Service['nginx']表示當配置檔案有修改時,重新開機nginx</code>
正規表達式的使用
<code>[root@node1 ~]</code><code># vi test5.pp</code>
<code>$webserver = $operatingsystem ? {</code>
<code> </code><code>/(?i-mx:ubuntu|debian)/ => </code><code>'apache2'</code><code>,</code>
<code> </code><code>/(?i-mx:centos|fedora|redhat)/ => </code><code>'httpd'</code><code>,</code>
<code>notify {</code><code>"$webserver"</code><code>:</code>
<code> </code><code>message => </code><code>"install $webserver"</code><code>,</code>
<code>[root@node1 ~]</code><code># puppet apply test5.pp</code>
<code>notice: </code><code>install</code> <code>httpd</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Notify</code><code>[httpd]</code><code>/message</code><code>: defined </code><code>'message'</code> <code>as </code><code>'install httpd'</code>
首先定義一個webserver變量,$operatingsystem是pupppet中的頂級變量,表示目前系統的版本,可以随時調用"?"表示判斷語句,然後後面是正則模式比對,"i"表示忽略字元大小寫,"-m"表示不把.當作換行符,"x"表示忽略模式中的空白字元和注釋,然後通過notify資源輸出,因為目前是centos系統,是以通知要安裝httpd。
puppet資源使用,暫時先介紹這麼多,以後會不斷更新。
本文轉自ljl_19880709 51CTO部落格,原文連結:http://blog.51cto.com/luojianlong/1394841,如需轉載請自行聯系原作者