将r10k与单独的模块存储库一起使用

我有一个工作设置的木偶与主和代理。 现在我正在尝试使用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包含分支机构的productiontesting ,每个都有:

  • 具有节点configuration的manifests/site.pp ,例如node default { contain mymodule }
  • 一个带有外部模块引用的Puppetfile

用于testingPuppetfile看起来像例如

 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程中详细阐述一下:

  • 我的控制回购有两个分支, productiontesting ,而模块库只有一个分支master 。 我认为这样会更容易,特别是避免合并问题。 但是考虑到在Git合并中可以限制快速前进,并且r10k对分支机构的跟踪有积极的支持,所以使用分支机构productiontesting模块库,我的工作stream程可能会更容易。 然后,我会在testing工作(开发),只有切换到production才能执行像git merge --ff-only testing
  • 我的第一个想法是为模块库创build一个Git标签stable的版本,我现在不时地转移到当前的提交,即一直停留在master分支,而没有任何合并完成。 但是分支之间的快速合并也可以避免合并冲突,所以可能没有理由避免分支。 另外,我可以在控制回购和模块回购上获得相同的工作stream程。
  • 我只开始学习两台虚拟机,一台木偶主机和一台代理。 我将添加另一个VM代理,然后将其中一个指向production环境,另一个指向testing以便在为代理构build可用的Puppetconfiguration时validation工作stream程。 现在我只需在每个代理的puppet.conf设置环境。
  • 稍后我将使用真正的Linux机器,并将一个代理映射到testing并将所有其他代理映射到production 主人将在另一个盒子上,并手动设置。

根据你的问题和评论:

我的问题是,尽pipe有这个输出,更改推送到模块的存储库并不反映在/etc/puppetlabs/code/environments下面的文件。

r10k不知道HEADHEAD是非确定性的,所以不可能像这样使用它。

如果你想跟踪一个branch ,使用像这样的东西:

 mod 'mymodule', :git => 'file:///srv/git/mymodule.git', :ref => 'master' 

为了保持设置简单,我想避免分支。 相反,我想总是使用模块库的最新提交进行testing,并使用另一个稳定的标记进行生产,只要代码的形状可以接受,我就会前进。

老实说,我不确定你的工作stream程是怎样的:

  • 你有两个分支的控制回购, mastertestingmaster是稳定的生产代码,而您正在使用testing进行开发?

  • 你正在推动新的代码testing ,一旦它达到一个你感觉舒适的状态,你将testing合并到master

  • 在此之后,你想标记当前状态在master作为stable ,你的代理应该使用?

  • 其余的基础设施是怎样的? 有多less代理商? 你如何testing你的代码,即你如何告诉{一个,所有}(?)代理:“请使用这个代码从这个环境中出来”?

  • 遵循上面的内容:如果你已经在mastertesting代码,你的代理如何知道使用哪个环境?

  • 如果你能详细说明上述问题并告诉我更多的细节(并且请把这个添加到你的问题中,这些意见可能太有限了),我可以帮助并扩展这个答案。

  • 无论如何,祝你好运! puppetr10k ,特别是如果加上GIT钩,是一个真棒设置! 用我自己,这太棒了! 🙂

附加信息:

  • 感谢您详细说明您的工作stream程。

  • 如果你不是多function的,但使用git,特别是如果你做了很多分支和合并,并且害怕合并冲突,请确保阅读有关git rebase ,

    重新申请提交另一个基本技巧

  • 假设你处于以下情况:

    • 您正在将master分支到feature1
    • 您在feature1中的file1:3-6中执行一些工作。
    • 你直接在master更改file1:7-10来修复一个紧迫的bug。
    • 您想要将feature1合并回master
    • 通常,在这一点上,你会得到一个合并冲突,因为在两个分支中修改相同的文件。
    • 如果在合并之前在feature1上执行git rebase master ,则会将最新的状态/提交“拉”到feature1 ,在这种情况下,将修复错误。
    • 现在做合并,没有冲突。
  • 我不会仅限于模块存储库中的一个分支。 你如何处理里面的testing新代码? 这不仅是你的控制回购需要随着时间的推移增强。
  • 为了使这个舒适,使用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} 
  • 现在我可以想到了。 希望这有助于,再次祝你好运,一切顺利!