傀儡 erb 动态内容

puppet erb dynamic content

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

谁能告诉我哪里出了问题?

评论中提示的 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 清单中,那就更好了。

最后,您确实需要修复缩进,因为它很难阅读。