Cfengine
根據命令輸出設置 cfengine3 類
這個問題與我如何在 cfengine3 中使用命令的輸出非常相似,但我相信答案不適用於我的情況。
我想通過“git pull”更新一個 git 儲存庫,並根據是否導致更改觸發一些後續操作。
簡化後,如果通過某個主體有“匹配輸出和設置類”之類
if_output_matches
的東西,我會想使用這樣的東西:bundle agent updateRepo { commands: "/usr/bin/git pull" contain => setuidgiddir_sh("$(globals.user)","$(globals.group)","$(target)"), classes => if_output_matches("Already up-to-date.","no_update"); reports: no_update:: "nothing updated"; } body contain setuidgiddir_sh(owner,group,folder) { exec_owner => "$(owner)"; exec_group => "$(group)"; useshell => "true"; chdir => "$(folder)";
}
那麼,是否可以使用一個可能很昂貴的命令的輸出並以此為基礎做出一些決定?
該
execresult
功能對我來說不是一個好的選擇,因為 a) 拉取有時可能會變得昂貴(不建議遵循 cfengine3 參考)並且 b) 不允許指定使用者、組、工作目錄 - 這對我來說很重要。儲存庫位於使用者空間中,不屬於 root。
實現此目的的一種方法是使用CFEngine 支持的模組協議。有了這個,您可以從腳本本身設置任意類和變數。例如,這樣的腳本(未經測試):
#!/bin/bash if git pull | grep -q 'Already up-to-date.'; then echo "+no_update" fi
將其儲存在 /var/cfengine/modules/update_git 中,然後您可以執行以下操作:
commands: "update_git" contain => setuidgiddir_sh("$(globals.user)","$(globals.group)","$(target)"), module => "true";
然後
no_update
像以前一樣採取行動。您可能可以通過使用keep/repaired/failed_returncodes 屬性的類主體來實現類似的效果,但是模組看起來更簡潔、更具表現力。