Я пытаюсь вставить блок текста в свой файл сертификата CA на хостах CentOS с Puppet. Я спрашивал об этом раньше, и мне кажется, что в CentOS катастрофически не хватает функций управления сертификатами..
Что мне нужно сделать, так это получить довольно большой кусок текста, представляющий мой сертификат CA (переданный через openssl
по какой-то глупой причине) в мой /etc/ssl/certs/ca-bundle.crt
файл и убедитесь, что он всегда там, даже если хост обновит свой файл CA позже из репо.
я не хотите полностью управлять файлом ca-bundle с помощью Puppet. Это уже обрабатывается репозиториями yum, на которые указывают серверы.
Сложность: в Puppet официально нет способа управлять фрагментами текста, только строками, с помощью file_line
ресурс. Однако я, пытаясь быть умным, подумал, что можно использовать «строку» текста с экранированием новой строки и управлять этим.
Ну вроде как. Это работает, поскольку текст попадает в файл, но проблема в том, что он продолжает добавляться повторно после каждого запуска марионетки, как будто код не может сказать, что он уже существует.
Для деталей фрагмент текста выглядит примерно так (по понятным причинам обрезан: 3)
$cacert = "Certificate:\n Data:\n Version: 3 (0x2)\n Serial Number:\n 10:d8:83:91:-redacted-"
Строка в моем модуле Puppet выглядит так:
class em_cacerts::centos inherits em_cacerts{
file_line { 'ca-certificate':
path => '/etc/ssl/certs/ca-bundle.crt',
line => $cacert,
#match => "(see below)",
ensure => present,
}
Я перепробовал всевозможные махинации с match
линия (включая использование inline_template
чтобы установить регулярное выражение соответствия для всего содержимого $cacert
переменная, которая безупречно работает в IRB, но не в Puppet) в попытке заставить ее распознать уже существующий текстовый блок, но он продолжает добавляться каждый раз заново и просто накладывается поверх самого себя.
Я, наверное, здесь лаю не на то дерево ... но в любом случае это часть вопроса.
Спасибо!
Я решил это с помощью exec
линия:
class em_cacerts::centos inherits em_cacerts{
exec { 'cent-ca-certificate':
command => "/bin/echo '$centcacert' >> '$cabundlepath'",
onlyif => "test ! `grep (redacted CA name) $cabundlepath`",
provider => 'shell',
}
}
Да, он использует exec, который официально не рекомендуется, но он работает надежно и использует абсолютно базовые вещи, которые есть в любом устройстве CentOS.
Спасибо всем!
Я думаю, вам нужен модуль puppet concat, который строит файлы из фрагментов. Или просто управляйте отдельным файлом и попросите ресурс exec sed вставить его в файл, если он не найден с помощью grep
Обычно я вижу файлы, управляемые полностью с использованием шаблонов erb. Если вы этого не сделаете, вы можете попросить скрипт выполнить команду sed. https://puppetlabs.com/blog/why-puppet-isnt-a-file-management-tool/