Я перенастроил свой марионеточный (v3.6.2) сервер (RHEL 7.1) для поддержки сред, как показано ниже.
/etc/puppet
puppet.conf
auth.conf
environments
Project_A
modules
manifests/site.pp
environment.conf
Project_B
modules
manifests/site.pp
environment.conf
файлы environment.conf состоят из
modulepath=/etc/puppet/environments/$environment/modules
manifest=/etc/puppet/environments/$environment/manifests/site.pp
файл site.pp для каждой среды состоит из
include 'nodes.pp'
include 'selinux.pp'
include 'check_mode.pp'
$puppetserver=<SERVER>
Package {
allow_virtual=>true,
}
на агенте, когда я запускаю команду
puppet agent --no-daemonize --trace --debug --noop --verbose
Я получаю ошибку
Ошибка: не удалось получить каталог с удаленного сервера: ошибка 400 на сервере: не удалось найти узлы классов для <'SERVER'> на <'SERVER'>
в /var/log/puppet/masterhttp.log я получаю сообщение об ошибке
[2015-09-09 15:43:12] <'IP'> - - [2015/09/09: 15: 43: 12 AEST] «POST / Project_A / catalog / <'SERVER'> HTTP / 1.1 400 21
Каждый агент имеет ту же конфигурацию, что и в марионетке с одной средой с добавлением 'environment =' PROJECT_A '
Если я изменю nodes.pp в site.pp с include на import import 'nodes.pp', ошибка изменится на
Ошибка: не удалось получить каталог с удаленного сервера: ошибка 400 на сервере: не удалось найти класс selinux.pp для <'SERVER'> на <'SERVER'>
Та же самая структура работает правильно, когда марионетка была настроена для одной среды. В единой среде все было настроено так:
/etc/puppet
puppet.conf
auth.conf
environments
modules
manifests/site.pp
Я подозреваю, что мне может потребоваться изменить мой файл auth.conf, но я не понимаю, какие изменения требуются. В настоящее время это файл конфигурации по умолчанию.
Я пробовал добавить
path /environments
allow *
без радости
и добавили в fileserver.conf
path /etc/puppet/environments
allow *
снова без радости.
для записи главный файл puppet.conf
[main]
logdir = /var/log/puppet
rundir = /var/run/puppet
ssldir = $vardir/ssl
always_cache_features = true
server = <'PUPPET SERVER'>
environmentpath = $confdir/environments
[master]
ca = true
dns_alt_names = <'SAN DNS ENTRIES'>
certname = <'PUPPET MASTER'>
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY
environment = master
[agent]
classfile = $vardir/classes.txt
localconfig = $vardir/localconfig
environment = Project_A
Агенты используют один и тот же файл конфигурации без [master]
Может ли кто-нибудь увидеть, где я сделал ошибку в своей конфигурации.
ОБНОВЛЕНИЕ: я запустил puppetmaster в режиме отладки, и агент попытался подключиться к серверу. В выводе отладки это то, что заставило меня подозревать, что это auth.conf
Notice: Starting Pppet master version 3.6.2
Debug: Routes Registered
Debug: Route /^\/v2\.0/
Debug: Route /.*/
Debug: Evaluating match for Route /^\/v2\.0/
Debug: Did not match path ("/Project_A/node/<SERVER A>")
Debug: Evaluating match for Route /.*/
Info: access[^/catalog/([^/]+)$]: allowing 'method' find
Info: access[^/catalog/([^/]+)$]: allowing $1 access
Info: access[^/node/([^/]+)$]: allowing 'method' find
Info: access[^/node/([^/]+)$]: allowing $1 access
Info: access[/certificate_revocation_list/ca]: allowing 'method' find
Info: access[/certificate_revocation_list/ca]: allowing * access
Info: access[/^/report/([^/]+)$]: allowing 'method' save
Info: access[/^/report/([^/]+)$]: allowing $1 access
Info: access[/file]: allowing * access
Info: access[/certificate/ca]: adding authentication any
Info: access[/certificate/ca]: adding 'method' find
Info: access[/certificate/ca]: adding * access
Info: access[/certificate/]: adding authentication any
Info: access[/certificate/]: adding 'method' find
Info: access[/certificate/]: adding * access
Info: access[/certificate_request]: adding authentication any
Info: access[/certificate_request]: adding 'method' find
Info: access[/certificate_request]: adding 'method' save
Info: access[/certificate_request]: adding * access
Info: access[/v2.0/environments]: adding 'method' find
Info: access[/v2.0/environments]: adding * access
Info: access[/]: adding authentication any
Info: Inserting dfault '/status' (auth true) ACL
Info: Caching node for <SERVER A>
Debug: Failed to load library 'msgpack' for feature 'msgpack'
Debug: Puppet::Network::Format [msgpack]: feature msgpack is missing
Debug: node supports formats: pson b64_zlib_yaml yaml raw
Debug: Routes Register:
Debug: Routes /^\/v2\.0/
Debug: Route /.*/
Debug: Evaluating match for Route /^\/v2\.0/
Debug: Did not match path ("/Project_A/file_metadatas/plugins")
Debug: Evaluating match for Route /.*/
ОБНОВИТЬ:
У меня вроде как работает.
После перечитывания документации puppetlabs по средам он заявляет, что должна быть среда под названием production. Я таким образом создал
/etc/puppet/environments/production
| modules
| manifests
| environment.conf
Это настроено так же, как и другие среды, хотя в настоящее время в каталогах нет файлов.
Агент остается прежним.
Теперь, когда я запускаю агент, он работает без ошибок. Единственное, что он собирает информацию из корня марионетки / etc / puppet / modules & / etc / puppet / manifestests, и во время работы агента ничего не делает, если хост не определен в / etc / puppet / manifest /site.pp.
В выходных данных отладки puppetmaster все ссылки на хост определены как Project_A, и есть запись журнала
Примечание: Скомпилированный каталог для <'SERVER_A'> в среде Project_A за 0,00 секунды
От агента
Notice: /Stage/[main]/ntp::Config/File[/etc/ntp.conf]/content: content changed '{md5}<md5sum>' to '{md5}<md5sum>'
Info: /Stage/[main]/ntp::Config/File[/etc/ntp.conf]: Scheduling refresh of Service{ntpd}
Итак, в заключение.
Клиент распознается как принадлежащий к среде Project_A на мастере. Несмотря на то, что он настроен на использование пути /etc/puppet/environments/$environment/{modules|manifests/site.pp} в файле environment.conf Project_A.
Фактически использует /etc/puppet/{modules|manifests/site.pp}
Спасибо всем, кто ответил.
Это было решено.
При реализации сред применяется следующее
Все это время я наблюдал странное поведение, которое исчезало при удалении кеша.
Вы проверили права доступа к каталогу? Веб-сервер может не иметь доступа к каталогам.