Марионетка: цепочка зависимостей не выполняется по порядку

#puppet #facter

#марионетка #фактор

Вопрос:

У меня проблема, при которой я пытаюсь установить внешние факты, а затем скопировать файл шаблона, который заполняется значениями из файла hiera yaml. Файл шаблона зависит от определенных фактов (таких как владелец и группа файла шаблона), которые устанавливаются внешним файлом фактов. Ниже приведен код марионетки.

     file {['/etc/facter/','/etc/facter/facts.d']:
            ensure => directory,
            owner => 'root',
            group => 'root',
            mode => '0755',
    }

    file {"/etc/facter/facts.d/domain_facts.sh":
            ensure => present,
            owner => 'root',
            group => 'root',
            mode => '0755',
            source => $::hostname?{
                    'hostname1' => 'puppet:///modules/vfecare/hostname1.sh',
                    },
            require => File['/etc/facter/','/etc/facter/facts.d'],
    }

    file {"/tmp/testing123":
            ensure => present,
            owner => "${::remoteuser}",
            group => "${::remotegroup}",
            content => template("vfecare/testscript.erb"),
            require => File["/etc/facter/facts.d/domain_facts.sh"]
    }
  

Однако во время выполнения я вижу, что шаблон сначала копируется на компьютер агента puppet, и поскольку шаблон имеет некоторые значения, которые ему нужны из внешнего файла фактов, он не может найти и выдает ошибку «Недопустимый владелец и значение группы».

Ниже приводится содержимое внешнего файла фактов

 #!/bin/bash

echo "remoteuser=tempuser"
echo "remotegroup=tempuser"
  

Почему марионетка, похоже, игнорирует цикл зависимости здесь?

Ответ №1:

Факты собираются агентом в самом начале запуска марионетки, перед запуском каталога, содержащего ваши файловые ресурсы. Невозможно развернуть внешний факт во время выполнения и использовать его таким образом, поскольку факты будут отсутствовать.

Вместо этого вам нужно полагаться на механизм «pluginsync» Puppet, который копирует внешние факты от ведущего к агенту, прежде чем он соберет факты.

Переместите vfecare/files/hostname1.sh файл фактов в модуле в vfecare/facts.d/hostname1.sh , удалите файловые ресурсы, которые у вас есть для / etc / facter, и скопируйте внешний факт, затем повторно запустите агент. Сначала следует загрузить hostname1.sh файл фактов, затем правильно оцените файловый ресурс /tmp / testing123 со значениями remoteuser / group.

Смотрите документы по автоматической загрузке плагинов на стороне агента для получения дополнительной информации.

Комментарии:

1. Но дело в том, что pluginsync просто скопирует все файлы фактов, а не копирует файлы на основе имени хоста компьютера. Есть ли способ добиться этого?

2. Я предположил, что это фиктивный пример, извините. Я думаю, вам было бы намного лучше использовать Hiera или аналогичную конфигурацию для каждого имени хоста. Факты касаются обнаружения информации с хоста, не имеет смысла таким образом развертывать факты для каждого хоста агенту, а затем считывать их обратно ведущему.

3. Хорошее объяснение, но он пытается использовать внешние факты, а не пользовательские факты. Кроме того, хотя Hiera имеет больше смысла с точки зрения дизайна, какой-то ENC или CMDB, к которым может получить доступ марионетка, был бы еще более эффективным и чистым.

4. @MattSchuchard, внешние факты также могут быть подвержены pluginsync, как описано в m0dlx. Это описано в документе, на который он ссылался. Он использовал неправильный термин, но процедура, которую он описывает, действительна.

5. Да, извините, я действительно хотел сказать внешние факты. Я исправлю ответ!