#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. Да, извините, я действительно хотел сказать внешние факты. Я исправлю ответ!