我在 Puppet 中有以下类和定义:
$certDirectory = "/var/lib/ssl/certs"
class openssl {
package { "openssl":
ensure => latest
}
file { "openssl":
path => "/var/lib/ssl",
ensure => directory,
mode => 0644
}
file { "openssl-certs":
path => "/var/lib/ssl/certs",
ensure => directory,
mode => 0644
}
define cert($ensure = present) {
$certfile = "${certDirectory}/${name}.cert"
$keyfile = "${certDirectory}/${name}.key"
$pemfile = "${certDirectory}/${name}.pem"
file { "${name}.cert":
path => $certfile,
source => "puppet:///openssl/${name}.cert",
mode => 0640,
ensure => $ensure,
}
file { "${name}.key":
path => $keyfile,
source => "puppet:///openssl/${name}.key",
mode => 0640,
ensure => $ensure,
}
}
}
我稍后(在节点中)使用这个 openssl::cert 定义将证书传递给 apache vhost 配置:
openssl::cert { "rri":
ensure=>present
}
apache2::site-config { "default":
ip => "*",
order => "000",
docroot => '/home/support/public_html',
cert => Openssl::Cert["rri"]
}
在 apache2::site-config 内部定义:
file { "site-config-$name":
path => "/etc/apache2/sites-available/$name",
owner => root,
group => root,
mode => 0644,
content => template($template),
notify => Exec["reload-apache2"],
}
我遇到的问题是 - 如何从位于 $template 的 .erb 文件中的 cert 变量引用$certfile
/ ?$keyfile
我也很想知道我是否也以错误的方式处理了这个问题——这是我第一次尝试使用 puppet 设置任何东西,只是试着玩弄我能做的事情。
已更新 - 现已半工作 根据 freiheit 的回答 - 我对我的 apache2::site-config 做了一些更改
define site-config (
$ensure = 'present',
$template = 'apache2/vhost.erb',
$docroot,
$ip='*',
$order='000',
$logs = "",
$cert = false) {
if $cert {
File["site-config-$name"] { require=>Openssl::Cert[$cert] }
$certfile = "${openssl::certDirectory}/${cert}.cert"
$keyfile = "${openssl::certDirectory}/${cert}.key"
}
file { "site-config-$name":
path => "/etc/apache2/sites-available/$name",
owner => root,
group => root,
mode => 0644,
content => template($template),
notify => Exec["reload-apache2"],
}
然后在 .erb 中
SSLCertificateFile <%= certfile %>
SSLCertificateKeyFile <%= keyfile %>
这似乎效果很好 - 我只是希望,如果我在某个时候更改证书命名约定,我将能够从对 Openssl::Cert 资源的引用中访问实际文件名。仍然想知道是否有办法做到这一点。
答案1
$template.erb 中的内容如下:
<VirtualHost <%= ip %>:443>
Document Root <%= docroot %>
SSLCertificateFile <%= cert %>
# ...
</VirtualHost>
也就是说,puppet 中的任何变量都可以作为隐藏在 .erb 文件中的 ruby 位中的局部变量使用。
不确定为什么使用“$template”而不是命名的 .erb 文件(没有看到任何地方设置 $template,但愿意假设它隐藏在某个地方)
这似乎是错误的:cert => Openssl::Cert["rri"]
。我期望更多像这样:
openssl::cert { "rri": }
然后 .erb 会更像这样:
<VirtualHost <%= ip %>:443>
Document Root <%= docroot %>
SSLCertificateFile <%= certDirectory %>/<%= name %>
# ...
</VirtualHost>