Check for existing directory fails in Ruby + Chef -


this piece of ruby in chef recipe:

# if datadir doesn't exist, move on default 1 if !file.exist?("/vol/postgres/data")     execute "mv /var/lib/postgresql/9.1/main /vol/postgres/data" end 

the result is:

executing mv /var/lib/postgresql/9.1/main /vol/postgres/data mv: inter-device move failed: `/var/lib/postgresql/9.1/main' `/vol/postgres/data/main'; unable remove target: directory 

i know /vol/postgres/data exists , directory, yet still attempts execute mv. why?

just sure, running following standalone ruby script on same machine outputs "nomv":

if !file.exist?("/vol/postgres/data") print "mv" else print "nomv" end 

i not attentive earlier, thought checking file existence in not_if or only_if block. problem similar 1 in question: chef lwrp - defs/resources execution order. see detailed explanation there.

your problem !file.exist?("/vol/postgres/data") code gets executed straight away - (because it's pure ruby), before resource executed , before postgress installed.

the solution should move check not_if block.

execute "mv /var/lib/postgresql/9.1/main /vol/postgres/data"   not_if { file.exist?("/vol/postgres/data") } end 

Comments