У меня есть рабочая установка Puppet с Мастером и Агентом. Теперь я пытаюсь использовать r10k для управления кодом Puppet. Моя цель - чтобы на каждом git push
кода измените код Puppet ниже /etc/puppetlabs/code/environments
на Мастере Марионеток обновляется автоматически.
Хотя это, похоже, работает для одного монолитного репозитория управления, содержащего все модули, я не могу заставить его работать, если пользовательские модули находятся в отдельных репозиториях Git.
Моя установка выглядит следующим образом:
конфигурация r10k в /etc/puppetlabs/r10k/r10k.yaml
:
sources:
operations:
remote: '/srv/git/puppet.git'
basedir: '/etc/puppetlabs/code/environments'
Центральный контрольный репозиторий /srv/git/puppet.git
содержащие ветви production
и testing
, каждый с:
manifests/site.pp
с конфигурациями узлов, например node default { contain mymodule }
Puppetfile
со ссылками на внешние модулиВ Puppetfile
для testing
будет выглядеть, например,
mod 'mymodule',
:git => 'file:///srv/git/mymodule.git',
:ref => 'HEAD'
в то время как для production
это будет выглядеть, например,
mod 'mymodule',
:git => 'file:///srv/git/mymodule.git',
:ref => 'stable'
(Пока это не работает, у меня есть только ветка production
и ссылка на HEAD
.)
Другой репозиторий Git для каждого настраиваемого модуля, например /srv/git/mymodule.git
Git Хуки запускать r10k всякий раз, когда git push
выполняется:
/srv/git/puppet.git/hooks/post-receive
с содержанием r10k deploy environment -pv
/srv/git/mymodule.git/hooks/post-receive
с содержанием r10k deploy module mymodule -v
Крючки выполняются, так как после git push
Я получаю результат вроде
remote: INFO -> Deploying environment /etc/puppetlabs/code/environments/production
remote: INFO -> Environment production is now at 991830eb1561cddd7970be4152748168df52ef79
remote: INFO -> Deploying Puppetfile content /etc/puppetlabs/code/environments/production/modules/mymodule
и
remote: INFO -> Deploying module /etc/puppetlabs/code/environments/production/modules/mymodule
Моя проблема в том, что, несмотря на этот вывод, изменения, отправленные в репозиторий модуля, не отражаются в файлах ниже /etc/puppetlabs/code/environments
.
редактировать
Немного уточняю свой предполагаемый рабочий процесс:
production
и testing
, а в репозитории модулей только одна ветка master
. Я думал, что так будет проще, особенно чтобы избежать проблем слияния. Но учитывая, что в Git слияния могут быть ограничены быстрой перемоткой вперед, а r10k имеет активную поддержку отслеживания веток, мой рабочий процесс может быть проще с использованием веток production
и testing
также для репозиториев модулей. Я бы тогда работал (развивал) testing
и переключиться только на production
выполнить что-то вроде git merge --ff-only testing
.stable
для репозитория модулей, который я время от времени перемещаю в текущую фиксацию, т.е. оставаясь в master
ветвление все время без какого-либо слияния. Но слияние веток только с перемоткой вперед также может спасти меня от конфликтов слияния, поэтому, вероятно, нет причин избегать ветвей. Также я мог получить одинаковый рабочий процесс как для контрольного репозитория, так и для репозитория модуля.production
окружающая среда, а другой - testing
чтобы я мог проверить свой рабочий процесс при создании удобной конфигурации Puppet для агентов. А пока я просто настрою среду в каждом агенте puppet.conf
.testing
и все остальные production
. Мастер будет на другом ящике и настраивается вручную.Согласно вашему вопросу и комментариям:
Моя проблема в том, что, несмотря на этот вывод, изменения, отправленные в репозиторий модуля, не отражаются в файлах ниже
/etc/puppetlabs/code/environments
.
r10k
не знает о HEAD
. HEAD
недетерминирован, поэтому его нельзя использовать таким образом.
Если вы хотите отследить branch
используйте что-нибудь вроде:
mod 'mymodule',
:git => 'file:///srv/git/mymodule.git',
:ref => 'master'
Чтобы упростить настройку, я хотел избежать ветвления. Вместо этого я хотел всегда использовать последнюю фиксацию репозитория модулей для тестирования и использовать другой стабильный тег для производства, который я продвигаю, когда код находится в приемлемой форме.
Честно говоря, я не уверен, как выглядит ваш рабочий процесс:
У вас контрольное репо с двумя ветвями, master
и testing
. master
стабильный производственный код, пока вы используете testing
для разработки?
Вы вводите новый код в testing
, и как только он достигнет комфортного состояния, вы объедините testing
в master
?
После этого вы хотите отметить текущее состояние в master
так как stable
, что должны использовать ваши агенты?
Как выглядит остальная часть вашей инфраструктуры? Сколько агентов на месте? Как вы тестируете свой код, т. Е. Как сказать {one, all} (?) Агентам: «Пожалуйста, используйте этот код, полученный из этой среды»?
Выполните следующие действия: если у вас есть код в master
и testing
, как ваши агенты узнают, какую среду использовать?
Если бы вы могли подробнее остановиться на вышеупомянутых пунктах и рассказать мне более подробную информацию (и, пожалуйста, добавьте это к своему вопросу, комментарии могут быть слишком ограниченными для этого), я мог бы помочь и расширить этот ответ.
В любом случае удачи! puppet
и r10k
, особенно в сочетании с хуками git, это отличная установка! Сам пользуюсь этим, просто здорово! :)
Дополнительная информация:
Спасибо за подробное описание вашего рабочего процесса.
Если вы еще не так универсальны с git, и особенно если вы делаете много ветвлений и слияний и боитесь конфликтов слияния, обязательно прочитайте о git rebase, что делает
повторное применение фиксируется поверх другого базового наконечника
Допустим, вы находитесь в следующей ситуации:
master
к feature1
.file1:3-6
в feature1
.file1:7-10
прямо в master
чтобы исправить насущную ошибку.feature1
Вернуться в master
.git rebase master
пока на feature1
перед слиянием, это "вытянет" последнее состояние / фиксацию (я) в feature1
, в этом случае исправление ошибки.Чтобы это было удобно, воспользуйтесь еще одной функцией r10k
:
# Track control branch and fall-back to master if no matching branch exists
mod 'mymodule',
:git => 'file:///srv/git/mymodule.git',
:branch => :control_branch,
:default_branch => 'master'
Это позволит вам сделать следующее, например, в ситуации, когда вы хотите разработать новую функцию в своем модуле:
master
к testing
.master
к testing
.Puppetfile
, ваш марионеточный агент, который использует testing
филиал вашего контрольного репо сейчас также использует testing
ветка вашего репозитория модуля. testing
в master
.master
филиал вашего контрольного репо.И последнее замечание: похоже, что вы единственный человек, разрабатывающий код, так что, возможно, это не так важно для вас, а просто чтобы вы знали:
Если две ветки слишком ограничены, вполне возможно использовать другую среду во время запуска марионеточного агента без изменения конфигурации, но с помощью параметра cli:
puppet agent -t --environment ${FEATURE_BRANCH}