Puppet

將 r10k 與單獨的模組儲存庫一起使用

  • October 5, 2017

我有一個帶有 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包含分支的中央控制儲存庫productiontesting,每個都具有:

  • manifests/site.pp具有節點配置的 A ,例如node default { contain mymodule }
  • APuppetfile帶有外部模組引用

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 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


編輯

詳細說明我的預期工作流程:

  • 我的控制倉庫有兩個分支,productiontesting模組倉庫只有一個分支master。我認為這樣會更容易,尤其是避免合併問題。但是考慮到在 Git 中合併可以限制為快進,並且 r10k 對分支的跟踪有積極的支持,我的工作流程實際上可能更容易使用分支productiontesting模組儲存庫。然後我會繼續工作(開發)testing並且只切換production到執行類似git merge --ff-only testing.
  • 我的第一個想法是為模組儲存庫創建一個 Git 標記stable,我不時移動到目前送出,即一直留在master分支中,根本沒有進行任何合併。但是分支之間的僅快進合併也可以使我免於合併衝突,因此可能沒有理由避免分支。我也可以在控制回購和模組回購上獲得相同的工作流程。
  • 我才剛剛開始使用兩台虛擬機、一台 Puppet 主機和一台代理來了解 Puppet。我將添加另一個 VM 代理,然後將一個指向production環境,另一個指向環境,testing以便在為代理建構可用的 Puppet 配置時驗證我的工作流程。現在我將簡單地在每個代理的puppet.conf.
  • 稍後我將使用真正的 Linux 機器並將一個代理映射testingproduction. 主人將在另一個盒子上並手動設置。

根據您的問題和評論:

我的問題是 - 儘管有這個輸出 - 推送到模組儲存庫的更改沒有反映在下面的文件中/etc/puppetlabs/code/environments

r10k不知道HEADHEAD是不確定的,所以不可能像這樣使用它。

如果要跟踪 a branch,請使用以下內容:

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

為了保持設置簡單,我想避免分支。相反,我想始終使用模組儲存庫的最新送出進行測試,並使用另一個穩定的標籤進行生產,只要程式碼處於可接受的狀態,我就會繼續前進。

老實說,我不確定您的工作流程如何:

  • 你有一個帶有兩個分支的控制倉庫,master並且testing. master當您testing用於開發時,是穩定的生產程式碼嗎?
  • 您正在將新程式碼推送到testing,一旦它達到您滿意的狀態,您將合併testingmaster?
  • 在此之後,您想將目前狀態標記masterstable,您的代理應該使用哪個?
  • 您的基礎架構的其餘部分如何?有多少代理?您如何測試您的程式碼,即如何告訴 {one,all} (?) 代理:“請使用來自此環境的此程式碼”?
  • 跟進上述內容:如果您在masterand中編寫程式碼testing,您的代理如何知道要使用哪個環境?
  • 如果您可以詳細說明上述幾點並告訴我更多詳細資訊(並將其添加到您的問題中,評論可能太有限),我可能會提供幫助並擴展此答案。
  • 無論如何,祝你好運!puppetr10k,特別是如果加上 git 鉤子,是一個很棒的設置!自己用這個,太棒了!:)

附加資訊:

  • 感謝您詳細說明您的工作流程。
  • 如果你對 git 還不夠多才多藝,特別是如果你正在做很多分支和合併並且害怕合併衝突,請務必閱讀git rebase,它確實

在另一個基本提示之上重新應用送出

  • 假設您處於以下情況:

    • 你是masterto的分支feature1
    • file1:3-6feature1.
    • 您正在file1:7-10直接更改master以修復緊迫的錯誤。
    • 您想合併feature1master.
    • 通常,此時您會遇到合併衝突,因為在兩個分支中都修改了同一個文件。
    • 如果您在合併之前執行git rebase masterwhile on 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在您的控制倉庫中, to的分支testing
    • master在您的模組儲存庫中, to的分支testing
    • 在不改變你的情況下Puppetfile,使用你的控制倉庫分支的傀儡代理testing現在使用testing你的模組倉庫的分支。
    • 發展到你滿意為止。
    • 在您的模組儲存庫中,合併testingmaster.
    • 您開發的新程式碼現在將轉到所有使用生產程式碼的 puppet 代理,即master您的控制 repo 的分支。
  • 最後一點,現在:聽起來你是唯一一個開發程式碼的人,所以也許這對你來說並不重要,只是想讓你知道:

    • 如果兩個分支太有限,則很有可能在 puppet 代理執行期間使用不同的環境,而無需修改配置,而是通過提供 cli 參數:
    puppet agent -t --environment ${FEATURE_BRANCH}
    
  • 目前我能想到的就這些了。希望這會有所幫助,再次祝你好運,萬事如意!

引用自:https://serverfault.com/questions/876646