我有這段代碼:木偶Exec的標籤onlyif困擾
if ($galera_master == $::fqdn) {
if ($vendor_type == 'GoofyIT') {
$onlyif = [
"ps -ef | grep mysqld_safe | grep wsrep-new-cluster > /dev/null",
"test $desired_cluster_size == $(mysql --defaults-file=/root/.my.cnf -e \"SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size'\" | grep wsrep_cluster_size | awk '{print \$2}') > /dev/null",
]
$unless = [ "test $desired_cluster_size -lt $(/usr/bin/mysql --defaults-file=/root/.my.cnf -e \"SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size'\" | grep wsrep_cluster_size | awk '{print \$2}')",
"ps -ef | grep mysqld_safe | grep wsrep-new-cluster && false",
]
Exec['bootstrap_galera_cluster'] -> Exec['finish_bootstrap']
exec { 'finish_bootstrap':
path => '/usr/bin:/bin:/usr/sbin:/sbin',
command => 'pkill -SIGQUIT mysqld; sleep 5; systemctl restart mysqld',
onlyif => $onlyif,
#unless => $unless,
}
}
}
在哪裏這段代碼運行我的節點我具備這些條件:
# test 3 -eq $(/usr/bin/mysql --defaults-file=/root/.my.cnf -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size'" | grep wsrep_cluster_size | awk '{print $2}')
# echo $?
0
# ps -ef | grep mysqld_safe | grep wsrep-new-cluster
# echo $?
1
所以我認爲,當傀儡代理在我的節點上運行,我不應該看到pkill -SIGQUIT mysqld; sleep 5; systemctl restart mysqld
執行。然而當我運行puppet agent -td
時,我發現傀儡代理正在執行pkill -SIGQUIT mysqld; sleep 5; systemctl restart mysqld
。
The documentation for Exec's onlyif tag這樣說:
exec { 'logrotate':
path => '/usr/bin:/usr/sbin:/bin',
onlyif => 'test `du /var/log/messages | cut -f1` -gt 100000',
}
:
onlyif
如果該參數被設置,那麼此exec將僅當該命令具有的退出代碼0。例如運行
只有當該測試返回true時,纔會運行logrotate。
請注意,該命令遵循與主命令相同的規則,例如運行哪個用戶和組。這也意味着如果路徑沒有設置,它必須是完全限定的。
它也使用與main命令相同的提供者,所以任何不同提供者的行爲都會匹配。
還要注意的是onlyif可以採取一個數組作爲它的值,例如:
onlyif => ['test -f /tmp/file1', 'test -f /tmp/file2'],
這隻會運行exec,如果陣列中的所有條件返回true。
你'onlyif'和'unless' 「命令」 其實都是外殼管道。如果這就是你所需要的,那麼你至少應該指定'provider =>'shell',這不是默認值。 –
這是一個很棒的提示!但我發現我需要這樣做:'ps -ef | grep -v grep | grep mysqld_safe | grep wsrep-new-cluster「而不是'ps -ef | grep mysqld_safe | grep wsrep-new-cluster'。 –
這聽起來像你已經排序。好,好。如果我確信'提供商'設置是一個完整的解決方案,那麼我就已經做出了答案。 –