Puppet Exec标记只有

时间:2016-12-16 21:01:47

标签: bash puppet

我有这段代码:

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

onlyif

如果设置了此参数,则只有在命令的退出代码为0时,此exec才会运行。例如:

exec { 'logrotate':
  path   => '/usr/bin:/usr/sbin:/bin',
  onlyif => 'test `du /var/log/messages | cut -f1` -gt 100000',
}

仅当该测试返回true时才会运行logrotate。

请注意,此命令遵循与main命令相同的规则,例如运行的用户和组。这也意味着如果未设置路径,则必须完全限定。

它也使用与主命令相同的提供程序,因此任何因提供程序而异的行为都将匹配。

另请注意,onlyif可以将数组作为其值,例如:

onlyif => ['test -f /tmp/file1', 'test -f /tmp/file2'],

如果 数组中的所有条件都返回true ,则只运行exec。

1 个答案:

答案 0 :(得分:2)

事实证明我需要这样做:

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

而不是

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