木偶erb动态内容

时间:2019-01-07 19:02:57

标签: ruby puppet erb

site.pp

class httpd_conf_files ($repos) {
    ensure_packages(['httpd'], {'ensure' => 'present'})
    $repos.each |String $repo| {
    file {"/etc/httpd/conf.d/${repo}_repo1.conf":
                                  ensure  => file,
                                  mode    => '0644',
                                      content => template('deploy/repos.erb'),
          }
      }
}

nodes.pp

node 'repo-web-c010' {
                  class { httpd_conf_files:
                           repos => ['centos','ubuntu'],
                  }
}

但是,centos_repo1.conf和ubuntu_repo1.conf这两个文件具有相同的内容。

repos.erb

    <% @repos.each do |rep|
    if rep == "centos"
        $x      = "/opt/repos/yum/"+rep
                 $_repo  = rep
         else
                 $x      = "/opt/repos/"+rep
                 $_repo  = rep
         end

    end -%>
    Alias /<%=$_repo%> <%=$x%>
    DocumentRoot  <%=$x%>
    IndexOptions NameWidth=* +SuppressDescription
    <Directory <%=$x%>>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog logs/<%=$_repo%>_repo1_error.log
    LogLevel warn

    CustomLog logs/<%=$_repo%>_repo1_access.log combined

有人可以启发我怎么了吗?

1 个答案:

答案 0 :(得分:1)

注释中提示,您的ERB模板中的逻辑无效。

因为您遍历@repos数组并在每次迭代中设置$x$_repo,所以这些变量总是从该循环的最后一次迭代中获取其值。这就是为什么您总是总是获得相同的生成内容的原因。

模板可以更改为此:

<% if @repo == "centos"
     x = "/opt/repos/yum/" + @repo
     _repo = @repo
   else
     x = "/opt/repos/" + @repo
     _repo = @repo
   end -%>
Alias /<%= _repo %> <%= x %>
DocumentRoot  <%= x %>
IndexOptions NameWidth=* +SuppressDescription
<Directory <%= x %>>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

ErrorLog logs/<%= _repo %>_repo1_error.log
LogLevel warn

CustomLog logs/<%= _repo %>_repo1_access.log combined

请注意,我也更改了变量$x$_repo,因为美元符号表示Ruby中的全局变量,而全局变量可能不是您想要的。

如果将条件逻辑从ERB模板移到Puppet清单中,还是更好。

最后,您确实需要修正缩进,因为很难掌握它。