天天看點

通過自定義fact增強MCollective推送更新中繼資料的靈活性

目前由于Facter并不全面,許多關于主機和環境的資訊并沒有作為Facter的fact。編寫自定義的fact,可以讓節點的facter包含更多的中繼資料fact,增加MCollective選擇中繼資料定位主機的靈活性。

<a></a>

首選,需要在每個節點自定義一個facts文檔,文檔中包含了每個節點自定義的fact資訊。為了友善管理,所有變量的值都必須事先定義好,可在puppet服務端定義一個fact變量清單,裡面包含所有節點的自定義fact資訊。然後,節點根據各自的主機特性選擇合适的fact資訊。

1

2

3

4

5

6

7

8

9

10

11

12

13

<code>[root@puppetserver ~]# vim /etc/mcollective/facts.txt #收集并定義所有節點的fact資訊,僅僅作為檢視用</code>

<code>fact_certname=&lt;自定義&gt;</code>

<code>fact_apply1=apache</code>

<code>fact_apply2=php</code>

<code>fact_apply3=mysql</code>

<code>fact_apply4=java</code>

<code>fact_apply5=tomcat</code>

<code>fact_apply6=oracle</code>

<code>fact_apply7=nginx</code>

<code>fact_apply8=jboss</code>

<code>fact_apply9=haproxy</code>

<code>fact_apply10=db2</code>

<code>…</code>

<code>[root@agent1 ~]# cat /etc/mcollective/facts.txt #假設agent1節點具有以下fact變量資訊</code>

<code>fact_certname=agent1.kisspuppet.com #puppet認證用,可寫成其他名稱</code>

<code>[root@agent2 ~]# cat /etc/mcollective/facts.txt #假設agent1節點具有以下fact變量資訊</code>

<code>fact_certname=agent2.kisspuppet.com #puppet認證用,可寫成其他名稱</code>

由于自定義fact資訊屬于每個節點的特性,放在agents(存放單個節點個性子產品的目錄)目錄中,可将這部分定義成一個class包含到每個節點的class agentN{}中。

14

<code>[root@puppetserver ~]# cat /etc/puppet/agents/modules/agent1/manifests/init.pp</code>

<code>class</code> <code>agent1{</code>

<code>    </code><code>include</code> <code>agent1::facts</code>

<code>}</code>

<code>class</code> <code>agent1::facts{</code>

<code>        </code><code>file{ </code><code>"/etc/mcollective/facts.txt"</code><code>:</code>

<code>                </code><code>owner =&gt; </code><code>"root"</code><code>,</code>

<code>                </code><code>group =&gt; </code><code>"root"</code><code>,</code>

<code>                </code><code>mode =&gt; </code><code>0400</code><code>,</code>

<code>                </code><code>content =&gt; template(</code><code>"agent1/facts.txt.erb"</code><code>),</code>

<code>                </code><code>backup =&gt; </code><code>'main'</code><code>,</code>

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

<code>...</code>

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

<code>[root@puppetserver agents]# cat modules/agent1/templates/facts.txt.erb</code>

<code>------------Some custom facts </code><code>var</code><code>iables-------------</code>

<code>fact_certname=agent1.kisspuppet.com</code>

<code>----------------------------------------------------</code>

<code>[root@puppetserver agents]# cat modules/agent1/manifests/init.pp</code>

<code>[root@puppetserver agents]# cat modules/agent2/templates/facts.txt.erb</code>

<code>fact_certname=agent2.kisspuppet.com</code>

3.1 建立全局子產品

建立一個子產品可命名為public,放在environment(存放基礎環境的子產品)子產品中,自定義fact fact_apply.rb(過濾各自的自定義fact資訊)

<code>[root@puppetserver puppet]# cat environment/modules/</code><code>public</code><code>/lib/facter/fact_apply.rb</code>

<code># certname </code><code>is</code> <code>usered </code><code>for</code> <code>/etc/puppet/puppet.conf</code>

<code>Facter.add(</code><code>"fact_certname"</code><code>) </code><code>do</code>

<code>   </code><code>setcode </code><code>do</code>

<code>       </code><code>Facter::Util::Resolution.exec(</code><code>"/bin/grep 'fact_certname=' /etc/mcollective/facts.txt |awk -F= '{print $2}'"</code><code>)</code>

<code>     </code><code>end</code>

<code>end</code>

<code># fact_apply1~N.rb</code>

<code>#</code>

<code>Facter.add(</code><code>"fact_apply1"</code><code>) </code><code>do</code>

<code>       </code><code>Facter::Util::Resolution.exec(</code><code>"/bin/grep 'fact_apply1=' /etc/mcollective/facts.txt |awk -F= '{print $2}'"</code><code>)</code>

<code>Facter.add(</code><code>"fact_apply2"</code><code>) </code><code>do</code>

<code>       </code><code>Facter::Util::Resolution.exec(</code><code>"/bin/grep 'fact_apply2=' /etc/mcollective/facts.txt |awk -F= '{print $2}'"</code><code>)</code>

<code>Facter.add(</code><code>"fact_apply10"</code><code>) </code><code>do</code>

<code>       </code><code>Facter::Util::Resolution.exec(</code><code>"/bin/grep 'fact_apply10=' /etc/mcollective/facts.txt |awk -F= '{print $2}'"</code><code>)</code>

3.2 設定局部子產品

如果自定義的fact屬于某一個子產品下具有的特性,隻需要将fact資訊定義到對應的子產品中即可,無需建立全局fact子產品,比如放在mysql子產品中等。

當pluginsync選項設定為true後,就打開了“子產品中的插件”功能。當agent連接配接到master時,每一個agent都會檢查他們的子產品中的自定義代碼。Puppet會将這些自定義代碼同步到相關的agent中。然後他們就能在這些agent中使用了。

<code>[root@puppetserver ~]# vim /etc/puppet/puppet.conf</code>

<code>[main]</code>

<code>pluginsync = </code><code>true</code>

<code>[root@agent2 ~]# vim /etc/puppet/puppet.conf</code>

5.1 節點運作puppet指令更新

<code>[root@agent2 ~]# puppet agent --test</code>

<code>info: Retrieving plugin</code>

<code>notice: /File[/</code><code>var</code><code>/lib/puppet/lib/facter/fact_apply.rb]/ensure: defined content </code><code>as</code> <code>'{md5}03bdfe12d6f40fb8abe0bd407dab6d69'</code>

<code>info: Loading downloaded plugin /</code><code>var</code><code>/lib/puppet/lib/facter/fact_apply.rb #自動下載下傳</code>

<code>info: Loading facts </code><code>in</code> <code>/</code><code>var</code><code>/lib/puppet/lib/facter/backup_date.rb</code>

<code>info: Loading facts </code><code>in</code> <code>/</code><code>var</code><code>/lib/puppet/lib/facter/fact_apply.rb #自動載入</code>

<code>info: Caching catalog </code><code>for</code> <code>agent2.kisspuppet.com</code>

<code>info: Applying configuration version </code><code>'1381211740'</code>

5.2 通過節點檢視自定義fact是否生效

<code>[root@agent2 ~]# facter -p | grep fact_</code>

<code>fact_apply2 =&gt; php</code>

<code>fact_apply3 =&gt; mysql</code>

<code>fact_apply7 =&gt; nginx</code>

<code>fact_certname =&gt; agent1.kisspuppet.com</code>

<code>[root@agent1 facter]# facter -p | grep fact_</code>

<code>fact_certname =&gt; agent2.kisspuppet.com</code>

<code>fact_apply10 =&gt; db2</code>

<code>fact_apply4 =&gt; java</code>

6 MCollective用戶端測試自定義fact

<code>[root@puppetserver facter]# mco inventory agent1.kisspuppet.com | grep fact_</code>

<code>      </code><code>fact_apply10 =&gt; db2</code>

<code>      </code><code>fact_apply3 =&gt; mysql</code>

<code>      </code><code>fact_apply4 =&gt; java</code>

<code>[root@puppetserver facter]# mco inventory agent2.kisspuppet.com | grep fact_</code>

<code>      </code><code>fact_apply2 =&gt; php</code>

<code>      </code><code>fact_apply7 =&gt; nginx</code>

7.1 觸發更新fact_apply4=java的主機

自定義fact fact_apply4=‘java’的主機目前隻有agent1

<code>[root@puppetserver facter]# mco puppet -v runonce  mco facts -v --</code><code>with</code><code>-fact  fact_apply4=</code><code>'java'</code>

<code>Discovering hosts using the mc method </code><code>for</code> <code>2</code> <code>second(s) .... </code><code>1</code>

<code> </code><code>* [ ============================================================&gt; ] </code><code>1</code> <code>/ </code><code>1</code>

<code>agent1.kisspuppet.com                      : OK</code>

<code>    </code><code>{:summary=&gt;      </code><code>"Started a background Puppet run using the 'puppet agent --onetime --daemonize --color=false --splay --splaylimit 30' command"</code><code>}</code>

<code>---- rpc stats ----</code>

<code>           </code><code>Nodes: </code><code>1</code> <code>/ </code><code>1</code>

<code>     </code><code>Pass / Fail: </code><code>1</code> <code>/ </code><code>0</code>

<code>      </code><code>Start Time: Tue Oct </code><code>08</code> <code>14</code><code>:</code><code>24</code><code>:</code><code>08</code> <code>+</code><code>0800</code> <code>2013</code>

<code>  </code><code>Discovery Time: </code><code>2003</code><code>.39ms</code>

<code>      </code><code>Agent Time: </code><code>1091</code><code>.75ms</code>

<code>      </code><code>Total Time: </code><code>3095</code><code>.14ms</code>

7.2 觸發更新fact_apply3=mysql和系統為RHEL5.7的主機

自定義fact fact_apply3=‘mysql’的主機有agent1和agent2,系統為RHEL5.7的主機隻有agent2(通過系統自帶fact擷取),取交集,隻有agent2會被觸發更新。

<code>[root@puppetserver facter]# mco puppet -v runonce   rpc --np -F  operatingsystemrelease=</code><code>'5.7'</code> <code>-F  fact_apply3=</code><code>'mysql'</code>

<code>agent2.kisspuppet.com                      : OK</code>

<code>      </code><code>Start Time: Tue Oct </code><code>08</code> <code>14</code><code>:</code><code>22</code><code>:</code><code>23</code> <code>+</code><code>0800</code> <code>2013</code>

<code>  </code><code>Discovery Time: </code><code>2004</code><code>.56ms</code>

<code>      </code><code>Agent Time: </code><code>1092</code><code>.00ms</code>

<code>      </code><code>Total Time: </code><code>3096</code><code>.56ms</code>

本文轉自淩激冰51CTO部落格,原文連結:http://blog.51cto.com/dreamfire/1322692,如需轉載請自行聯系原作者