目前由于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=<自定義></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 => </code><code>"root"</code><code>,</code>
<code> </code><code>group => </code><code>"root"</code><code>,</code>
<code> </code><code>mode => </code><code>0400</code><code>,</code>
<code> </code><code>content => template(</code><code>"agent1/facts.txt.erb"</code><code>),</code>
<code> </code><code>backup => </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 => php</code>
<code>fact_apply3 => mysql</code>
<code>fact_apply7 => nginx</code>
<code>fact_certname => agent1.kisspuppet.com</code>
<code>[root@agent1 facter]# facter -p | grep fact_</code>
<code>fact_certname => agent2.kisspuppet.com</code>
<code>fact_apply10 => db2</code>
<code>fact_apply4 => java</code>
6 MCollective用戶端測試自定義fact
<code>[root@puppetserver facter]# mco inventory agent1.kisspuppet.com | grep fact_</code>
<code> </code><code>fact_apply10 => db2</code>
<code> </code><code>fact_apply3 => mysql</code>
<code> </code><code>fact_apply4 => java</code>
<code>[root@puppetserver facter]# mco inventory agent2.kisspuppet.com | grep fact_</code>
<code> </code><code>fact_apply2 => php</code>
<code> </code><code>fact_apply7 => 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>* [ ============================================================> ] </code><code>1</code> <code>/ </code><code>1</code>
<code>agent1.kisspuppet.com : OK</code>
<code> </code><code>{:summary=> </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,如需轉載請自行聯系原作者