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
有人可以启发我怎么了吗?
答案 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清单中,还是更好。
最后,您确实需要修正缩进,因为很难掌握它。