使用 ERB 模板

优质
小牛编辑
134浏览
2023-12-01

模板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<%= mysql_password %> --all-databases \
    | /bin/gzip > /backup/mysql/all-databases.sql.gz
    
  2. 添加如下代码到你的配置清单:

    $mysql_password = "secret"
    file { "/usr/local/bin/backup-mysql":
      content => template("admin/backup-mysql.sh"),
      mode  => "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 > /backup/mysql/all-databases.sql.gz
    

工作原理

在模板中,无论在哪里引用了变量(例如 <%= mysql_password %>), Puppet 都会使用相应的值(例如 secret)替换它。

更多用法

在本例中,我们仅在模板中使用了一个变量,但是只要你需要可以引用许多变量。 它们也可以是对 facts 的引用,例如:

ServerName <%= fqdn %>

或者使用 Ruby 表达式,例如:

MAILTO=<%= emails.join(',') %>

或者你要使用的任何 Ruby 代码,例如:

ServerAdmin <%= sitedomain == 'coldcomfort.com' ? 'seth@coldcomfort.com'
 : 'flora@poste.com' %>

参见本书