天天看點

Puppet預設資源和虛拟資源介紹(三十一)

puppet的預設資源

        預設資源可以為資源初始化屬性和值,通常預設資源聲明在site.pp檔案首部,代碼如下:

1

2

<code>[root@sh-web1 ~]</code><code># cat site.pp </code>

<code>Exec { path =&gt; </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 =&gt; </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函數或者"&lt;||&gt;"來執行個體化一個虛拟資源.

示例一:

希望在本機隻建立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 =&gt; present,</code>

<code>                </code><code>home =&gt; </code><code>'/data/home/ops'</code><code>,</code>

<code>                </code><code>shell =&gt; </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 =&gt; </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 =&gt; </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 =&gt; 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函數外,還可以用"&lt;||&gt;".

安裝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&lt;| title ==</code><code>'nginx'</code> <code>|&gt; </code>

<a href="https://s3.51cto.com/oss/201711/03/37b0f8a46cdc16efbbd4b5dc009f8687.png" target="_blank"></a>

nginx模闆下的web.pp檔案.

<code>    </code><code>Package&lt;| title ==</code><code>'nginx'</code> <code>|&gt;</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

繼續閱讀