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

Управление блоком текста с помощью Puppet

Я пытаюсь вставить блок текста в свой файл сертификата 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/

См. Также augeas.

http://augeas.net/

Его цель - сделать именно то, о чем вы просили.