我有一个包含 Master 和 Agent 的 Puppet 工作设置。现在我尝试使用 r10k 来管理 Puppet 代码。我的目标是每次git push
更改代码时/etc/puppetlabs/code/environments
,Puppet Master 上的 Puppet 代码都会自动更新。
虽然这似乎适用于包含所有模块的一个整体控制存储库,但如果自定义模块位于单独的 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
,每个分支具有:
- 具有节点配置的A
manifests/site.pp
,例如node default { contain mymodule }
- A
Puppetfile
带有外部模块引用
forPuppetfile
看起来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 钩子git push
每当执行以下命令时运行 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
我的问题是 - 尽管有这样的输出 - 推送到模块存储库的更改并未反映在下面的文件中/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 hooks 结合使用,是一个很棒的设置!我自己用过,效果很好! :)
附加信息:
感谢您详细说明您的工作流程。
如果你还不太熟悉 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
的 puppet 代理,它testing
现在使用您的控制存储库的分支还使用testing
你的模块仓库的分支。 - 不断开发直到您满意为止。
- 在您的模块仓库中,合并
testing
到master
。 - 您开发的新代码现在将发送给所有使用生产代码(即
master
控制仓库的分支)的傀儡代理。
- 在您的控制仓库中,将 分支
现在最后一点需要注意的是:听起来你是唯一一个开发代码的人,所以这对你来说可能并不那么重要,只是想让你知道:
如果两个分支太有限,则完全可以在 puppet 代理运行期间使用不同的环境,而无需修改配置,而是通过提供 cli 参数:
puppet agent -t --environment ${FEATURE_BRANCH}
- 我现在能想到的就这些了。希望这些能帮到你,再次祝你好运,万事如意!