將 r10k 與單獨的模組儲存庫一起使用
我有一個帶有 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
,每個都具有:
manifests/site.pp
具有節點配置的 A ,例如node default { contain mymodule }
- A
Puppetfile
帶有外部模組引用for
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
. 主人將在另一個盒子上並手動設置。
根據您的問題和評論:
我的問題是 - 儘管有這個輸出 - 推送到模組儲存庫的更改沒有反映在下面的文件中
/etc/puppetlabs/code/environments
。
r10k
不知道HEAD
。HEAD
是不確定的,所以不可能像這樣使用它。如果要跟踪 a
branch
,請使用以下內容:mod 'mymodule', :git => 'file:///srv/git/mymodule.git', :ref => 'master'
為了保持設置簡單,我想避免分支。相反,我想始終使用模組儲存庫的最新送出進行測試,並使用另一個穩定的標籤進行生產,只要程式碼處於可接受的狀態,我就會繼續前進。
老實說,我不確定您的工作流程如何:
- 你有一個帶有兩個分支的控制倉庫,
master
並且testing
.master
當您testing
用於開發時,是穩定的生產程式碼嗎?- 您正在將新程式碼推送到
testing
,一旦它達到您滿意的狀態,您將合併testing
到master
?- 在此之後,您想將目前狀態標記
master
為stable
,您的代理應該使用哪個?- 您的基礎架構的其餘部分如何?有多少代理?您如何測試您的程式碼,即如何告訴 {one,all} (?) 代理:“請使用來自此環境的此程式碼”?
- 跟進上述內容:如果您在
master
and中編寫程式碼testing
,您的代理如何知道要使用哪個環境?- 如果您可以詳細說明上述幾點並告訴我更多詳細資訊(並將其添加到您的問題中,評論可能太有限),我可能會提供幫助並擴展此答案。
- 無論如何,祝你好運!
puppet
和r10k
,特別是如果加上 git 鉤子,是一個很棒的設置!自己用這個,太棒了!:)附加資訊:
- 感謝您詳細說明您的工作流程。
- 如果你對 git 還不夠多才多藝,特別是如果你正在做很多分支和合併並且害怕合併衝突,請務必閱讀git rebase,它確實
在另一個基本提示之上重新應用送出
假設您處於以下情況:
- 你是
master
to的分支feature1
。- 你
file1:3-6
在feature1
.- 您正在
file1:7-10
直接更改master
以修復緊迫的錯誤。- 您想合併
feature1
回master
.- 通常,此時您會遇到合併衝突,因為在兩個分支中都修改了同一個文件。
- 如果您在合併之前執行
git rebase master
while onfeature1
,這會將最新狀態/送出“拉入”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
在您的控制倉庫中, to的分支testing
。master
在您的模組儲存庫中, to的分支testing
。- 在不改變你的情況下
Puppetfile
,使用你的控制倉庫分支的傀儡代理testing
現在也使用testing
你的模組倉庫的分支。- 發展到你滿意為止。
- 在您的模組儲存庫中,合併
testing
到master
.- 您開發的新程式碼現在將轉到所有使用生產程式碼的 puppet 代理,即
master
您的控制 repo 的分支。最後一點,現在:聽起來你是唯一一個開發程式碼的人,所以也許這對你來說並不重要,只是想讓你知道:
- 如果兩個分支太有限,則很有可能在 puppet 代理執行期間使用不同的環境,而無需修改配置,而是通過提供 cli 參數:
puppet agent -t --environment ${FEATURE_BRANCH}
目前我能想到的就這些了。希望這會有所幫助,再次祝你好運,萬事如意!