Мы находимся в процессе перехода от монолитного репозитория марионеток, который содержит всю конфигурацию. Это одно репо содержит вещи, которые никогда не должны быть на каждом узле, поэтому система на основе марионеточного мастера кажется лучшим способом надлежащим образом разделить вещи.
Проблема в том, что одно и то же репо отлично работает при копировании на локальные узлы и puppet apply /etc/puppet/manifests/site.pp
беги по нему. Наши установки выполняются очень чисто.
Когда я помещаю репозиторий марионеток в марионеточный мастер и подписываю агента, кажется, что он не делает ничего, кроме сообщения своего локального каталога мастеру марионеток.
Некоторое время там, и я не мог воспроизвести конфигурацию, которая сделала это, один из наших самодельных модулей выдавал ошибку, предполагающую, что он пытался скопировать файл с локального компьютера. modules
каталог, а не кукловод, как следует.
Это говорит о том, что могут быть различия в синтаксисе модуля и манифеста при создании репо для локального использования и через puppetmaster.
Если есть какие-либо различия, то каковы они или каковы основные моменты, вызывающие сбои в преобразовании?
В /etc/puppet/puppet.conf
файл на мастере:
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
pluginsync=true
# Set up Environments
## Each environment has a dedicated 'modules' directory under /environments/ from
## which puppet will preferentially pull. Otherwise, it'll use the top level
## 'modules' directory. That is where common code goes.
[master]
manifest=$confdir/manifests/site.pp
modulepath=$confdir/environments/$environment/modules:$confdir/modules
ssl_client_header= SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY
[production]
manifest=$confdir/manifests/site_prod.pp
[integration]
manifest=$confdir/manifests/site_integ.pp
[development]
manifest=$confdir/manifests/site_dev.pp
[operations]
manifest=$confdir/manifests/site_ops.pp
На данный момент site_prod.pp
file и тому подобное являются символическими ссылками на site.pp
.
Классы, определенные в файле site.pp, зависят от имени хоста. Как я уже упоминал, при запуске через puppet apply
все работает нормально. В худшем случае я могу сделать то, что мне нужно, с помощью временного монтирования NFS, но я бы не стал этого делать.
site.pp
Для вашего удовольствия:
filebucket { "main": server => $server; }
File { backup => "main" }
Exec { path => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" }
import "stages.pp"
import "int_setup.pp"
import "nodes.pp"
Импортированные файлы .pp находятся в том же каталоге, что и site.pp. nodes.pp
там мясо, но также содержит секрет-соус. Некоторые отрывки:
node /clunod\-wk\d+\.sub\.example\.local/ {
class { "int_setup": stage => "setup"; }
include base
include curl
include custommodule
[...]
}
Что может и соответствует узлам с именем clunod-wk01234.sub.example.local
при запуске через марионетку применить.
[int-setup.pp]
class int_setup {
file { "/var/cluebat":
ensure => directory,
mode => "755",
owner => "root",
group => "root";
}
group{"puppet":
ensure => present
}
}
Единственная хитрость, о которой я знаю, - это file
тип ресурса.
Резервное копирование замененных файлов ведет себя иначе: по умолчанию используется файловая корзина сервера, а не локальная файловая корзина.
Более важная вещь, о которой нужно знать, - это source
параметр.
source => '/tmp/somepath/sshd_config',
С необработанным путем к файлу он всегда будет пробовать локальный путь.
source => 'puppet://puppetmaster1/modules/sshd/sshd_config',
С puppet://server/
path, он всегда будет пробовать удаленный путь.
source => 'puppet:///modules/sshd/sshd_config',
С пустой спецификацией сервера становится интересно.
При локальном применении путь к локальному модулю марионетки используется для поиска файла.
При сообщении марионеточному мастеру сервер, предоставивший ему манифест, рассматривается как сервер.
Кроме того, если вам нужно проявить творческий подход к источнику файла, вы можете указать source
параметр список:
source => [ '/tmp/somepath/sshd_config', 'puppet:///modules/sshd/sshd_config'],
Первое место, где будет что-то найдено.
Проблема заключалась в различии в том, как выбирались узлы. Код в оригинале nodes.pp
файл:
node /clunod\-wk\d+\.sub\.example\.local/ { )
Что правильно соответствует узлу с именем clunod-wk01234.sub.example.local. Это работало нормально, когда puppet apply
был запущен против местного марионеточного манифеста. Но не было удаленно.
Проблема заключалась в том, как localhost
линия была определена в /etc/hosts
.
Нерабочий:
127.0.0.1 localhost clunod-wk01234 clunod-wk01234.sub.example.local
Работает:
127.0.0.1 localhost clunod-wk01234.sub.example.local clunod-wk01234
Первая форма сообщала мастеру марионеток имя узла clunod-wk01234, вторая форма сообщала полное доменное имя. Вторая форма удовлетворяет node
delcaration там, где нет первого. Это было исправлено путем изменения строк узлов, чтобы не включать полное доменное имя, после чего все работало нормально.
Машины с remote-puppet были обновленным образом, поэтому имели некоторые незначительные отличия от тех, на которых запущен local-puppet. Одно из этих изменений заключалось в том, что одна строка в /etc/hosts
было объявлено. Теперь мы знаем.
Затем я обнаружил, что два вызова файлов были написаны с использованием жестких путей, остальные использовали правильный синтаксис puppet: ///.
Нет разницы между «локальными» и «удаленными» марионеточными правилами.
Можете ли вы опубликовать свой site.pp, чтобы мы могли проверить ошибки?
Используют ли сервер и клиенты один и тот же DNS-сервер? Отличаются ли их файлы /etc/resolv.conf строками «поиск» или «домен»?
Вы также можете запустить марионетку с --debug --verbose --no-daemonize
варианты и получить больше продукции.