木偶 - 模板


模板化是一种以标准格式获取内容的方法,可以在多个位置使用。在 Puppet 中,使用 erb 支持模板化和模板,erb 作为标准 Ruby 库的一部分提供,可以用于除 Ruby 之外的其他项目,例如 Ruby on Rails 项目。作为一种标准实践,需要对 Ruby 有基本的了解。当用户尝试管理模板文件的内容时,模板化非常有用。当配置无法通过内置 Puppet 类型进行管理时,模板将发挥关键作用。

评估模板

模板使用简单的函数进行评估。

$value = template ("testtemplate.erb")

可以指定模板的完整路径,也可以提取 Puppet 的 templatedir 中的所有模板,该模板通常位于 /var/puppet/templates。可以通过运行 puppet --configprint templatedir 来找到目录位置。

模板始终由解析器而不是客户端进行评估,这意味着如果使用 puppetmasterd,则模板只需位于服务器上,而无需将它们下载到客户端。使用模板和将文件的所有内容指定为字符串对于客户端的看法没有区别。这清楚地表明,puppetmasterd 在 puppet 启动阶段首先学习特定于客户端的变量。

使用模板

以下是为测试站点生成 tomcat 配置的示例。

define testingsite($cgidir, $tracdir) { 
   file { "testing-$name": 
   path => "/etc/tomcat/testing/$name.conf", 
   owner => superuser, 
   group => superuser, 
   mode => 644, 
   require => File[tomcatconf], 
   content => template("testsite.erb"), 
   notify => Service[tomcat] 
}  
   symlink { "testsym-$name": 
      path => "$cgidir/$name.cgi", 
      ensure => "/usr/share/test/cgi-bin/test.cgi" 
   } 
} 

以下是模板定义。

<Location "/cgi-bin/ <%= name %>.cgi"> 
   SetEnv TEST_ENV "/export/svn/test/<%= name %>" 
</Location>  

# You need something like this to authenticate users 
<Location "/cgi-bin/<%= name %>.cgi/login"> 
   AuthType Basic 
   AuthName "Test" 
   AuthUserFile /etc/tomcat/auth/svn 
   Require valid-user 
</Location>

这会将每个模板文件推送到一个单独的文件中,然后只需告诉 Apache 加载这些配置文件即可。

Include /etc/apache2/trac/[^.#]*

组合模板

使用以下命令可以轻松组合两个模板。

template('/path/to/template1','/path/to/template2')

模板中的迭代

Puppet 模板还支持数组迭代。如果正在访问的变量是一个数组,则可以对其进行迭代。

$values = [val1, val2, otherval]

我们可以有如下的模板。

<% values.each do |val| -%> 
Some stuff with <%= val %> 
<% end -%>

上述命令将产生以下结果。

Some stuff with val1 
Some stuff with val2 
Some stuff with otherval 

模板中的条件

erb模板支持条件以下构造是一种有条件地将内容放入文件的快速而简单的方法。

<% if broadcast != "NONE" %> broadcast <%= broadcast %> <% end %>

模板和变量

除了填写文件内容之外,还可以使用模板来填写变量。

testvariable = template('/var/puppet/template/testvar')

未定义的变量

如果需要在使用变量之前检查变量是否已定义,则可以使用以下命令。

<% if has_variable?("myvar") then %> 
myvar has <%= myvar %> value 
<% end %>

超出范围的变量

可以使用lookupvar函数显式查找超出范围的变量。

<%= scope.lookupvar('apache::user') %>

示例项目模板

<#Autogenerated by puppet. Do not edit. 
[default] 
#Default priority (lower value means higher priority) 
priority = <%= @priority %> 
#Different types of backup. Will be done in the same order as specified here. 
#Valid options: rdiff-backup, mysql, command 
backups = <% if @backup_rdiff %>rdiff-backup, 
<% end %><% if @backup_mysql %>mysql, 
<% end %><% if @backup_command %>command<% end %> 
<% if @backup_rdiff -%>  

[rdiff-backup]  

<% if @rdiff_global_exclude_file -%> 
   global-exclude-file = <%= @rdiff_global_exclude_file %> 
<% end -%> 
   <% if @rdiff_user -%> 
      user = <%= @rdiff_user %> 
<% end -%> 
<% if @rdiff_path -%> 
   path = <%= @rdiff_path %> 
<% end -%>  

#Optional extra parameters for rdiff-backup  

extra-parameters = <%= @rdiff_extra_parameters %>  

#How long backups are going to be kept 
keep = <%= @rdiff_keep %> 
<% end -%> 
<% if @backup_mysql -%>%= scope.lookupvar('apache::user') %>  

[mysql]  

#ssh user to connect for running the backup 
sshuser =  <%= @mysql_sshuser %>

#ssh private key to be used 
   sshkey = <%= @backup_home %>/<%= @mysql_sshkey %> 
   <% end -%> 
<% if @backup_command -%>  
[command] 

#Run a specific command on the backup server after the backup has finished  

command = <%= @command_to_execute %> 
<% end -%>