จะใช้คำสั่งสถานะที่กำหนดเองสำหรับบริการในหุ่นเชิดได้อย่างไร?


10

ฉันใช้เดเบียนบีบกับ PostgreSQL 9.1 จาก backports Puppet มีเวอร์ชั่น 2.7.14 น่าเสียดายที่สคริปต์เริ่มต้นส่งคืนรหัสออกที่ผิดสำหรับสถานะ ดังนั้นฉันจึงเขียนstatusคำสั่งที่กำหนดเองเพื่อตรวจสอบว่า postgresql กำลังทำงานอยู่หรือไม่

service { 'postgresql':
  ensure => running,
  enable => true,
  hasstatus  => false,
  hasrestart => true,
  status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if ($4 != \"online\") rc=3} END { exit rc }'",
  provider => debian,
}

คำสั่งของฉันทำงานเหมือนเครื่องราง แต่หุ่นดูเหมือนจะมีปัญหา ฉันมักจะได้รับnotice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'แม้ว่ามันจะทำงานอยู่แล้ว

ดังนั้นลองต่อไปนี้:

service { 'postgresql':
  ensure => running,
  enable => true,
  hasstatus  => false,
  hasrestart => true,
  status => "exit 0",
  provider => debian,
}

เมื่อฉันเข้าใจstatusคำสั่งที่กำหนดเองหุ่นกระบอกควรคิดว่า postgresql กำลังทำงานอยู่ อย่างไรก็ตามหุ่นกระบอกพยายามที่จะเริ่ม postgresql - ทุกครั้ง

ความผิดของฉันคืออะไร หรือเป็นข้อบกพร่องในหุ่นเชิด


ไฟล์ Manifest ของคุณดูถูกต้องดังนั้นนี่จึงเป็นข้อบกพร่องในหุ่นกระบอก มันใช้เวลานาน แต่ลองตั้งค่าprovider => init(และลบenableพารามิเตอร์)
mgorven

2
คุณแน่ใจหรือว่าออก 0 เป็นคำสั่งที่ถูกต้อง? คำสั่ง exit มักอยู่ภายในเชลล์ คุณต้องการทำอะไรเช่น bash -c 'exit 0' หรือไม่?
Zoredache

@Zoredache คุณพูดถูก ด้วย sh -c 'exit 0' statusคำสั่งของหุ่นเชิดจะทำงานตามที่คาดไว้!
MMore

คำตอบ:


6

การคาดเดาที่ดีที่สุดของฉันคือการที่$4คำสั่งของคุณกำลังถูกกลืนหายไปโดยการสอดแทรกของหุ่นกระบอกและมันexit 0ก็ไม่ได้ผลนักเนื่องจากปัญหาการโต้ตอบของเชลล์

ฉันจะลองบางสิ่ง

  1. หากปัญหาคือการแก้ไขของหุ่นเชิด$4ในคำสั่งของคุณให้หลีกเลี่ยงสิ่งต่อไป$นี้: status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"(บางครั้งต้องใช้แบ็กสแลชมากกว่า แต่ฉันค่อนข้างแน่ใจว่า 1 เพียงพอแล้วที่นี่)
  2. ตรวจสอบให้แน่ใจว่าคำสั่งทดสอบใช้งานได้จริง exitเป็นเปลือกภายในและฉันไม่แน่ใจว่าหุ่นเชิดจะปฏิบัติต่อมันอย่างไร ดังนั้นให้ใช้คำสั่ง canonical "return success" แทน:status => "/bin/true"
  3. อาจstatusจะถูกแทนที่โดยprovider => debian(ซึ่งจะเป็นข้อผิดพลาดหุ่นเชิด) ดังนั้นแทนที่จะระบุคำสั่งทั้งหมดและใช้ผู้ให้บริการฐาน (นี้จะไม่เปิดใช้งานอย่างถูกต้อง แต่):

    service { 'postgresql':
      provider => base,
      ensure   => 'running',
      start    => '/etc/init.d/postgresql start',
      restart  => '/etc/init.d/postgresql restart',
      stop     => '/etc/init.d/postgresql stop',
      status   => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'",
    }
    

อีกอย่างหนึ่ง: คล้ายกับexecประเภทฉันคิดว่าหุ่นกระบอกต้องการพา ธ เต็มไปยังไฟล์ที่เรียกทำงานได้ ลองตั้งค่าเหล่านั้นเป็นเส้นทางแบบเต็มในstatusบรรทัดของคุณถ้าคุณยังไม่ได้ตั้งค่าทั่วโลก?
Shane Madden

@ShaneMadden: หุ่นเชิดไม่จำเป็นต้องมีพา ธ เต็มไปยังคำสั่งแม้ว่าจะสมมติว่ามันต้องการมันก็ไม่เจ็บอะไรเลย นอกจากการจัดเรียงของบางเส้นทางเริ่มต้น (PATH ในสภาพแวดล้อมภูตเริ่มต้นในปี?) execยอมรับpathพระรามและคุณสามารถกำหนดเส้นทางเริ่มต้นด้วยหรือExec { path => '/usr/bin:/bin' } Exec { path => ['/usr/bin'],['/bin']}มี 'เส้นทาง' ที่คล้ายกันบน Service แต่ดูเหมือนว่าจะใช้กับผู้ให้บริการบางรายในการค้นหาสคริปต์เริ่มต้นแทนที่จะเป็นเส้นทางการค้นหาคำสั่งเชลล์สไตล์ปกติ
Freiheit

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