【问题标题】:for-loop in ERB-Template for puppet causes syntax-errorPuppet 的 ERB 模板中的 for 循环导致语法错误
【发布时间】:2013-01-17 15:14:47
【问题描述】:

我正在尝试在 puppet 模板中的数组上包含一个 for 循环。 我一直在关注http://docs.puppetlabs.com/guides/templating.html 的信息,但在 puppet-client 上它没有说:

 Could not retrieve catalog from remote server: wrong header line format

据我所知,这与 ERB 解析问题有关。

erb 验证

#erb -P -x -T '-' /etc/puppet/modules/apache2/templates/site-config.erb  | ruby -c
-:22: syntax error, unexpected '.'
 ;  alias.each do |val|
         ^

欢迎提供任何线索。谢谢。

站点配置.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'" ) }
  }
 }
...

【问题讨论】:

    标签: ruby erb puppet


    【解决方案1】:

    唉,alias 是 Ruby 中的 syntactic keyword。您不能创建或引用名为 alias 的词法变量:

    pry(main)> alias = 1
    SyntaxError: unexpected '='
    alias = 1
           ^
    

    来自Puppet docs

    引用变量

    Puppet 将所有当前设置的变量(包括事实)传递给 评估模板时。有几种访问方式 这些变量:

    当前作用域中可见的所有变量都可以作为 Ruby 实例变量使用——即@fqdn、@memoryfree、 @operatingsystem 等。这种参考风格与 在 Puppet 清单中使用短(本地)变量名:@fqdn 是 完全等同于 $fqdn。

    当前作用域中可见的所有变量也可用作 Ruby 局部变量——即 fqdn、memoryfree、 操作系统等,没有前面的@符号。这种风格 当变量名发生冲突时,引用有时会导致问题 使用 Ruby 方法名称;通常最好使用@样式。

    所以,我认为您的解决方案是听从他们的建议,并始终使用实例变量形式 @alias 而不是词法变量形式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多