puppet的預設資源
預設資源可以為資源初始化屬性和值,通常預設資源聲明在site.pp檔案首部,代碼如下:
1
2
<code>[root@sh-web1 ~]</code><code># cat site.pp </code>
<code>Exec { path => </code><code>'/usr/bin:/bin:/usr/sbin:/sbin'</code><code>}</code>
聲明預設資源注意事項如下:
1、聲明預設資源時首字母需要大寫,如exec聲明預設資源Exec、package聲明預設資源Package等.
2、如果聲明資源有一個名稱空間資源"::",它的每個環節都需要首字母大寫,如Concat::Fragment.
Exec預設資源的聲明方法如下:
通過Exec預設資源聲明path屬性的環境變量值,在後續聲明exec資源時可以直接調用系統指令而不用擔心環境變量的問題.
<code>Package {provider => </code><code>'rpm'</code><code>} </code><code>#Package首字母大寫</code>
<code>package {</code><code>"nginx"</code><code>:}</code>
在預設資源中聲明provider屬性,指定包的安裝方式為rpm,後續package資源中provider屬性均為rpm.
puppet虛拟化資源
虛拟化資源與普通資源的差別,虛拟化資源定以後要先執行個體化再使用,而普通資源定義後直接可以使用,定義虛拟化資源的方法是在資源前追加@,如@user,這時的user資源就是一個虛拟化資源.在代碼檔案中将資源轉換為虛拟資源後,puppet在執行的時候并不會調用它,如果想執行,需要通過realize函數或者"<||>"來執行個體化一個虛拟資源.
示例一:
希望在本機隻建立test使用者.
建立使用者的puppet代碼如下:
3
4
5
6
7
8
9
10
11
12
<code>class user {</code>
<code> </code><code>@user {</code><code>"ops"</code><code>:</code>
<code> </code><code>ensure => present,</code>
<code> </code><code>home => </code><code>'/data/home/ops'</code><code>,</code>
<code> </code><code>shell => </code><code>'/bin/bash'</code><code>,</code>
<code> </code><code>}</code>
<code> </code><code>@user {</code><code>"test"</code><code>:</code>
<code> </code><code>home => </code><code>'/data/home/test'</code><code>,</code>
<code>}</code>
node節點調用:
13
14
<code>node base {</code>
<code> </code><code>include admin</code>
<code>node </code><code>/sh-</code><code>(proxy|web)\d+/ inherits base {</code>
<code>case</code> <code>$::</code><code>hostname</code> <code>{</code>
<code> </code><code>/sh-proxy</code><code>\d+/: {</code>
<code> </code><code>include nginx</code>
<code> </code><code>}</code>
<code> </code><code>"sh-web1"</code><code>: {</code>
<code> </code><code>include user</code>
<code> </code><code>realize (User[</code><code>'test'</code><code>])</code>
<code> </code><code>} </code>
<code> </code><code>}</code>
注意:如果是普通資源的話include user時應該是上面定義的2個使用者都被建立,但是定義為虛拟資源時realize執行個體化隻建立了1個使用者.
puppet運作的結果:
<code>[root@sh-web1 ~]</code><code># puppet agent -t</code>
<code>Notice: Ignoring --listen on onetime run</code>
<code>Info: Retrieving pluginfacts</code>
<code>Info: Retrieving plugin</code>
<code>Info: Loading facts</code>
<code>Info: Caching catalog </code><code>for</code> <code>sh-web1.localdomain</code>
<code>Info: Applying configuration version </code><code>'1509554205'</code>
<code>Notice: </code><code>/Stage</code><code>[main]</code><code>/User/User</code><code>[</code><code>test</code><code>]</code><code>/ensure</code><code>: created</code>
<code>Notice: </code><code>/Stage</code><code>[main]</code><code>/Admin/Exec</code><code>[selinux]</code><code>/returns</code><code>: executed successfully</code>
<code>Notice: Finished catalog run </code><code>in</code> <code>0.22 seconds</code>
<code>[root@sh-web1 ~]</code><code># cat /etc/passwd | grep test</code>
<code>test</code><code>:x:502:502::</code><code>/data/home/test</code><code>:</code><code>/bin/bash</code>
<code>[root@sh-web1 ~]</code><code># cat /etc/passwd | grep ops</code>
示例二:
安裝nginx,普通資源定義:
init.pp檔案.
<code>class nginx {</code>
<code> </code><code>include app::nginx</code>
<code> </code><code>include web::nginx</code>
app.pp檔案.
<code>class app::nginx {</code>
<code> </code><code>package {</code><code>"nginx"</code><code>:</code>
<code> </code><code>ensure => </code><code>'present'</code><code>,</code>
web.pp檔案.
<code>class web::nginx {</code>
node節點引用:
<code> </code><code>case</code> <code>$::</code><code>hostname</code> <code>{</code>
<code> </code><code>/sh-proxy</code><code>\d+/: {</code>
<code> </code><code># include nginx</code>
<code> </code><code>}</code>
<code> </code><code>"sh-web1"</code><code>: {</code>
<code> </code><code>include nginx</code>
<code> </code><code>} </code>
puppet 更新:
<code>Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate declaration: Package[nginx] is already declared </code><code>in</code> <code>file</code> <code>/etc/puppet/modules/nginx/manifests/app</code><code>.pp:4; cannot redeclare at </code><code>/etc/puppet/modules/nginx/manifests/web</code><code>.pp:4 on node sh-web1.localdomain</code>
<code>Warning: Not using cache on failed catalog</code>
<code>Error: Could not retrieve catalog; skipping run</code>
注釋:報錯資源重複定義.
解決方案:使用虛拟資源定義解決:
nginx子產品下init.pp檔案、app.pp檔案、web.pp檔案内容:
<code> </code><code>include app::nginx</code>
<code> </code><code>include web::nginx</code>
<code> </code><code>@package {</code><code>"nginx"</code><code>: ensure => installed}</code>
<code> </code><code>realize (Package[</code><code>'nginx'</code><code>]) </code>
<code>include admin</code>
puppet agent端更新:
<code>Info: Applying configuration version </code><code>'1509555656'</code>
<code>Notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx/Package</code><code>[nginx]</code><code>/ensure</code><code>: created</code>
<code>Notice: Finished catalog run </code><code>in</code> <code>4.02 seconds</code>
注釋:适用于多版本的nginx定義.
示例三:
執行個體化一個虛拟資源除了系統提供的realize函數外,還可以用"<||>".
安裝nginx為例:
nginx子產品下的init.pp檔案.
<a href="https://s2.51cto.com/oss/201711/03/749ba063f34ba3ad16ed0d654633f382.png" target="_blank"></a>
nginx子產品下的app.pp檔案.
<code> </code><code>Package<| title ==</code><code>'nginx'</code> <code>|> </code>
<a href="https://s3.51cto.com/oss/201711/03/37b0f8a46cdc16efbbd4b5dc009f8687.png" target="_blank"></a>
nginx模闆下的web.pp檔案.
<code> </code><code>Package<| title ==</code><code>'nginx'</code> <code>|></code>
<a href="https://s1.51cto.com/oss/201711/03/b11898419fe507678482fdabd350db47.png" target="_blank"></a>
node節點檔案node.pp檔案.
<code>Info: Applying configuration version </code><code>'1509704319'</code>
<code>Notice: Finished catalog run </code><code>in</code> <code>9.20 seconds</code>
<code>[root@sh-web1 ~]</code><code># rpm -qa nginx</code>
<code>nginx-1.10.2-1.el6.x86_64</code>
本文轉自青衫解衣 51CTO部落格,原文連結:http://blog.51cto.com/215687833/1978724