2016-12-16 29 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

是优秀的提示!谢谢。 –