2017-08-30 6 views
0

Y at-il un moyen d'utiliser ce script (ou quelque chose qui ressemble à peu près la même chose) en tant que garde only_if dans le chef?Différent seulement-si la condition de garde pour le chef

#!/bin/bash 
application = application_name 
if (($(ps -ef | grep -v grep | grep $service | wc -l) > 0)) 
then *do something* 
fi 

J'ai essayé la voie classique, mais non plus ne renvoie rien si la condition only_if passe par défaut ou il me dit que je ne peux pas comparer une chaîne avec un entier (ce qui est évident).

execute "script" do 
command "my command here" 
only_if "$(ps -ef | grep -v grep | grep service_name | wc -l) > 0" 

Toutes les idées ou suggestions sont appréciées.

Répondre

2

Pour le convertir littéralement, vous devez utiliser la commande test, généralement aliasée [: only_if "[ $(ps -ef | grep -v grep | grep service_name | wc -l) > 0 ]". Mais vous pouvez aussi le faire un peu plus bien dans le code Ruby place:

only_if { shell_out!('ps -ef').include?('service_name') } 
+0

Bonjour, la commande de test fonctionne très bien, merci beaucoup. Cependant, lorsque j'essaie le deuxième morceau de code, je reçois cette erreur: "NoMethodError: méthode non définie' include? " pour # "Dois-je déclarer la méthode au préalable? – EdTed

0

Pour répondre à la question plus générale, si vous avez un script arbitraire que vous souhaitez utiliser pour votre garde only_if ou not_if, vous pouvez faire quelque chose le long ces lignes:

my_guard_script = File.join Chef::Config[:file_cache_path], 'my_guard_script.sh' 

file my_guard_script do 
    content <<- EOF 
#!/bin/sh 

# contents of your script here 
EOF 
end 

resource 'my_awesome_resource' do 
    some_parameter 'some_value' 
    only_if my_guard_script 
end 

Avertissement: Je n'ai pas testé cela, donc il y a probablement des bogues.