จะมั่นใจได้อย่างไรว่าบริการกำลังทำงานโดยใช้เชฟ


10

ฉันอยู่ในสถานการณ์ที่เชฟอาจเริ่มให้บริการ (postgres) แต่ในภายหลังอาจหยุดสายนอก ฉันต้องการให้พ่อครัวคนต่อไปทำงานเพื่อให้บริการทำงาน ฉันได้ลองสิ่งนี้แล้ว:

service "postgresql" do
    action :start
end

แต่มันไม่มีผลใด ๆ การพูดอย่าง(up to date)น่าจะเป็นเพราะเชฟรู้ว่ามันเริ่มแล้วและไม่สามารถบอกได้ว่ามันหยุดแล้ว (อาจเป็นเพราะservice ... statusพฤติกรรมการใช้บริการนี้ได้อย่างไร) ถ้าฉันเขียนสิ่งนี้:

# anti-pattern warning!
execute "force-start-postgresql" do
  command "service postgresql start || /etc/init.d/postgresql start"
  action :run
end

ฉันได้รับพฤติกรรมที่ต้องการ ยังaction :restartทำให้มันทำงาน อย่างไรก็ตามสิ่งเหล่านี้ดูเหมือนจะเป็นรูปแบบการต่อต้านเนื่องจากการพกพา (และอาจหยุดมันก่อนที่จะเริ่มอีกครั้งในกรณีหลัง)

ดังนั้นฉันจะบอกเชฟให้บังคับใช้บริการได้อย่างไรแม้ว่ามันจะคิดว่ามันกำลังทำงานอยู่แล้ว

นี่คือการใช้ Chef 11.6 โฮสต์โดย OpsCode และสูตร postgresql เริ่มต้น (หมายเหตุสิ่งนี้คล้ายกัน แต่ฉันคิดว่าไม่เหมือนกันกับวิธีการบังคับให้ดำเนินการกับทรัพยากร "ทันสมัย" ใน Chef? )

--- แก้ไข (ชี้แจงต่อไปนี้ jtimberland โพสต์) ---

-l debugนี่แสดงให้เห็นว่า:

DEBUG: service[postgresql] supports status, running
DEBUG: service[postgresql] is running

แม้ว่ามันจะไม่ทำงาน นั่นฟังดูเหมือนแมลงตัวหนึ่งและฉันสนใจสิ่งนั้น อย่างไรก็ตามในขั้นต้นฉันสนใจว่ามีวิธีการบอกเชฟหรือไม่ "เรียกใช้คำสั่งเริ่มบริการเสมอโดยข้ามการตรวจสอบสถานะ" นั่นคือคำถามที่นี่

(ฉันไม่ใช่ผู้เชี่ยวชาญ แต่ฉันคิดว่าวิธีพกพาที่สุดในการตรวจสอบให้แน่ใจว่าบริการกำลังทำงานอยู่เพื่อเริ่มบริการและนั่นก็คือ idempotent เกือบตลอดเวลา OTOH ตรวจสอบว่าบริการทำงานไม่สอดคล้องกันหรือไม่และทำไมเราไม่สนใจ !)

คำตอบ:


11

โดยค่าเริ่มต้น Chef จะตรวจสอบว่าบริการกำลังทำงานอยู่หรือไม่และเริ่มทำงานถ้าบริการไม่ทำงาน

มันเป็นตัวกำหนดว่าบริการที่ทำงานอยู่ขึ้นอยู่กับ

โดยค่าเริ่มต้นเชฟจะพยายามเพื่อให้ตรงกับชื่อของบริการ (คนpostgresqlที่นี่) psในตารางขั้นตอนโดยใช้

ps -ef | grep postgresql

เป็นหลัก ชื่อของบริการจะถูกใช้สำหรับการจับคู่รูปแบบเมื่อตรวจสอบตารางกระบวนการ นี่อาจเป็นหรือไม่ใช่สิ่งที่คุณต้องการ / ต้องการโดยเฉพาะอย่างยิ่งขึ้นอยู่กับแพลตฟอร์มและวิธีการตั้งชื่อบริการ "postgresql"

อย่างไรก็ตามคุณสามารถบอกกับ Chef ได้ว่าบริการรองรับคำสั่ง "สถานะ" ซึ่งหมายความว่าโดยทั่วไปพ่อครัวจะทำสิ่งต่าง ๆ เช่น

/etc/init.d/postgresql status

และใช้รหัสส่งคืนเพื่อตรวจสอบว่ามันกำลังทำงานอยู่หรือไม่ (ไม่ใช่ศูนย์ไม่ทำงาน)

โดยค่าเริ่มต้น Chef ไม่ได้ทำเช่นนี้เพราะสคริปต์บริการทั้งหมดไม่สนับสนุนคำสั่งสถานะ (เฉื่อยชา) และเชฟไม่ทราบว่าสิ่งที่ถูกต้องคืออะไร มันพยายามทำสิ่งที่มีค่าเริ่มต้นที่มีสติ แต่บางครั้งก็ไร้เดียงสา ดังนั้นคุณสามารถบอก Chef ว่าทรัพยากรมีคำสั่งสถานะและไม่ไร้เดียงสา

service "postgresql" do
  supports :status => true
  action :start
end

ทีนี้ถ้าบริการไม่ได้ชื่อว่า "postgresql" แต่เป็น "postgresql-92" หรือที่คล้ายกันแทนคุณสามารถทำได้ดังนี้:

service "postgresql-92" do
  supports :status => true
  action :start
end

หรือ

service "postgresql" do
  service_name "postgresql-92"
  supports :status => true
  action :start
end

คุณสามารถค้นหาสิ่งที่เกิดขึ้นในรายละเอียดเพิ่มเติมได้โดยการเรียกใช้ Chef ด้วย debug output เช่นกัน:

chef-client -l debug

สิ่งนี้มีประโยชน์ แต่ไม่ค่อยตอบคำถาม ผมอยากจะบอกว่ามัน:start ไม่คำนึงถึง:statusของ นอกจากนี้ฉันหวังว่ามันจะps -ef | grep [p]ostgresqlคล้ายหรืออย่างอื่นมันมักจะตรงกับคำสั่ง grep ของตัวเองและทำให้คิดว่าบริการกำลังทำงานอยู่เสมอ (หรืออาจเป็นปัญหาพื้นฐาน)
เมฆบางส่วน

ดูเหมือนว่าฉันมีข้อผิดพลาดใน Chef หรือมีบางอย่างผิดปกติในระบบ คุณกำลังใช้แพลตฟอร์ม / platform_version ใดอยู่ คุณติดตั้ง postgresql ได้อย่างไร? แพคเกจแหล่งที่มา?
jtimberman

ส่วนเล็กน้อยเชฟดำเนินการ idempotent เพื่อจัดการทรัพยากรที่กำหนดไว้ในวิธีการเปิดเผย วิธีที่คุณมั่นใจได้ว่าบริการกำลังทำงานโดยเชฟคือการส่งการกระทำเริ่มต้นไปยังบริการ หากสิ่งนั้นไม่ได้เกิดขึ้นแสดงว่าเป็นข้อผิดพลาดใน Chef ข้อผิดพลาดในสูตรหรือจุดบกพร่องบนระบบ
jtimberman

ขอบคุณ @ jtimberman ผมได้เปิดข้อผิดพลาดสำหรับสถานะที่ไม่ถูกต้องถูกส่งกลับไปที่tickets.opscode.com/browse/COOK-334 อย่างไรก็ตามคำถามของฉันที่นี่คือไม่ว่าจะมีวิธีการบังคับให้เชฟออกคำสั่งบริการเริ่มข้ามการตรวจสอบสถานะ service startidempotent เกือบตลอดเวลาดังนั้นสิ่งนี้ควรจะดี
เมฆบางส่วน

ขออภัยข้อผิดพลาดคือtickets.opscode.com/browse/COOK-3526
เมฆบางส่วน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.