puppet的facter使用几例

在puppet中有一个很重要的组件template,配合facter模块可以实现按需配置的功能。

facter可以看做是在client端用来收集信息的一个功能组件。其代码目录可以通过
facter |grep dir
rubysitedir => /usr/lib/ruby/site_ruby/1.8  
查看(rb文件),每一个变量对应一个rb文件,rb文件的结构也比较简单,自定义的话也比较方便。

下面简单说几个应用实例:
1.在之前做webcdn自动化的时候,对squid的内存分配做到按照服务器的内存配置做自动化的分配。
cache_mem<%=(memorysize.to_i/2*1024) %> MB

2.在做hadoop的mapred的slot控制时,按照hadoop的mem做slot的分配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
< 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配置
因为使用了active的模式,同时在自动添加监控的时候,通过zabbix_get来获取hostname的信息,因此zabbix的配置中,主机名必须是fqdn的格式。

Hostname=<%=fqdn %>


4.一个关于fqdn取值的实例

在帮qa做puppet的时候,agent端报错:
1
2
3
4
5
6
7
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 获取问题导致。

1)查看获取fqdn的相关代码:
/usr/lib/ruby/site_ruby/1.8/facter/fqdn.rb

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

#先取出domain和host,然后做链接操作,如果一个为空,则返回nil

2)hostname的取值
/usr/lib/ruby/site_ruby/1.8/facter/hostname.rb
1
2
3
4
5
6
7
hostname =  nil
if  name = Facter::Util::Resolution.exec( 'hostname' )
   if  name =~ /(.*?)\./            
     hostname =  $1
   else
     hostname = name
   end
#对hostname的执行结果做正则处理

3)domain的取值

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
     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           #取.之后的数据
     elsif  domain = Facter::Util::Resolution.exec( 'dnsdomainname' ) \
       and  domain =~ /.+/
       return_value = domain    #获取dnsdomainname的数据
     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
而这台机器中,host只有主机名,没有域名的设置,并且/etc/resolv.conf的数字为空,所以最终fqdn的值为空。

解决方法:规范主机名的格式。(因为active模式下要求hosts表中的host需要和zabbix配置一样,如果是更改/etc/resolv.conf的话,可能会导致zabbix数据获取不到值)

本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1355027,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值