使用 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 模板插入口令到一个备份脚本。

操作步骤

  1. 使用下面的内容创建 /etc/puppet/modules/admin/templates/backup-mysql.sh 文件:

    #!/bin/sh
    /usr/bin/mysqldump -uroot -p&lt;%= mysql_password %&gt; --all-databases \
    | /bin/gzip &gt; /backup/mysql/all-databases.sql.gz
    
  2. 添加如下代码到你的配置清单:

    $mysql_password = "secret"
    file { "/usr/local/bin/backup-mysql":
        content =&gt; template("admin/backup-mysql.sh"),
        mode    =&gt; "755",
    }
    
  3. 运行 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
    
  4. 检查 Puppet 是否已经在模板中正确地插入了口令:

    # cat /usr/local/bin/backup-mysql
    
    #!/bin/sh
    /usr/bin/mysqldump -uroot -psecret --all-databases \
    | /bin/gzip &gt; /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]' %>

参见本书