user1074593
user1074593

Reputation: 630

Puppet : file resource only if file exists

What I want to do is quite simple :

1.

Copy /source/file to /target/file. I achieve this using the following:

file { 'my_file_copy':
  ensure   => file,
  source   => 'file:/source/file',
  path     => "/target/file",
}

2.

However, if file /source/file does not exist, I do NOT want it to perform this task.

I am really struggling with this logic. I attempted the solution below but it throws exceptions during puppet run.

puppet: if one file exists then copy another file over

Is there a better way of achieving this task ? Ideally, I would like to only use "file" and avoid using "exec". But at this point I would settle for a solution !

Upvotes: 3

Views: 34098

Answers (3)

Sergey Botsman
Sergey Botsman

Reputation: 31

In my case work only with if

if (find_file("/source/file"))  {
  file { "/source/file":
    ensure => present,
    mode   => '0644',
    owner  => root,
    group  => root,
  }
}

Upvotes: 1

Innocent Anigbo
Innocent Anigbo

Reputation: 4757

You could use this logic:

$file = "/source/file"

  exec { "chk_${file}_exist":
    command => "true",
    path    =>  ["/usr/bin","/usr/sbin", "/bin"],
    onlyif  => "test -f ${file}"
  }

  file {"/target/file":
    ensure => file,
    source => 'file:/source/file',
    owner  => 'root',
    group  => 'root',
    mode   => '0750',
    require => Exec["chk_${file}_exist"],
  }

Upvotes: 1

Alex Harvey
Alex Harvey

Reputation: 15472

Because Puppet is a declarative language where only the end-state is declared, imperative logic such as what you've described - if A, do X - is often hard to express.

Personally, I would try to simply avoid this requirement of having file B copied if and only if file A exists. Often there's a better way.

If the requirement needs to stay, however, then use of Exec here sounds like a pretty good option to me.

exec { 'my_file_copy':
  command => 'cp /source/file /target/file',
  onlyif  => 'test -e /source/file',
  creates => '/target/file',
  path    => '/bin',
}

Upvotes: 8

Related Questions