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

Перезапустите службу до того, как будут применены все ресурсы

Я хочу установить и настроить Apache через Puppet и запросить сертификат SSL с acme_tiny.py. Мои классы и ресурсы Puppet для веб-сервера и в большинстве случаев для работы с acme-tiny, за исключением первого запуска.

К сожалению, acme_tiny нужен работающий веб-сервер, который не запускается до тех пор, пока ресурс acme_tiny не будет успешно завершен. Я предполагаю, что поток должен быть примерно таким:

Установить Apache -> Запустить Apache -> Настроить виртуальный хост HTTP -> Перезагрузить Apache -> Запустить acme_tiny -> Настроить виртуальный хост HTTPS -> Перезагрузить Apache

Проблема в том, что ресурс «apache2 reload» может существовать в Puppet только один раз, и я получаю цикл зависимости, если я заказываю ресурс acme_tiny между ними. Кроме того, ресурсом также управляет модуль puppetlabs / apache, каждый раз, когда создается новый виртуальный хост, но применяется только последним. В настоящее время поток такой:

Установите Apache -> Запустить Apache -> Настроить виртуальный хост HTTP -> Запустить acme_tiny (сбой) -> Настроить виртуальный хост HTTPS (пропущено из-за сбойных зависимостей) -> Настроить все остальное -> Перезагрузить Apache (пропущено из-за сбоев в зависимостях)

Если я затем вручную запускаю Apache2 после первого запуска, все работает нормально: сертификат извлекается, создается виртуальный хост HTTPS и перезагружается веб-сервер. К сожалению, это не работает без ручного вмешательства.

Мой ресурс acme-tiny выглядит так:

exec { "${url}.crt":
  command   => "acme_tiny.py --quiet --account-key ./${url}_account.key --csr ./${url}.csr --acme-dir /home/web/${url}/www > ${url}.crt",
  path      => [ '/usr/bin', '/usr/local/bin' ],
  cwd       => $profile::apache::params::ssl_dir,
  require   => File['acme_tiny.py'],
  subscribe => File["${profile::apache::params::ssl_dir}/${url}.csr"],
  notify    => Service['apache2'],
}

Кто-нибудь знает, как это исправить? В идеале все это должно быть выполнено за один запуск Puppet, второй лучший вариант - если потребуется второй запуск Puppet без необходимости ручного вмешательства. По сути, в случае сбоя acme_tiny сбой должна быть только конфигурация виртуального хоста HTTPS, но не перезагрузка Apache.

Мне удалось сделать это с помощью небольшого грязного хака, но, по крайней мере, это работает.

Я видел, что Apache уже запущен в установке Debian по умолчанию после того, как Puppet установил пакет, но Puppet перенастраивает его (и выдает apache reload в конце). К счастью, веб-сервер уже отвечает на все запросы, обслуживая статические файлы.

Затем я разделил ресурс acme_tiny на две части: Настройка и обновление: для настройки Puppet сначала создает папку /var/www/html/.well-known/acme-challenge а затем выполняет следующий exec:

# Request a new certificate if the crt file does not yet exist
exec { "${url}.crt initial":
  command   => "acme_tiny.py --quiet --account-key ./${url}_account.key --csr ./${url}.csr --acme-dir /var/www/html/.well-known/acme-challenge > ${url}.crt",
  creates   => "${profile::apache::params::ssl_dir}/${url}.crt",
  path      => [ '/usr/bin', '/usr/local/bin' ],
  cwd       => $profile::apache::params::ssl_dir,
  require   => [ File['acme_tiny.py'], File['/var/www/html/.well-known/acme-challenge'] ],
  subscribe => File["${profile::apache::params::ssl_dir}/${url}.csr"],
  notify    => Service['apache2'],
}

Этот ресурс не выполняется, если сертификат уже существует (следовательно, createsпараметр).

При каждом последующем запуске будет выполняться exec обновления:

 exec { "${url}.crt renewal":
  command   => "acme_tiny.py --quiet --account-key ./${url}_account.key --csr ./${url}.csr --acme-dir /home/web/${url}/www > ${url}.crt",
  unless    => ["openssl x509 -checkend 2592000 -noout -in ${url}.crt",
                "test ! -f ${url}.crt" ],
  path      => [ '/usr/bin', '/usr/local/bin' ],
  cwd       => $profile::apache::params::ssl_dir,
  require   => File['acme_tiny.py'],
  subscribe => File["${profile::apache::params::ssl_dir}/${url}.csr"],
  notify    => Service['apache2'],
}

Это выполняется, только если существующий сертификат действителен менее месяца. и если сертификат уже существует.

Это должно сделать исполняемые файлы взаимоисключающими, так что за один запуск Puppet будет выполняться только один exec.

Есть еще некоторые настройки (виртуальный хост по умолчанию должен быть создан даже после начальной настройки, например, если вы хотите настроить второй виртуальный хост на уже работающий веб-сервер), но в настоящее время он работает довольно хорошо.

Это не решает проблему с Puppet (поскольку в настоящее время это зависит от «функции» Apache), но на самом деле я очень сомневаюсь, что это возможно с Puppet: основная особенность Puppet заключается в том, что сам ресурс можно применить только один раз.