导入动态信息

尽管有些系统管理员喜欢将他们自己与其它使用成堆的老旧打印机的办公室相隔绝, 但是我们还是需要随时与其他部门交换信息。 例如,你可能需要插入数据到你的 Puppet 配置清单,这些数据是从外部数据源派生出来的。 generate 函数在这方面相当有用。

准备工作

在 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.5\. You're using 2.6.3.
    

工作原理

generate 函数在 Puppetmaster 上(不是客户端)运行指定的脚本或程序并返回结果, 在本例中,返回的结果是 Puppet 最近发布的稳定版的版本号。

我不建议你在生产环境中运行此脚本,因为 Puppet Labs 会随时重新组织其 Web 站点, 这会导致脚本中抓取的 URL 失效,但是你可以从中获得些启发和想法。 一个脚本可以做的一切,比如打印、提取或者计算(例如数据库的查询结果) 都可以使用 generate 将其带入你的配置清单。

值得记住的是:正如在模板中嵌入 Ruby 调用一样,generate 函数运行在 Puppetmaster 上,而不是运行在 Puppet 的客户端节点上。 我曾经犯过一个在模板中调用 /bin/hostname 的错误, 结果让我大吃一惊的是,所有的节点名称都变成了 puppet。

当你需要获得有关节点的特别信息时,最好使用一个自定义的 fact 来实现。

更多用法

如果你在调用 generate 时需要为其传递参数去执行, 可以将这些参数作为函数调用的额外参数,例如:

$latestpuppet = generate("/usr/local/bin/latest-version.rb", "puppet")
$latestmc = generate("/usr/local/bin/latest-version.rb", "mcollective")

你还可以使用 generate 调用 Shell 命令,Puppet 的 generate 使用限制特殊字符的方式来避免恶意的 Shell 调用,例如不能使用 Shell 的管道符(|)。 最简单而安全的办法就是将你所有的逻辑写到一个脚本中,然后使用 generate 调用此脚本。

参见本书