Bagaimana cara memastikan layanan berjalan, menggunakan Chef?

10

Saya berada dalam situasi di mana Chef mungkin memulai layanan (postgres) tetapi selanjutnya mungkin akan dihentikan. Saya ingin menjalankan Chef berikutnya untuk menyebabkan layanan berjalan. Saya sudah mencoba ini:

service "postgresql" do
    action :start
end

Tapi itu tidak berpengaruh, mengatakan (up to date)mungkin karena Chef tahu itu sudah dimulai dan tidak dapat mengatakan bahwa itu telah berhenti. (Mungkin karena bagaimana service ... statusberperilaku untuk layanan ini?) Jika saya menulis ini:

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

Saya mendapatkan perilaku yang diinginkan. Juga action :restartmembuatnya berjalan. Namun ini sepertinya anti-pola karena portabilitas (dan berpotensi menghentikannya sebelum memulai lagi dalam kasus terakhir).

Jadi, bagaimana saya bisa memberi tahu Chef untuk secara paksa memulai layanan, meskipun menurutnya sudah berjalan?

Ini menggunakan Chef 11.6, di-host oleh OpsCode, dan resep postgresql default. (Catatan ini mirip tapi saya pikir tidak persis sama dengan Bagaimana memaksa tindakan pada sumber daya "terkini" di Chef? )

--- EDIT (klarifikasi mengikuti posting jtimberland) ---

Di -l debugsini menunjukkan:

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

Bahkan ketika itu TIDAK berjalan. Jadi itu terdengar seperti satu bug, dan saya tertarik pada itu. Namun saya terutama tertarik pada apakah ada cara untuk memberitahu Chef "selalu memohon perintah mulai layanan, melewatkan pemeriksaan status". Itu pertanyaannya di sini.

(Saya bukan ahli tapi saya pikir cara paling portabel untuk memastikan layanan berjalan adalah memulai layanan dan itu hampir selalu idempoten. OTOH memeriksa apakah suatu layanan berjalan kurang konsisten dan saya tidak melihat mengapa kita harus peduli !)

Berawan
sumber

Jawaban:

11

Secara default, Chef akan memeriksa apakah layanan berjalan, dan memulainya jika layanan tidak berjalan.

Bagaimana menentukan bahwa layanan sedang berjalan tergantung.

Secara default, Chef akan berusaha mencocokkan nama layanan (di postgresqlsini) di tabel proses menggunakan ps.

ps -ef | grep postgresql

Intinya. Nama layanan akan digunakan untuk kecocokan pola saat memeriksa tabel proses. Ini mungkin atau mungkin bukan apa yang Anda inginkan / butuhkan, terutama tergantung pada platform dan bagaimana ia menamai layanan "postgresql".

Namun, Anda dapat memberi tahu Chef bahwa layanan tersebut mendukung perintah "status", yang berarti Chef umumnya akan melakukan sesuatu seperti,

/etc/init.d/postgresql status

Dan gunakan kode pengembalian untuk menentukan apakah itu berjalan atau tidak (bukan nol tidak berjalan).

Chef tidak melakukan ini secara default karena tidak semua skrip layanan mendukung perintah status (frustasi), dan Chef tidak tahu apa yang harus dilakukan. Ia mencoba melakukan hal standar waras, tetapi terkadang naif. Dengan demikian, Anda dapat memberi tahu Chef bahwa sumber daya memiliki perintah status dan tidak terlalu naif.

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

Sekarang, jika layanan tidak benar-benar bernama "postgresql" tetapi sebaliknya "postgresql-92" atau serupa, Anda dapat melakukan ini sebagai:

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

atau

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

Anda dapat mengetahui apa yang terjadi secara lebih rinci dengan menjalankan chef dengan hasil debug, juga:

chef-client -l debug
jtimberman
sumber
Ini berguna tetapi tidak cukup menjawab pertanyaan. Saya ingin menceritakannya :start terlepas dari :status. Saya juga berharap itu melakukan ps -ef | grep [p]ostgresqlatau serupa, kalau tidak biasanya akan cocok dengan perintah grep sendiri dan dengan demikian selalu berpikir layanan berjalan (Atau mungkin itu masalah mendasarnya?)
Sebagian Mendung
Menurut saya ada bug di Chef, atau ada yang salah pada sistem. Platform / platform_version apa yang Anda jalankan? Bagaimana Anda menginstal postgresql? Paket, sumber?
jtimberman
Untuk sedikitpun, Chef mengambil tindakan idempoten untuk mengelola sumber daya yang didefinisikan secara deklaratif. Cara Anda memastikan suatu layanan berjalan dengan Chef adalah mengirimkan tindakan mulai ke layanan tersebut. Jika itu tidak terjadi, itu adalah bug di Chef, bug di resep, atau bug di sistem.
jtimberman
Terima kasih @jtimberman. Saya telah membuka bug untuk status yang salah dikembalikan di tickets.opscode.com/browse/COOK-334 . Namun pertanyaan saya di sini adalah apakah ada cara untuk memaksa chef untuk mengeluarkan perintah service-start, melewatkan pemeriksaan status. service starthampir selalu idempoten jadi ini harus baik-baik saja.
Sebagian Mendung
Maaf, bug adalah tickets.opscode.com/browse/COOK-3526 .
Sebagian Mendung