Puppet - 模板



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

评估模板

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

$value = template ("testtemplate.erb")

可以指定模板的完整路径,也可以提取 Puppet 的 templatedir 中的所有模板,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 -%>
广告