2016-12-16 57 views
1

我有這段代碼:木偶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

+1

你'onlyif'和'unless' 「命令」 其實都是外殼管道。如果這就是你所需要的,那麼你至少應該指定'provider =>'shell',這不是默認值。 –

+0

這是一個很棒的提示!但我發現我需要這樣做:'ps -ef | grep -v grep | grep mysqld_safe | grep wsrep-new-cluster「而不是'ps -ef | grep mysqld_safe | grep wsrep-new-cluster'。 –

+0

這聽起來像你已經排序。好,好。如果我確信'提供商'設置是一個完整的解決方案,那麼我就已經做出了答案。 –

回答

2

事實證明,我需要做這樣的:

ps -ef | grep -v grep | grep mysqld_safe | grep wsrep-new-cluster 

代替

ps -ef | grep mysqld_safe | grep wsrep-new-cluster 
+1

或者我喜歡做'ps -ef | grep [m] ysqld_safe | grep [w] srep-new-cluster',因爲它對我來說比較乾淨。另外考慮使用'-q'作爲'>/dev/null'的替代方案。 –

+0

是優秀的提示!謝謝。 –