我有这段代码:木偶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'。 –
这听起来像你已经排序。好,好。如果我确信'提供商'设置是一个完整的解决方案,那么我就已经做出了答案。 –