Используйте r10k с отдельными репозиториями модулей
У меня есть рабочая установка Puppet с Мастером и Агентом. Сейчас я пытаюсь использовать r10k для управления кодом Puppet. Моя цель состоит в том, чтобы на каждом git push
кода изменить код марионетки ниже /etc/puppetlabs/code/environments
на Puppet Master обновляется автоматически.
Хотя это, кажется, работает для одного монолитного репозитория управления, содержащего все модули, я не получаю его, если пользовательские модули находятся в отдельных репозиториях 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 Hooks для запуска 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
, - Моей первой мыслью было создать тег Git
stable
для репозитория модуля, который я время от времени перемещаю в текущий коммит, то есть оставаясь вmaster
ветвь все время без какого-либо слияния. Но объединение веток, ускоренное только вперед, также может спасти меня от конфликтов слияний, поэтому, вероятно, нет причин избегать ветвей. Также я мог получить одинаковый рабочий процесс как для репозитория, так и для репозитория модуля. - Я только начинаю изучать Puppet с двумя виртуальными машинами, одним мастером Puppet и одним агентом. Я добавлю еще один агент VM, а затем укажу один на
production
окружающая среда, а другойtesting
так что я могу проверить свой рабочий процесс при создании пригодной конфигурации Puppet для агентов. Сейчас я просто установлю среду в каждом агентеpuppet.conf
, - Позже я буду использовать настоящие Linux-боксы и сопоставлю одного агента
testing
и все остальныеproduction
, Мастер будет на другой коробке и настроен вручную.
1 ответ
По вашему вопросу и комментариям:
Моя проблема заключается в том, что - несмотря на этот вывод - изменения, помещенные в репозиторий модуля, не отражаются в файлах ниже
/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
какие ваши агенты должны использовать?Как выглядит остальная часть вашей инфраструктуры? Сколько агентов на месте? Как вы тестируете свой код, т.е. как вы говорите {одному, всем} (?) Агентам: "Пожалуйста, используйте этот код, выходящий из этой среды"?
Выполните следующие действия: если вы используете код
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
ветка вашего контрольного репо.
- В вашем контрольном репо, филиал
Последнее замечание на данный момент: похоже, что вы единственный, кто разрабатывает код, так что, возможно, это не так важно для вас, но просто чтобы вы знали:
Если две ветви слишком ограничены, вполне возможно использовать другую среду во время запуска агента Puppet без изменения конфигурации, но с помощью параметра cli:
puppet agent -t --environment ${FEATURE_BRANCH}
- Это все, что я сейчас могу придумать. Надеюсь, что это поможет, опять же, удачи и всего наилучшего!