2011-12-05 7 views
25

Im no estoy seguro Entiendo la ejecución condicional del Chef.Comprensión Chef only_if not_if

me gustaría hacer algo de 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 

de reproducción psql --list|grep mydb regresar lo que se esperaría si existe la db (la línea con la entrada dbname) y nada en absoluto si no es así.

Entonces, ¿cómo no_si solo evaluar eso? ¿Verdadero o falso? 1 o 0? ¿No devuelven todos los procesos 0 si tienen éxito?

¡Cualquier consejo sería muy apreciado!

Respuesta

21

Acabo de toparme con este problema. Mi problema era que el comando not_if se estaba ejecutando como 'root', no 'dbuser'. Si lo cambia a

not_if 'psql --list|grep mydb', :user => 'dbuser' 

entonces puede obtener los resultados que estaba buscando.

http://tickets.opscode.com/browse/CHEF-438

+5

Mi situación era un poco diferente, así que dejaré una nota aquí para futuros usuarios en una situación similar que aterrizaron aquí. Digamos que tiene un atributo 'node ['myattr'] = true', luego si escribe' only_if node ['myattr'] ', chef se quejará. Descubrí que debe adjuntar la declaración en llaves, es decir. 'only_if {node ['myattr']}' – apatrick

19

Ejecute la prueba usted mismo, desde la línea de comandos, y eche un vistazo al valor de retorno predeterminado (a.k.a., "$?"). Usted debe obtener algo como esto:

% psql --list|grep mydb 
    mydb-is-here 
    % echo $? 
    0 

Si intenta algo que no está allí, usted debe obtener algo como esto:

% psql --list|grep mydb-not-here 
    % echo $? 
    1 

Lo cocinero va a estar mirando es el valor numérico que se rellenaría en $ ?, es decir, un "0" o un "1". En otras palabras, su ejemplo que muestra para la sintaxis "not_if" es correcto.

+0

Por ejemplo, cómo se les dio un ejemplo de cómo la figura hacia fuera de la existencia propia! –

+6

Normalmente agrego un -q a la invocación grep al ponerlo en una receta para que la salida chef-cliente no se sature con ninguna coincidencia producida por grep. –