自定义fact可以让节点增加更多的标签

在使用puppet作为配置管理工具的同时,facter是一个非常有用的系统盘点工具,这个工具可以通过一些预先设定好变量定位一台主机,比如可以通过变量lsbdistrelease便可以知道当前系统的版本号,通过osfamily便可以知道系统是RedHat还是SLES,还是其它等等。但是这些预先设定好的变量毕竟有限,在整个自动化运维过程中,由于系统应用的多样性,更多需要通过应用的名称、角色的名称进行标示,这样就需要自定义一些fact并赋值到每个节点上去,相当于给节点打上标签。

一、自定义(custom)fact的四种方法

1、定义到facter软件本身的lib库中

这种方法是直接在安装facter的lib库里面直接创建,相当于扩充facter软件的lib库。

可以通过以下方法找到facter包的lib库路径为/usr/lib/ruby/site_ruby/1.8/facter

[root@agent1 facter]# rpm -ql facter
/usr/bin/facter
/usr/lib/ruby/site_ruby/1.8/facter
/usr/lib/ruby/site_ruby/1.8/facter.rb
/usr/lib/ruby/site_ruby/1.8/facter/Cfkey.rb
/usr/lib/ruby/site_ruby/1.8/facter/application.rb
/usr/lib/ruby/site_ruby/1.8/facter/architecture.rb
/usr/lib/ruby/site_ruby/1.8/facter/augeasversion.rb
/usr/lib/ruby/site_ruby/1.8/facter/blockdevices.rb
/usr/lib/ruby/site_ruby/1.8/facter/domain.rb
/usr/lib/ruby/site_ruby/1.8/facter/ec2.rb
/usr/lib/ruby/site_ruby/1.8/facter/facterversion.rb
/usr/lib/ruby/site_ruby/1.8/facter/filesystems.rb
/usr/lib/ruby/site_ruby/1.8/facter/fqdn.rb
/usr/lib/ruby/site_ruby/1.8/facter/hardwareisa.rb
/usr/lib/ruby/site_ruby/1.8/facter/hardwaremodel.rb

1.1、在facter的lib库中创建fact,名称为rpms,可以显示当前安装了多少rpm包

[root@agent1 ~]# cd /usr/lib/ruby/site_ruby/1.8/facter/
[root@agent1 facter]# vim rpms.rb
Facter.add(:rpms) dosetcode do%x{/bin/rpm -qa | wc -l}.chomp  #定义一个shell命令end
end

1.2、通过facter命令进行测试

[root@agent1 facter]# facter | grep rpms
rpms => 918
[root@agent1 facter]# facter  rpms
918

备注:这种方法相当于给facter软件打补丁,过多的使用可能会破坏facter本身软件的完整性,不建议使用。

2、使用环境变量‘FACTERLIB’创建fact

这种方法也非常简单,在一个目录下定义一个fact,然后export即可,方法如下

2.1、在自定义目录里面定义一个fact,列出当前系统登录的用户数

[root@agent1 ~]# vim /var/lib/puppet/kiss_fact/users.rb
Facter.add(:users) dosetcode do%x{/usr/bin/who |wc -l}.chompend
end
[root@agent1 kiss_fact]# facter users #无显示结果,需要设置FACTERLIB
[root@agent1 kiss_fact]#

2.2、将自定义fact路径赋值给变量FACTERLIB

[root@agent1 kiss_fact]# export FACTERLIB=/var/lib/puppet/kiss_fact
[root@agent1 kiss_fact]# facter users
2
[root@agent1 kiss_fact]# facter | grep users
users => 2

备注:这种方法是对第一种方法的扩展,可以自己定义目录,不过需要将路径加到变量FACTERLIB中,可以在/etc/profile添加,这样系统启动的时候便可以自动加载。

3、添加外部的(external)fact

这种方式支持txt、yaml、json、sh四种格式,内容也比较固定,默认情况下需要在目录/etc/facter/facts.d/下创建,使用也非常方便。关于这个路径其实是可以修改的,不过修改起来并不是很方便,需要修改facter软件代码。

[root@agent1 ~]# vim /usr/lib/ruby/site_ruby/1.8/facter/util/config.rb32   def self.external_facts_dirs33     if Facter::Util::Root.root?34       windows_dir = windows_data_dir35       if windows_dir.nil? then36         ["/etc/facter/facts.d", "/etc/puppetlabs/facter/facts.d"]  #external路径位置37       else38         [File.join(windows_dir, 'PuppetLabs', 'facter', 'facts.d')]39       end40     else41       [File.expand_path(File.join("~", ".facter", "facts.d"))]42     end43   end

特殊说明:只能用于1.7.3版本以上

3.1、通过txt文件创建

3.1.1、创建roles.txt文件

文件内容格式必须为“key=value”

[root@agent1 ~]# mkdir /etc/facter/facts.d -p
[root@agent1 facts.d]# vim roles.txt
web=http
db=mysql

3.1.2、测试

[root@agent1 facts.d]# facter web1
http1
[root@agent1 facts.d]# facter db1
mysql1
[root@agent1 facts.d]# facter | egrep 'web1|db1'
db1 => mysql1
web1 => http1

3.2、通过yaml文件创建

3.2.1、创建yaml文件

[root@agent1 facts.d]# vim roles.yaml
---
web2:- http2
db2:- mysql2

3.2.2、测试

[root@agent1 facts.d]# facter | egrep 'web2|db2'
db2 => mysql2
web2 => http2

3.3、通过json文件创建

3.3.1、创建json文件

[root@agent1 facts.d]# vim roles.json
{"web3": "http3","db3": "mysql3"
}

备注:提供一个在线编辑json的网站http://www.bejson.com/go.html?u=http://www.bejson.com/jsonview2/

3.3.2、安装rubygem-json包(json文件需要它的支持)

[root@agent1 facts.d]# facter | egrep 'web3|db3'
Cannot parse JSON data file /etc/facter/facts.d/roles.json without the json library.
Suggested next step is `gem install json` to install the json library. #缺少json包
[root@agent1 facts.d]# rpm -ivh rubygem-json-1.5.5-2.el5.x86_64.rpm #安装rubygem-json包,找不到安装包的同志可在群共享里面查找,群号码在文章最后面。

3.3.3、测试

[root@agent1 facts.d]# facter | egrep 'web3|db3'
db3 => mysql3
web3 => http3

3.4、通过sh脚本创建

3.4.1、创建shell脚本

[root@agent1 facts.d]# vim roles.sh
#!/bin/bash
echo "web4=http4"
echo "db4=mysql4"

3.4.2、设置文件具有可执行权限

[root@agent1 facts.d]# chmod a+x roles.sh

3.4.3、测试

[root@agent1 facts.d]# facter web4 db4
db4 => mysql4
web4 => http4

思考:那么如何做到所有节点批量部署呢,可以看到以上四种方式都是基于文件编辑的,可在puppetmaster端通过file资源实现部署。

4、使用pluginsync进行发布

这种方法比较特殊,节点factpath目录里除了编写好的rb文件之外,还需要在puppet模块中引用,运行一次之后才会转换成fact。通常在puppetmaster端模块里的lib库中添加,然后在puppet.conf中添加选项pluginsync=true即可,格式为ruby文件。

4.1、创建模块facts

[root@puppetmaster ~]# cd /etc/puppet/environments/kissprd/environment/modules/
[root@puppetmaster modules]# tree facts/  #目录结构
facts/
└── lib└── facter└── hwclock.rb
2 directories, 1 file

备注:也可以放在其他已经编写好的模块中

[root@puppetmaster facter]# vim hwclock.rb  #自定义fact:hwclock,显示节点硬件时间
Facter.add(:hwclock) dosetcode do%x{/usr/sbin/hwclock}.chompend
end

4.2、应用自定义fact至motd模块中

[root@puppetmaster kissprd]# vim application/modules/motd/manifests/init.pp
class motd{package{ 'setup':ensure => present,}file{ '/etc/motd':ensure  => present,owner   => 'root',group   => 'root',mode    => '0644',source  => "puppet://$puppetserver/modules/motd/etc/motd",require => Package['setup'],}notify { " Hardware-Clock: ${::hwclock}": } #添加一个通知,这里只是测试,没有实际意义
}

4.3、在puppetmaster端的puppet.conf中添加选项pluginsync

[root@puppetmaster kissprd]# vim /etc/puppet/puppet.conf
[main]logdir = /var/log/puppetrundir = /var/run/puppetssldir = $vardir/sslpluginsync = true    #添加插件选项
...

4.4、在所有节点puppet.conf中添加pluginsync(通过在puppet模块中添加实现)

[root@puppetmaster kissprd]# vim environment/modules/puppet/templates/puppet.conf.erb
### config by  puppet ###
[main]logdir = /var/log/puppetrundir = /var/run/puppetssldir = $vardir/sslpluginsync = true  #添加插件选项
[agent]classfile = $vardir/classes.txtlocalconfig = $vardir/localconfigserver = <%= scope.lookupvar('puppet::params::puppetserver') %>certname = <%= scope.lookupvar('puppet::params::certname') %>

4.5、节点运行puppet agent进行测试

[root@agent1 ~]# facter -p hwclock  #没有这个fact,自定义fact需要加上-p参数才能显示
[root@agent1 ~]# puppet agent -t --environment=kissprd  #运行一次
info: Retrieving plugin
notice: /File[/var/lib/puppet/lib/facter/historys.rb]/ensure: removed
notice: /File[/var/lib/puppet/lib/facter/hwclock.rb]/ensure: defined content as '{md5}d8cc9fe2b349a06f087692763c878e28'
info: Loading downloaded plugin /var/lib/puppet/lib/facter/hwclock.rb  #下载插件至节点factpath指定的目录
info: Loading facts in /var/lib/puppet/lib/facter/hwclock.rb
info: Caching catalog for agent1_cert.kisspuppet.com
info: Applying configuration version '1396170375'
notice:  Hardware-Clock: Sun 30 Mar 2014 05:06:16 PM CST  -0.055086 seconds
notice: /Stage[main]/Motd/Notify[ Hardware-Clock: Sun 30 Mar 2014 05:06:16 PM CST  -0.055086 seconds]/message: defined 'message' as ' Hardware-Clock: Sun 30 Mar 2014 05:06:16 PM CST  -0.055086 seconds' #应用
notice: Finished catalog run in 0.51 seconds
[root@agent1 ~]# facter -p  hwclock #自定义的hwclock生效
hwclock => Sun 30 Mar 2014 05:06:25 PM CST  -0.567090 seconds
[root@agent1 ~]# ll /var/lib/puppet/lib/facter/  #插件已经下载到本地
total 4
-rw-r--r-- 1 root root 79 Mar 30 17:06 hwclock.rb

关于factpath默认路径可通过以下命令查看,当然也可以在puppet.conf中进行修改

[root@agent1 ~]# puppet --genconfig | grep factpathfactpath = /var/lib/puppet/lib/facter:/var/lib/puppet/facts

puppet 自定义facter相关推荐

  1. Puppet扩展篇1-自定义fact结合ENC(hirea)的应用实践

    零基础学习Puppet自动化配置管理系列文档 在大量节点加入Puppet之后,你至少会面临两个比较大的问题: 1.由于节点数的增多,site.pp文件必然会编写更多的节点条目,以及节点包含的类.假设你 ...

  2. 客户端安装服务器的路径查找文件,柴少鹏的官方网站-puppet系列(一)之puppet的部署、配置文件以及命令详解...

    一.puppet的介绍(文字解释部分参考了权威指南) 作为自动化运维管理老大哥级别的软件,这个词大家都很熟悉了,我也就不阐述什么发展史啊,跟其他工具的对比了.不过有一点是要注意的,puppet分为社区 ...

  3. 自动化配置和部署工具--puppet(1)--什么是puppet

    参考网站:http://blog.chinaunix.net/uid-24250828-id-3882898.html http://369369.blog.51cto.com/319630/7858 ...

  4. puppet结构图一例

    之前搞puppet的时候画过的图,贴出来一起讨论下.. 结构说明: 1.user更改/apps/puppet_edit下的相关文件,并执行svn commit ,触发hook,更新/etc/puppe ...

  5. Puppet 的部署与应用,看这一篇就够了

    工作原理 Puppet的目的是让管理员只集中于要管理的目标,而忽略实现的细节.Puppet既可以在单机上使用,也可以c/s使用,在大规模使用puppet的情况下,通常使用c/s结构,在这种结构中pup ...

  6. 庖丁解Puppet之操作记实

    庖丁解Puppet之 初级入门篇 系统环境: 软件包: 环境安装: Puppet 是用ruby语言写的,所以要安装ruby环境,服务器端与客户端都要安装,我这的环境没有装ruby,所以用yum安装一下 ...

  7. 第二十二周微职位puppet

    描述puppet的工作原理,部署一套puppet系统. puppet的工作原理: Puppet的目录是让管理员只集中于要管理的目标,而忽略实现的细节.Puppet即可以运行在单机上,也可以以C/S结构 ...

  8. puppet插件fact和hiera(puppet自动化系列3)

    四.Fact插件 4.1 使用pluginsync进行发布 这种方法比较特殊,节点factpath目录里除了编写好的rb文件之外,还需要在puppet模块中引用,运行一次之后才会转换成fact.通常在 ...

  9. puppet自动化运维工具安装配置

    转自:http://369369.blog.51cto.com/319630/785895/ 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.h ...

最新文章

  1. TestLink1.9.3测试用例:Excel转换XML工具一
  2. web开发流程 - 网上商城示例
  3. mysql数据库优化课程---16、mysql慢查询和优化表空间
  4. [转]Linux配置防火墙
  5. 远程计算机串口控制软件,智能控制的设备上使用远程开关需要用到RS485串口继电器、网关、电脑平台...
  6. sql2000导出mysql_如何将sql2000的数据库导入到mysql中?
  7. 获取js里添加的css文件,用JS添加一个css文件
  8. C语言无缘无故提示缺少分号:missing ';' before identifier '...'
  9. windows7 系统盘 瘦身软件介绍: 冗余文件清理工具
  10. 【SqlServer】不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的表进行了更改或者启用了“阻止保存要求重新创建表的更改”选项
  11. 小说取名软件(附带截图)分享与介绍
  12. 写论文引用参考文献详细教程
  13. 杂谈随想第002篇:博客访问量破万的想法
  14. 英语八大句子成分之一 - 状语
  15. 教你实现微信8.0『炸裂』的表情特效
  16. 划线高亮和插入笔记的技术实现
  17. 正交变换(傅里叶变换、Z变换)
  18. Django之爱鲜蜂项目开发 day02 (一)
  19. pycharm更改黑色主题
  20. Android点击按键改变按键背景图片-选择器

热门文章

  1. 【NOIP2016】组合数问题
  2. JDK源码分析-Integer
  3. linux两个文件修改主机名
  4. SQL SERVER 查看并结束某个进程
  5. UISegmentedControl 分段器加载不同的viewcontroller
  6. Oracle会话和进程数的监控
  7. 无线网***工具进攻方法及防范技巧
  8. elasticsearch系列(七)java定义score
  9. 打印html5中Canvas的方法
  10. c#操作Word文件 导出数据到word文档 (table 书签方式)