puppet 手册之使用generate导入动态信息以及导入csv文件
[导读]
本小节是接着上一章节,如何通过facter来获取节点信息,点我阅读, 本小节是
介绍如何使用generate来导入动态信息在Puppet中.以及如何在puppet 中导入
csv文件内容.不多说,一起来学习!
[正文]
使用generate导入动态信息
尽管系统管理员喜欢从自己的办公室里使用成堆的旧的打印机,他们有时需要与
其它部门进行信息交流与沟通.你如:你可能需要在你的代码里插入数据来自于外部
的源,generate功能非常有用并且能做到这点.
准备
1.在puppetmaster创建/usr/local/bin/latest-puppet.rb 脚本,
内容如下:
#!/usr/bin/ruby
require 'open-uri'
page = open("http://www.puppetlabs.com/misc/download-options/").
read
print page.match(/stable version is ([\d\.]*)/)[1]
怎么办呢…
1.在你的代码里添加如下内容:
$latestversion = generate("/usr/local/bin/latest-puppet.rb")
notify { "The latest stable Puppet version is ${latestversion}.
You're using ${puppetversion}.": }
2.运行puppet:
# puppet agent --test notice: The latest stable Puppet version is 2.6.7. You're using 2.6.4.
它是如何工作的…
generate函数是在puppetmaster上(不是puppet客户端)
来运行指定的脚本或者程序并返回结果,在这种情况下,将返回
最新的Puppet的版本号.
我不建议你在生产环境中运行此脚本,但是Puppet实验定有一种习惯
重新编排自己的网站,但你有此想法,任何脚本可以做到,打印,提取,
计算,例如:你可以使用generate在代码里,在数据库里查询结果.
这是值得记住的,就像在模板里调用使用嵌入式Ruby,generate
只能运行在puppetmaster上,而不是仅仅运行着Puppet服务的节点.
我曾经犯过一个错误在模板里调用/bin/hostname,结果让我大吃一惊
,我所有的puppet 节点名称均为puppet.
当你要获得指定节点的更多信息,最好是做个自定义的fact.
还有更多…
如果你需要在使用generate传递参数去执行,可以把参数作为额外的函数
参数调用:
$latestpuppet = generate("/usr/local/bin/latest-version.rb",
"puppet")
$latestmc = generate("/usr/local/bin/latest-version.rb",
"mcollective")
Puppet将会设法保护限制性的字符,禁止你使用generate恶意的SEHLL调用
因此,shell的管道符是禁止的,例如:最简单和最安全的事情的是把你逻辑写
成一个脚本里,然后调用此脚本.
—————————————————————————————
从CSV导入数据
当你需要在表中查找某些值,你可以使用冗长的case语句或者selectors.
但是一个整洁的方法是使用extlookup功能.在puppetmaster上可以查询
外部的CSV文件,并返回匹配的数据.
合并所有的单一文件组合成一个大文件和移动puppetmaster上的文件,
这样使Puppetmaster更易于维护,以及容易与其他人共享,一个开发团队
只要知道他们的应用就可以管理,例如:通过部署部分的release的
合适的CSV文件,puppet只需要知道在哪里可以找到文件,extlookup将会
做这些.
准备
1.创建 /var/www/apps/common.csv文件,内容如下:
path,/var/www/apps/%{name}
railsversion,3
domain,www.%{name}.com
2.创建/var/www/apps/myapp.csv文件,内容如下:
railsversion,2
怎么办呢…
1.添加以下内容到你的代码:
$extlookup_datadir = "/var/www/apps/"
$extlookup_precedence = [ "%{name}", "common" ]
class app( $name ) {
$railsversion = extlookup("railsversion")
$path = extlookup("path")
$domain = extlookup("domain")
notify { "App data: Path ${path}, Rails version
${railsversion}, domain ${domain}": }
}
class { "app": name => "myapp" }
2.运行puppet
# puppet agent --test info: Retrieving plugin info: Caching catalog for cookbook.bitfieldconsulting.com info: Applying configuration version '1303129760' notice: App data: Path /var/www/apps/myapp, Rails version 2, domain www.myapp.com notice: /Stage[main]/App/Notify[App data: Path /var/www/apps/ myapp, Rails version 2, domain www.myapp.com]/message: defined 'message' as 'App data: Path /var/www/apps/myapp, Rails version 2, domain www.myapp.com' notice: Finished catalog run in 0.58 seconds
它是如何工作的…
1.我们做的第一件事情就是定义$extlookup_datadir变量,它告诉extlookup在什么
目录下寻找数据文件.你通常会在site.pp里设置或者在任何其它地方定义全局变量.
$extlookup_datadir = "/var/www/apps/"
2.然后我们告诉extlookup哪里寻找数据文件,以及寻找的优先顺序:
$extlookup_precedence = [ "%{name}", "common" ]
这也可以是任意长度的数组,当我们使用extlookup查询时,Puppet会尝试扫描整
个文件直到查询到请求的值.文件名可以包含变量,在这个例子中,我们已经使用了
%{name},因此我们期望能找到我们设置的$name.当我们调用extlookup,Puppet
将会使用其值作为第一个文件名.
1.下一步,在app类里面,你们调用extlookup去得到一个变量值:
$railsversion = extlookup("railsversion")
现在看起来extlookup是机械的在CSV文件里读取数据.它会在$extlookup_datadir目录
(在本例中/var/www/apps)下寻找文件%{name}.csv(在本例中为myqpp.csv).因此
它从/var/www/apps/myapp.csv文件查找包含railsversion,2匹配行.
我们已经找到所需要的值(2),因此extlookup返回它的值.
1.接下来的extlookup调用不是那么的幸运.
$path = extlookup("path")
再次,extlookup首先在myapp.csv文件.但是它找不到匹配path的变量值,因此
extlookup会优先移向$extlookup_precedence文件去寻找,$extlooup_precedence是common.csv:
path,/var/www/apps/%{name}
railsversion,3
domain,www.%{name}.com
幸运的是,这样匹配了,因此Puppet会返回值/var/www/apps/%{name},在本例中值为
/var/www/apps/myapp.
你可以看到,这样我们可以在common.csv文件里设置一个默认值,common.csv文件里
可以为每个应用程序选择覆盖其自己的myapp.csv文件.extlookup将遍历$extlookup_precedence
文件直到查询到要求查询的值.由于myapp.csv在前面,其
的任何设置将优先覆盖common.csv里的设置.
还有更多…
你还可以在extlookup调用的时候使用默认值,如果在CSV文件里没有找到合适的值.
$path = extlookup("path", "/var/www/misc")
你也可以指定首先要查找csv文件,使用$extlookup_precedence定义.
$path = extlookup("path", "/var/www/misc", "paths")
这样会在paths.csv文件里查找数据,如果没有找到,将会在$extlookup_precedence
如平常一样查找数据.
你的CSV文件中的值也可以引出变量,正像我们所做的那样:
domain,www.%{name}.com
你可以在整个过程中使用任意变量 ,包括Facter探测出来的变量.
domain,%{fqdn}
R.I. Pienaar的文章”Complex data and Puppet” 是对extlookup一个很好的介绍.
地址为:http://www.devco.net/archives/2009/08/31/complex_data_and_puppet.php
Jordan Sissel 曾经写过关于使用extlookup配置你的整个基础设施:
http://sysadvent.blogspot.com/2010/12/day-12-scaling-operability-
with-truth.html
另请参阅:
导入动态信息
创建自定义facter变量.
[总结]
本小节的内容不少,大家慢慢消化,下一章节,我们将学习如何传递参数到shell命令.
原创文章,转载请注明: 文章地址puppet 手册之使用generate导入动态信息以及导入csv文件

Comments
One Response to “puppet 手册之使用generate导入动态信息以及导入csv文件”Trackbacks
Check out what others are saying about this post...[...] 本小节是接着上一章节puppet 手册之使用generate导入动态信息以及导入csv文件, [...]