在puppet中有一个很重要的组件template,配合facter模块可以实现按需配置的功能。
#先取出domain和host,然后做链接操作,如果一个为空,则返回nil
2)hostname的取值
#对hostname的执行结果做正则处理
3)domain的取值
而这台机器中,host只有主机名,没有域名的设置,并且/etc/resolv.conf的数字为空,所以最终fqdn的值为空。
facter可以看做是在client端用来收集信息的一个功能组件。其代码目录可以通过
facter |grep dir
rubysitedir => /usr/lib/ruby/site_ruby/1.8
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端报错:
可以看到是由于fqdn 获取问题导致。
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
/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
|
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
|
解决方法:规范主机名的格式。(因为active模式下要求hosts表中的host需要和zabbix配置一样,如果是更改/etc/resolv.conf的话,可能会导致zabbix数据获取不到值)
本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1355027,如需转载请自行联系原作者