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,如需转载请自行联系原作者
相关文章
|
Shell Perl
puppet连载16:搭建facter插件
mkdir -p /etc/puppet/modules/public/{manifests,templates,files} vi /puppet/soft/backup_date.
942 0
|
JSON 开发工具 数据格式
puppet 自定义facter
自定义fact可以让节点增加更多的标签 在使用puppet作为配置管理工具的同时,facter是一个非常有用的系统盘点工具,这个工具可以通过一些预先设定好变量定位一台主机,比如可以通过变量lsbdistrelease便可以知道当前系统的版本号,通过osfamily便可以知道系统是RedHat还是SLES,还是其它等等。
1380 0
|
测试技术
puppet 利用 facter, 实现不同主机调用不同变量方法
 分析¶ 变量类型常见三种 1. 内建变量, 如 $title, $name 等, 针对类固定的格式而进行调用 2. 自定义变量, 如 myname = tttttt, 等, 但需要在每个类中进行独立定义, 不能够在类之间进行传递, 3. facter , 公共变量, 可以在每个类中共同使用, 当前打算使用 facter 作为变量的调用 测试1.¶ 修改
1304 0
|
安全 Linux 网络协议
puppet yum模块、配置仓储、mount模块
转载:http://blog.51cto.com/ywzhou/1577335 作用:自动为客户端配置YUM源,为使用yum安装软件包提供便捷。 1、服务端配置yum模块 (1)模块清单 [root@puppet ~]# tree /etc/puppe...
1070 0
|
网络协议 安全 网络安全