Puppet Exec tag only if troubles
Puppet Exec tag onlyif troubles
我有这段代码:
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,
}
}
}
在我的节点上,这段代码 运行s 我有这些条件:
# 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 }')
# 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 将仅在命令的退出代码为 0 时 运行。例如:
exec { 'logrotate':
path => '/usr/bin:/usr/sbin:/bin',
onlyif => 'test `du /var/log/messages | cut -f1` -gt 100000',
}
仅当该测试 return 为真时,才会 运行 logrotate。
请注意,此命令遵循与主命令相同的规则,例如 运行 作为哪个用户和组。这也意味着如果没有设置路径,它必须是完全限定的。
它还使用与主命令相同的提供程序,因此提供程序不同的任何行为都将匹配。
还要注意onlyif可以取一个数组作为它的值,例如:
onlyif => ['test -f /tmp/file1', 'test -f /tmp/file2'],
如果数组中的所有条件returntrue,这只会运行执行。
原来我需要这样做:
ps -ef | grep -v grep | grep mysqld_safe | grep wsrep-new-cluster
而不是
ps -ef | grep mysqld_safe | grep wsrep-new-cluster
我有这段代码:
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,
}
}
}
在我的节点上,这段代码 运行s 我有这些条件:
# 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 }')
# 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 将仅在命令的退出代码为 0 时 运行。例如:
exec { 'logrotate':
path => '/usr/bin:/usr/sbin:/bin',
onlyif => 'test `du /var/log/messages | cut -f1` -gt 100000',
}
仅当该测试 return 为真时,才会 运行 logrotate。
请注意,此命令遵循与主命令相同的规则,例如 运行 作为哪个用户和组。这也意味着如果没有设置路径,它必须是完全限定的。
它还使用与主命令相同的提供程序,因此提供程序不同的任何行为都将匹配。
还要注意onlyif可以取一个数组作为它的值,例如:
onlyif => ['test -f /tmp/file1', 'test -f /tmp/file2'],
如果数组中的所有条件returntrue,这只会运行执行。
原来我需要这样做:
ps -ef | grep -v grep | grep mysqld_safe | grep wsrep-new-cluster
而不是
ps -ef | grep mysqld_safe | grep wsrep-new-cluster