วิธีทำไฟล์ / dir มีเงื่อนไขใน Puppet อย่างไร


18

ฉันกำลังพยายามเขียนฟังก์ชั่นในหุ่นกระบอกที่จะทำfailถ้าเส้นทางไดเรกทอรีผ่านไม่มีอยู่

if File["/some/path"]คืนค่าจริงเสมอและif defined(File["/some/path"])คืนค่าจริงถ้าทรัพยากรถูกกำหนดเป็นหุ่นเชิดโดยไม่คำนึงว่ามีอยู่จริงหรือไม่

มีวิธีทำด้วยifคำสั่งง่ายๆหรือไม่

ขอบคุณ


2
ข้อควรจำ: รายชื่อจะถูกรวบรวมไว้ที่ตัวหลัก พวกเขาไม่รู้อะไรเลยเกี่ยวกับลูกค้ายกเว้นข้อเท็จจริงที่ส่งมา ดังนั้นเขียนความจริงที่มีข้อมูลนี้หรือถอยกลับมาแล้วบอกเราว่าคุณกำลังพยายามแก้ไขอะไรจริง ๆ เพื่อให้เราสามารถหาแนวทางที่ดีกว่าคำสั่ง if
Dennis Kaarsemaker

คำตอบ:


31

วิธีแก้ปัญหาสำหรับสิ่งนี้: ใช้ onlyif บน exec "test" และต้องการมันในการกระทำของคุณที่คุณต้องการใช้งาน:

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

whatever {"foo...":
  .....
  require => Exec["check_presence"],
}

5
โอ้นั่นเป็นสิ่งที่ชั่วร้ายฉันชอบมัน :-)
Dennis Kaarsemaker

1
อาจจะง่ายกว่า: exec {"ทดสอบ -e / path / must / be / available":}
Dennis Kaarsemaker

1
ขอบคุณ ใช้งานได้ดีสำหรับการตรวจสอบ dir เดียว อย่างไรก็ตามฉันกำลังพยายามตรวจสอบอาร์เรย์ของไดเรกทอรี ... ถ้าฉันเพิ่มสิ่งนี้ลงในฟังก์ชั่นฉันจะได้รับข้อผิดพลาด 'ไม่สามารถประกาศใหม่ได้'
ddario

6
ความคิดที่ดี แต่นั่นหมายความว่าทุกครั้งที่มีการเรียกใช้หุ่นกระบอกจะมีการแจ้งเตือน "Exec [check_presence] / return: execute สำเร็จ" ซึ่งน่ารำคาญจริงๆ! จะดีกว่า: exec {'check_presence': command => '/ bin / false' ยกเว้นว่า>> / usr / bin / test -e / path / must / be / available ',} สิ่งนี้จะทำเช่นเดียวกัน แต่ จะสร้างข้อผิดพลาด / การแจ้งเตือนเมื่อไม่มีเส้นทางจริงๆเท่านั้น
S0me0ne

2
สิ่งใดก็ตามที่ทำให้ "ต้องการ" ล้มเหลวจะทำให้เกิดข้อผิดพลาดเนื่องจากสิ่งใดก็ตามที่มีการพึ่งพาไม่สำเร็จไม่ว่าจะเป็นการใช้เพียงอย่างเดียวหรือเว้นแต่ ... เทคนิคในการทำงาน แต่คุณจะได้รับข้อผิดพลาดจำนวนมากที่บันทึกไว้ในบันทึกหุ่น ...
David Gardner

0

ฉันก็มีปัญหาในการหาวิธีการป้องกันไม่ให้โมดูลทำงานหากไม่มีไดเรกทอรีอยู่ นี่คือสิ่งที่ฉันพบว่าใช้งานได้สำหรับฉัน

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',
   }

การเพิ่มเส้นทางเป็นสิ่งที่หลอกลวงสำหรับฉัน จากเหตุผลบางอย่างแม้ว่าฉันจะเพิ่มเส้นทางไปยังคำสั่งทดสอบเช่น/bin/testมันดูเหมือนจะไม่ทำงาน

หวังว่านี่จะช่วยผู้อื่นที่อาจมีปัญหาเดียวกัน


0

คุณสามารถใช้ฟังก์ชั่นในตัว find_file () สำหรับมัน ... มันจะคืนค่า undef เมื่อไม่มีไฟล์ / พา ธ และมีสตริงหากมีอยู่

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


1
สิ่งนี้จะทำงานบนมาสเตอร์เท่านั้นและใช้สำหรับค้นหาไฟล์ในโมดูล
bodgit

ขอบคุณ แต่คุณสามารถใช้มันเพื่อค้นหาไฟล์บนระบบปฏิบัติการโดยระบุเส้นทางแบบเต็มให้หรือไม่
Mike

เฉพาะในเครื่องที่แคตตาล็อกจะถูกรวบรวมเช่นต้นแบบ
bodgit

ใช่ถูกต้อง.
Mike
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.