У меня есть следующий класс и определение в марионетке:
$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"],
}
У меня вопрос - как я могу сослаться на $certfile
/ $keyfile
из переменной сертификата в файле .erb, расположенном по адресу $ template?
Мне также было бы очень интересно узнать, не подхожу ли я к этому неправильно - это мой первый раз, когда я пытаюсь настроить что-либо с помощью марионетки и просто пытаюсь поиграть с тем, что я могу сделать.
ОБНОВЛЕНО - полуработает сейчас Основываясь на ответе 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. Все еще любопытно узнать, есть ли способ сделать это.
Примерно так в $ template.erb:
<VirtualHost <%= ip %>:443>
Document Root <%= docroot %>
SSLCertificateFile <%= cert %>
# ...
</VirtualHost>
То есть любая переменная в марионетке доступна как локальная переменная в рубиновых битах, скрытых в файле .erb.
Не уверен, почему у вас есть "$ template" вместо именованного файла .erb (нигде не видно установленного $ template, но хочется предположить, что он где-то прячется)
И это кажется неправильным: cert => Openssl::Cert["rri"]
. Я ожидал чего-то большего:
openssl::cert { "rri": }
И тогда .erb будет больше похож на:
<VirtualHost <%= ip %>:443>
Document Root <%= docroot %>
SSLCertificateFile <%= certDirectory %>/<%= name %>
# ...
</VirtualHost>