Bagaimana melakukan file / dir ada kondisional di Wayang?

17

Saya mencoba untuk menulis fungsi dalam wayang yang akan melakukan failjika jalur direktori yang dilewati tidak ada.

if File["/some/path"]selalu mengembalikan true, dan if defined(File["/some/path"])hanya mengembalikan true jika sumber daya didefinisikan dalam wayang, terlepas dari apakah itu benar-benar ada.

Apakah ada cara untuk melakukan ini dengan ifpernyataan sederhana ?

Terima kasih

ddario
sumber
2
Ingat: manifes dikompilasi pada master. Mereka tidak tahu apa-apa tentang klien kecuali fakta yang disampaikannya. Jadi, tulis fakta yang memiliki info ini, atau mundur dan beri tahu kami apa yang sebenarnya ingin Anda selesaikan sehingga kami dapat menemukan pendekatan yang lebih baik daripada pernyataan if.
Dennis Kaarsemaker

Jawaban:

30

Solusi untuk ini: gunakan onlyif pada "tes" eksekutif dan minta dalam tindakan yang ingin Anda jalankan:

exec {"check_presence":
  command => '/bin/true',
  onlyif => '/usr/bin/test -e /path/must/be/available',
}

whatever {"foo...":
  .....
  require => Exec["check_presence"],
}
Pascal Schmiel
sumber
5
Oh itu jahat, saya suka :-)
Dennis Kaarsemaker
1
Bisa jadi lebih sederhana: exec {"test -e / path / must / be / available":}
Dennis Kaarsemaker
1
Terima kasih. Ini berfungsi baik untuk pemeriksaan dir tunggal. Namun, saya mencoba memvalidasi array direktori ... Jika saya menambahkan ini ke suatu fungsi, saya mendapatkan kesalahan 'tidak bisa redeclare'.
ddario
6
Ide bagus, tetapi ini berarti bahwa pada setiap Wayang akan ada pemberitahuan "Exec [check_presence] / Return: dieksekusi dengan sukses", yang benar-benar menjengkelkan! Lebih baik: exec {'check_presence': command => '/ bin / false', kecuali => '/ usr / bin / test -e / path / must / be / available',} Ini akan melakukan hal yang sama, tetapi hanya akan membuat kesalahan / pemberitahuan ketika jalur benar-benar tidak ada.
S0me0ne
2
Apa pun yang menyebabkan "keharusan" untuk gagal akan memberikan kesalahan karena apa pun yang memiliki dependensi gagal, baik menggunakan onlyif atau kecuali ... Jadi secara teknis itu berfungsi tetapi Anda akan mendapatkan banyak kesalahan yang dicatat dalam log boneka Anda ...
David Gardner
0

Saya juga mengalami kesulitan mencari cara agar modul tidak berjalan jika direktori tidak ada. Inilah yang saya temukan yang bekerja untuk saya.

exec { 'module_name':
   command => "command to run with variables", # Double quotes for Variable interpolation
   path   => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:",
   onlyif => 'test -d /mydirectory',
   }

Menambahkan jalan adalah yang benar-benar bermanfaat bagi saya. Dari beberapa alasan bahkan jika saya menambahkan path ke perintah tes seperti /bin/testitu sepertinya tidak berfungsi dengan benar.

Semoga ini bisa membantu orang lain yang mungkin memiliki masalah yang sama.

Mike Taylor
sumber
0

Anda juga dapat menggunakan fungsi built-in find_file () untuk itu ... ia mengembalikan undef ketika file / path tidak ada dan string jika ada.

https://puppet.com/docs/puppet/5.5/function.html#findfile

Mike
sumber
1
Ini hanya akan berjalan pada master, dan itu untuk mencari file dalam modul.
Bodgit
Terima kasih, tetapi Anda juga bisa menggunakannya untuk mencari file di OS dengan menyediakan path lengkap untuk itu atau tidak?
Mike
Hanya pada mesin tempat katalog sedang dikompilasi, yaitu master.
Bodgit
ya itu betul.
Mike