我有一个工作设置的木偶与主和代理。 现在我正在尝试使用r10k来pipe理Puppet代码。 我的目标是在代码更改的每个git push上,Puppet Master上的/etc/puppetlabs/code/environments下面的Puppet代码会自动更新。
虽然这似乎适用于包含所有模块的单片控制库,但如果自定义模块位于单独的Git存储库中,则无法正常工作。
我的设置如下:
/etc/puppetlabs/r10k/r10k.yaml中的r10kconfiguration :
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 用于testing的Puppetfile看起来像例如
mod 'mymodule', :git => 'file:///srv/git/mymodule.git', :ref => 'HEAD'
而为了production它看起来像例如
mod 'mymodule', :git => 'file:///srv/git/mymodule.git', :ref => 'stable'
(直到这个工作,我只有分支production和参考头。)
每个自定义模块的另一个Git仓库 ,例如/srv/git/mymodule.git
每次执行git push时, Git挂钩运行r10k:
/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
我的问题是,尽pipe有这个输出,更改推送到模块的存储库并不反映在/etc/puppetlabs/code/environments 。
编辑
在我的预期工作stream程中详细阐述一下:
production和testing ,而模块库只有一个分支master 。 我认为这样会更容易,特别是避免合并问题。 但是考虑到在Git合并中可以限制快速前进,并且r10k对分支机构的跟踪有积极的支持,所以使用分支机构production和testing模块库,我的工作stream程可能会更容易。 然后,我会在testing工作(开发),只有切换到production才能执行像git merge --ff-only testing 。 stable的版本,我现在不时地转移到当前的提交,即一直停留在master分支,而没有任何合并完成。 但是分支之间的快速合并也可以避免合并冲突,所以可能没有理由避免分支。 另外,我可以在控制回购和模块回购上获得相同的工作stream程。 production环境,另一个指向testing以便在为代理构build可用的Puppetconfiguration时validation工作stream程。 现在我只需在每个代理的puppet.conf设置环境。 testing并将所有其他代理映射到production 主人将在另一个盒子上,并手动设置。 根据你的问题和评论:
我的问题是,尽pipe有这个输出,更改推送到模块的存储库并不反映在
/etc/puppetlabs/code/environments下面的文件。
r10k不知道HEAD 。 HEAD是非确定性的,所以不可能像这样使用它。
如果你想跟踪一个branch ,使用像这样的东西:
mod 'mymodule', :git => 'file:///srv/git/mymodule.git', :ref => 'master'
为了保持设置简单,我想避免分支。 相反,我想总是使用模块库的最新提交进行testing,并使用另一个稳定的标记进行生产,只要代码的形状可以接受,我就会前进。
老实说,我不确定你的工作stream程是怎样的:
你有两个分支的控制回购, master和testing 。 master是稳定的生产代码,而您正在使用testing进行开发?
你正在推动新的代码testing ,一旦它达到一个你感觉舒适的状态,你将testing合并到master ?
在此之后,你想标记当前状态在master作为stable ,你的代理应该使用?
其余的基础设施是怎样的? 有多less代理商? 你如何testing你的代码,即你如何告诉{一个,所有}(?)代理:“请使用这个代码从这个环境中出来”?
遵循上面的内容:如果你已经在master和testing代码,你的代理如何知道使用哪个环境?
如果你能详细说明上述问题并告诉我更多的细节(并且请把这个添加到你的问题中,这些意见可能太有限了),我可以帮助并扩展这个答案。
无论如何,祝你好运! puppet和r10k ,特别是如果加上GIT钩,是一个真棒设置! 用我自己,这太棒了! 🙂
附加信息:
感谢您详细说明您的工作stream程。
如果你不是多function的,但使用git,特别是如果你做了很多分支和合并,并且害怕合并冲突,请确保阅读有关git rebase ,
重新申请提交另一个基本技巧
假设你处于以下情况:
master分支到feature1 。 feature1中的file1:3-6中执行一些工作。 master更改file1:7-10来修复一个紧迫的bug。 feature1合并回master 。 feature1上执行git rebase master ,则会将最新的状态/提交“拉”到feature1 ,在这种情况下,将修复错误。 为了使这个舒适,使用r10k另一个function:
# 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'
这将允许您执行以下操作,例如,在您希望在模块中开发新function的情况下:
testing 。 testing 。 Puppetfile ,你的使用你的控制回购testing分支的木偶代理现在也使用你的模块回购的testing分支。 testing合并到master 。 master分支。 最后一个注意事项:听起来你是唯一开发代码的人,所以也许这对你并不重要,只是为了让你知道:
如果两个分支太有限了,在puppet代理运行期间,不用修改configuration就可以使用不同的环境,但通过提供cli参数:
puppet agent -t --environment ${FEATURE_BRANCH}