Chef kullanarak bir hizmetin çalışmasını nasıl sağlayabilirim?


10

Şef'in bir hizmet (postgres) başlatabileceği bir durumdayım, ancak daha sonra bant dışı bırakılabilir. Hizmetin çalışmasını sağlamak için sonraki bir şef çalıştırmak istiyorum. Bunu denedim:

service "postgresql" do
    action :start
end

Ama (up to date)muhtemelen , şefin başlatıldığını bildiğini ve durduğunu söyleyemediğini söyleyerek hiçbir etkisi yoktur . (Muhtemelen service ... statusbu hizmet için nasıl davranıyor?)

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

İstenen davranışı elde ederim. Ayrıca bir çalışma action :restartyapar. Bununla birlikte, bunlar taşınabilirlik nedeniyle anti-paternler gibi görünür (ve ikinci durumda tekrar başlatmadan önce potansiyel olarak durdurur).

Peki, Chef'e zaten çalıştığını düşünmesine rağmen servisi zorla başlatmasını nasıl söyleyebilirim?

Bu OpsCode tarafından barındırılan Chef 11.6 ve varsayılan postgresql tarifi kullanıyor. (Bu benzer ancak ben aynı değil düşünmek Not Şef "güncel" kaynaklar üzerindeki eylemleri zorlamak nasıl? .)

--- EDIT (jtimberland yazısını takiben açıklama) ---

-l debugBurada şovları:

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

Çalışmıyorken bile. Yani bu bir hata gibi geliyor ve ben bununla ilgileniyorum. Ancak öncelikle Chef'e "her zaman servis başlatma komutunu çağır, durum kontrolünü atla" demenin bir yolu olup olmadığıyla ilgileniyorum. Burada soru bu.

(Uzman değilim ama bir hizmetin çalışmasını sağlamanın en taşınabilir yolunun hizmeti başlatmak olduğunu düşünüyorum ve neredeyse her zaman idempotent. OTOH bir hizmetin çalışıp çalışmadığını kontrol etmek daha az tutarlı ve neden önemsememiz gerektiğini anlamıyorum !)

Yanıtlar:


11

Varsayılan olarak, Şef hizmetin çalışıp çalışmadığını kontrol eder ve hizmet çalışmadığında başlatır.

Hizmetin çalıştığını nasıl belirlediğine bağlıdır.

Varsayılan olarak, Şef postgresqlişlem tablosundaki hizmetin adını ( burada) eşleştirmeye çalışacaktır ps.

ps -ef | grep postgresql

Esasen. Hizmet adı, işlem tablosunu incelerken desen eşleşmesi için kullanılacaktır. Bu, özellikle platforma ve "postgresql" hizmetini nasıl adlandırdığına bağlı olarak istediğiniz / ihtiyacınız olmayabilir.

Ancak, Şef'e hizmetin bir "durum" komutunu desteklediğini söyleyebilirsiniz, bu da Şef'in genellikle şöyle bir şey yapacağını,

/etc/init.d/postgresql status

Çalışıp çalışmadığını belirlemek için dönüş kodunu kullanın (sıfırdan farklı çalışmıyor).

Tüm servis komut dosyaları bir durum komutunu desteklemediğinden (sinir bozucu bir şekilde) Şef bunu varsayılan olarak yapmaz ve Şef yapmak için doğru şeyin ne olduğunu doğal olarak bilmez. Aklı başında varsayılan şeyi yapmaya çalışıyor, ama bazen naif. Böylece, Şef'e kaynağın bir durum komutu olduğunu ve çok naif olmadığını söyleyebilirsiniz.

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

Şimdi, hizmet aslında "postgresql" olarak adlandırılmaz, ancak bunun yerine "postgresql-92" veya benzeri ise, bunu şu şekilde yapabilirsiniz:

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

veya

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

Hata ayıklama çıktısı ile şef çalıştırarak neler olduğunu daha ayrıntılı olarak öğrenebilirsiniz:

chef-client -l debug

Bu yararlıdır, ancak soruyu tam olarak cevaplamamaktadır. Ben bunu söylemek istiyorum :start bakılmaksızın arasında :status. Ayrıca umarım bir ps -ef | grep [p]ostgresqlveya benzeri yapar, başka genellikle kendi grep komutuyla eşleşir ve böylece her zaman hizmetin çalıştığını düşünür. (Ya da belki de temel sorun budur?)
Parçalı Bulutlu

Bana öyle geliyor ki Chef'de bir hata var ya da sistemde bir sorun var. Hangi platform / platform_versiyonunu kullanıyorsunuz? Postgresql'i nasıl yüklediniz? Paket, kaynak?
jtimberman

Whit, şef olarak, tanımlayıcı bir şekilde tanımlanan kaynakları yönetmek için cesaretsiz bir eylemde bulunur. Bir hizmetin Chef ile çalıştığından emin olmanın yolu, başlangıç ​​eylemini servise göndermektir. Bu gerçekleşmezse, Şef'teki bir hata, tarifteki bir hata veya sistemdeki bir hatadır.
jtimberman

Teşekkürler @jtimberman. Yanlış durum için tickets.opscode.com/browse/COOK-334 adresinden döndürülmesiyle ilgili bir hata açtım . Ancak buradaki sorum, şefin hizmet başlatma komutunu vermeye ve durum kontrolünü atlamaya zorlamanın bir yolu olup olmadığıdır. service startneredeyse her zaman idempotenttir, bu yüzden bu iyi olmalı.
Parçalı Bulutlu

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.