que - Entendiendo Chef only_if not_if
learn chef (2)
No estoy seguro de entender la ejecución condicional del Chef.
Me gustaría realizar una ejecución condicional en función de si existe o no una base de datos en Postgresql
Así que aquí está mi ejemplo
execute "add_db" do
cwd "/tmp"
user "dbuser"
command "createdb -T template_postgis mydb"
not_if ''psql --list|grep mydb''
end
Ejecutando psql --list|grep mydb
devuelva lo que esperaría si existiera la db (la línea con la entrada dbname) y nada en absoluto si no es así.
Entonces, ¿cómo not_if solo evalúa eso? ¿Verdadero o falso? 1 o 0? ¿No todos los procesos devuelven 0 si tienen éxito?
Cualquier consejo sería muy apreciado!
Ejecute la prueba usted mismo, desde la línea de comando, y observe el valor de retorno predeterminado (también conocido como "$?"). Deberías conseguir algo como esto:
% psql --list|grep mydb
mydb-is-here
% echo $?
0
Si intentas algo que no está allí, deberías obtener algo como esto:
% psql --list|grep mydb-not-here
% echo $?
1
Lo que el chef examinará es el valor numérico que se acumularía en $ ?, es decir, un "0" o un "1". En otras palabras, su ejemplo que muestra para la sintaxis "not_if" es correcto.
Me acabo de encontrar con este problema. Mi problema fue que el comando not_if se estaba ejecutando como ''root'', no ''dbuser''. Si lo cambias a
not_if ''psql --list|grep mydb'', :user => ''dbuser''
entonces puede obtener los resultados que estaba buscando.