วิธีการทำสิ่งต่าง ๆ ที่ยังไม่มีเชฟ


9

ให้เราบอกว่าฉันมีรหัสเชฟเช่น:

require 'mixlib/shellout'
yum_package 'somepackage'
myvar =  Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip

ในกรณีที่ยังไม่มีเพราะมันถูกติดตั้งโดย/bin/somecommand somepackageสิ่งนี้จะล้มเหลวในเวลารวบรวมสูตรด้วยเหตุผลดังกล่าว แต่จะทำงานได้อย่างชัดเจนในเวลาที่ลู่เข้าให้การติดตั้งแพ็คเกจสำเร็จแล้ว สิ่งนี้จะล้มเหลวเช่นกันหากมีการติดตั้งแพคเกจเป็นสูตรก่อนหน้าในรายการเรียกใช้เนื่องจากมีการรวบรวมทั้งหมดล่วงหน้า ฉันจะรวมสิ่งต่าง ๆ ในสูตรเชฟที่สูตรหรือ runlist ติดตั้งเองได้อย่างไร


สิ่งนี้ไม่เป็นปัญหาใน CFEngine
Gaius

1
myvarฉันจะหลีกเลี่ยงการใช้การประเมินโค้ดจากคำสั่งภายนอกในเวลารวบรวมโดยไม่ต้องมีความเข้าใจอย่างถ่องแท้เกี่ยวกับการใช้งานเว้นแต่จะจำเป็นต้องกำหนดทรัพยากรอื่น ๆ โดยสังเขปฉันจะทำruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }
Tensibai

@ Tenensai node.run_stateเป็นสิ่งที่ฉันกำลังมองหา - ขอบคุณ ตอบคำถามนั้นแล้วฉันจะยอมรับมัน!
ออกุสตุส

นั่นจะต้องรอจนถึงพรุ่งนี้ :) ยากเกินไปที่จะเขียนคำตอบที่ถูกต้องทางโทรศัพท์
Tensibai

คำตอบ:


4

ฉันจะไปกับnode.run_stateการเก็บตัวแปรชั่วคราวในการทำงานและกำหนดไว้ในruby_blockดังนั้นจึงเกิดขึ้นในเวลาบรรจบบางอย่างเช่นนี้:

yum_package 'somepackage'

ruby_block 'set myvar' do
  block do
    node.run_state['my_var'] = Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip
  end
end

เท่าที่ฉันรู้ว่าต้องมี 'mixlib / shellout' ไม่จำเป็น


2

ข้อมูลเฉพาะขึ้นอยู่กับกรณีการใช้งานที่แน่นอน หากมีการใช้ค่าเป็นคุณสมบัติในทรัพยากรอื่นคุณจะใช้lazyวิธีการช่วยเหลือ หากคุณไม่ต้องการผลลัพธ์คุณจะใช้executeทรัพยากร ในบางกรณีที่ซับซ้อนมากขึ้นคุณอาจใช้ruby_blockทรัพยากรหรือเขียนทรัพยากรที่คุณกำหนดเอง

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