我正在尝试在puppet模板中的数组中包含一个for循环。 我一直在关注http://docs.puppetlabs.com/guides/templating.html的信息,但是在木偶客户端上它没有说:
Could not retrieve catalog from remote server: wrong header line format
据我所知,它与ERB解析问题有关。
erb-verification
#erb -P -x -T '-' /etc/puppet/modules/apache2/templates/site-config.erb | ruby -c
-:22: syntax error, unexpected '.'
; alias.each do |val|
^
任何线索都欢迎。感谢。
站点config.erb:
# Virtual Host <%= name %>
NameVirtualHost <%= listen_config %>
<VirtualHost <%= listen_config %>>
## allgemeine Einstellungen wie für HTTP-<VirtualHost>
ServerAdmin <%= admin_mail %>
ServerName <%= server_name %>
DocumentRoot <%= document_root %>
CustomLog <%= custom_log %>
ErrorLog <%= error_log %>
# Let Apache httpd serve static web application content
<% alias.each do |val| -%>
Alias <%= val %>
<% end -%>
...
init.pp:
...
define site (
$ensure = 'present',
$listen_config = "*:80",
$admin_mail = "nobody@example.com",
$server_name = "example.local",
$document_root = "/var/www/",
$custom_log = "/var/log/apache2/$name.log combined",
$error_log = "/var/log/apache2/error_$name.log",
$alias = [],
$tomcat ="false",
$jk_logfile ="/var/log/apache2/jk_$name.log",
$jk_mount =["/$name worker1", "/$name/* worker1"],
$jk_unmount = [],
$tls = "false",
$tls_priorities = "",
$tls_certificate = "/etc/ssl/certs/apache2_$name.crt",
$tls_key ="/etc/ssl/certs/apache2_$name.key,
) {
case $ensure {
'present' : {
file { "/etc/apache2/sites-available/$name":
owner => root,
group => root,
mode => 644,
content => template("site-config.erb"),
}
exec { "/usr/sbin/a2ensite $name":
unless => "/bin/readlink -e ${apache2_sites}-enabled/$name",
notify => Exec["reload-apache2"],
}
}
'absent' : {
exec { "/usr/sbin/a2dissite $name":
onlyif => "/bin/readlink -e ${apache2_sites}-enabled/$name",
notify => Exec["reload-apache2"],
require => Package["apache2"],
}
}
default: { err ( "Unknown ensure value: '$ensure'" ) }
}
}
...
答案 0 :(得分:2)
唉,alias
是Ruby中的syntactic keyword。您不能创建或引用名为alias
的词法变量:
pry(main)> alias = 1
SyntaxError: unexpected '='
alias = 1
^
引用变量
Puppet将所有当前设置的变量(包括事实)传递给 评估模板时。有几种方法可以访问 这些变量:
当前作用域中可见的所有变量都可用作Ruby实例变量 - 即@fqdn,@ memoryfree, @operatingsystem等。这种引用方式与...相同 在Puppet清单中使用短(本地)变量名:@fqdn是 完全等同于$ fqdn。
当前作用域中可见的所有变量也可用作Ruby局部变量 - 即fqdn,memoryfree, 操作系统等,没有前置的@符号。这种风格 当变量名称冲突时,引用有时会导致问题 使用Ruby方法名称;使用@ style通常会更好。
因此,我认为您的解决方案是遵循他们的建议并始终使用实例变量形式@alias
而不是词法变量形式。