使用 ERB 模板
模板(template)是一种高级别的文本文件。它可以做计算、执行 Ruby 代码或者引用你在 Puppet 配置清单中定义的变量值。能被 Puppet 部署的任何一个文本文件,你都可以使用模板来代替。 最简单的情况,一个模板可以仅是一个静态文本文件。更有用的情况是,你可以使用 ERB (嵌入式 Ruby)语法在模板中插入变量。例如:
<%= name %>, this is a very large drink.
如果模板使用了变量 $name,其值为 Zaphod Beeblebrox,模板将解析为:
Zaphod Beeblebrox, this is a very large drink.
这种简单的技术非常有用,一种情形是要生成一批文件且它们仅有一两个变量的值不同 (例如虚拟主机的配置文件);另一种情形是要向一个脚本中插入值(例如数据库名或口令)。 在下面的例子中,我们将使用一个 ERB 模板插入口令到一个备份脚本。
操作步骤
使用下面的内容创建 /etc/puppet/modules/admin/templates/backup-mysql.sh 文件:
#!/bin/sh /usr/bin/mysqldump -uroot -p<%= mysql_password %> --all-databases \ | /bin/gzip > /backup/mysql/all-databases.sql.gz
添加如下代码到你的配置清单:
$mysql_password = "secret" file { "/usr/local/bin/backup-mysql": content => template("admin/backup-mysql.sh"), mode => "755", }
运行 Puppet:
# puppet agent --test info: Retrieving plugin info: Caching catalog for cookbook.bitfieldconsulting.com info: Applying configuration version '1308670971' notice: /Stage[main]//Node[cookbook]/File[/usr/local/bin/backupmysql]/ ensure: defined content as '{md5}5853b6d4dd72420e341fa7ecb8 91ad43' notice: Finished catalog run in 0.96 seconds
检查 Puppet 是否已经在模板中正确地插入了口令:
# cat /usr/local/bin/backup-mysql
#!/bin/sh /usr/bin/mysqldump -uroot -psecret --all-databases \ | /bin/gzip > /backup/mysql/all-databases.sql.gz
工作原理
在模板中,无论在哪里引用了变量(例如 <%= mysql_password %>), Puppet 都会使用相应的值(例如 secret)替换它。
更多用法
在本例中,我们仅在模板中使用了一个变量,但是只要你需要可以引用许多变量。 它们也可以是对 facts 的引用,例如:
ServerName <%= fqdn %>
或者使用 Ruby 表达式,例如:
MAILTO=<%= emails.join(',') %>
或者你要使用的任何 Ruby 代码,例如:
ServerAdmin <%= sitedomain == 'coldcomfort.com' ? '[email protected]'
: '[email protected]' %>
参见本书
- 本章的 在模板中遍历数组 一节