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命令.

 

One thought on “puppet 手册之使用generate导入动态信息以及导入csv文件

  1. Pingback: puppet手册之传递参数到shell命令 | MySQLOPS 数据库与运维自动化技术分享

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>