人偶 – 模板
人偶 – 模板
模板化是一种以标准格式获取事物的方法,可以在多个位置使用。在 Puppet 中,使用 erb 支持模板和模板,它作为标准 Ruby 库的一部分提供,可以在 Ruby 之外的其他项目中使用,例如在 Ruby on Rails 项目中。作为一种标准做法,需要对 Ruby 有基本的了解。当用户尝试管理模板文件的内容时,模板化非常有用。当配置无法由内置 Puppet 类型管理时,模板起着关键作用。
评估模板
使用简单的函数评估模板。
$value = template ("testtemplate.erb")
可以指定模板的完整路径,也可以拉取 Puppet 的模板目录中的所有模板,该目录通常位于 /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 -%>