溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

puppet的facter使用方法

發(fā)布時(shí)間:2021-07-26 11:18:09 來源:億速云 閱讀:226 作者:chen 欄目:編程語言

這篇文章主要講解了“puppet的facter使用方法”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“puppet的facter使用方法”吧!

在puppet中有一個(gè)很重要的組件template,配合facter模塊可以實(shí)現(xiàn)按需配置的功能。

facter可以看做是在client端用來收集信息的一個(gè)功能組件。其代碼目錄可以通過

facter |grep dir
rubysitedir => /usr/lib/ruby/site_ruby/1.8  

查看(rb文件),每一個(gè)變量對(duì)應(yīng)一個(gè)rb文件,rb文件的結(jié)構(gòu)也比較簡(jiǎn)單,自定義的話也比較方便。

下面簡(jiǎn)單說幾個(gè)應(yīng)用實(shí)例:

1.在之前做webcdn自動(dòng)化的時(shí)候,對(duì)squid的內(nèi)存分配做到按照服務(wù)器的內(nèi)存配置做自動(dòng)化的分配。

cache_mem<%=(memorysize.to_i/2*1024) %> MB

2.在做hadoop的mapred的slot控制時(shí),按照hadoop的mem做slot的分配

<property>
  <name>mapred.tasktracker.map.tasks.maximum</name>
  <value><% if memorysize.split(' ')[0].to_i <= 20 %><%=9%><% elsif memorysize.split(' ')[0].to_i > 30 %><%=14%><% end %>
   </value>
</property>
<property>
  <name>mapred.tasktracker.reduce.tasks.maximum</name>
  <value>
   <% if memorysize.split(' ')[0].to_i <= 20 %><%=5%>
   <% elsif memorysize.split(' ')[0].to_i > 30 %><%=9%><% end %>
   </value>
</property>
<property>
  <name>mapred.child.java.opts</name>
  <value><% if memorysize.split(' ')[0].to_i <= 20 %><%="-Xmx1024m -Xms1024m -Xmn256m -XX:SurvivorRatio=6 -XX:MaxPermSize=128m"%>
   <% elsif memorysize.split(' ')[0].to_i > 30 %><%="-Xmx1280m -Xms1280m -Xmn256m -XX:SurvivorRatio=6 -XX:MaxPermSize=128m"%><% end %>
   </value>
  <final>true</final>
</property

3.zabbix配置

因?yàn)槭褂昧薬ctive的模式,同時(shí)在自動(dòng)添加監(jiān)控的時(shí)候,通過zabbix_get來獲取hostname的信息,因此zabbix的配置中,主機(jī)名必須是fqdn的格式。

Hostname=<%=fqdn %>

4.一個(gè)關(guān)于fqdn取值的實(shí)例

在幫qa做puppet的時(shí)候,agent端報(bào)錯(cuò):

err: Could not retrieve catalog from remote server: Error 400 on SERVER: Failed to parse template zabbix/zabbix_agentd.conf.erb:
  Filepath: /usr/lib/ruby/site_ruby/1.8/puppet/parser/templatewrapper.rb
  Line: 67
  Detail: Could not find value for 'fqdn' at 1:/etc/puppet/templates/zabbix/zabbix_agentd_new.conf.erb
at /etc/puppet/modules/zabbix/manifests/new.pp:44 on node vlp-flume-111-25
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run


可以看到是由于fqdn 獲取問題導(dǎo)致。

1)查看獲取fqdn的相關(guān)代碼:
/usr/lib/ruby/site_ruby/1.8/facter/fqdn.rb

host = Facter.value(:hostname)
domain = Facter.value(:domain)
if host and domain
  [host, domain].join(".")


#先取出domain和host,然后做鏈接操作,如果一個(gè)為空,則返回nil

2)hostname的取值

/usr/lib/ruby/site_ruby/1.8/facter/hostname.rb

hostname = nil
if name = Facter::Util::Resolution.exec('hostname')
  if name =~ /(.*?)\./             
    hostname = $1
  else
    hostname = name
  end

#對(duì)hostname的執(zhí)行結(jié)果做正則處理

3)domain的取值

/usr/lib/ruby/site_ruby/1.8/facter/domain.rb

    hostname_command = 'hostname'
    can_do_hostname_f = Regexp.union /Linux/i, /FreeBSD/i, /Darwin/i
    hostname_command = 'hostname -f' if Facter.value(:kernel) =~ can_do_hostname_f
           
    if name = Facter::Util::Resolution.exec(hostname_command) \
      and name =~ /.*?\.(.+$)/
      return_value = $1          #取.之后的數(shù)據(jù)
    elsif domain = Facter::Util::Resolution.exec('dnsdomainname') \
      and domain =~ /.+/
      return_value = domain   #獲取dnsdomainname的數(shù)據(jù)
    elsif FileTest.exists?("/etc/resolv.conf")
      domain = nil
      search = nil
      File.open("/etc/resolv.conf") { |file|     #或者/etc/resolv.conf中domain|search的配置
        file.each { |line|
          if line =~ /^\s*domain\s+(\S+)/
            domain = $1
          elsif line =~ /^\s*search\s+(\S+)/
            search = $1
          end
        }
      }
      return_value ||= domain
      return_value ||= search
    end
    return_value = '' if return_value.nil?
    return_value.gsub(/\.$/, '')
  end
end

而這臺(tái)機(jī)器中,host只有主機(jī)名,沒有域名的設(shè)置,并且/etc/resolv.conf的數(shù)字為空,所以最終fqdn的值為空。

解決方法:規(guī)范主機(jī)名的格式。(因?yàn)閍ctive模式下要求hosts表中的host需要和zabbix配置一樣,如果是更改/etc/resolv.conf的話,可能會(huì)導(dǎo)致zabbix數(shù)據(jù)獲取不到值)

感謝各位的閱讀,以上就是“puppet的facter使用方法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)puppet的facter使用方法這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI