Назад | Перейти на главную страницу

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"],
  }

У меня вопрос - как я могу сослаться на $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>