Làm thế nào để đảm bảo một dịch vụ đang chạy, sử dụng Chef?


10

Tôi đang ở trong một tình huống mà Chef có thể bắt đầu một dịch vụ (postgres) nhưng sau đó có thể bị ngừng hoạt động. Tôi muốn một đầu bếp tiếp theo chạy để làm cho dịch vụ được chạy. Tôi đã thử điều này:

service "postgresql" do
    action :start
end

Nhưng nó không có tác dụng, (up to date)có lẽ là vì Chef biết nó đã được bắt đầu và không thể nói rằng nó đã dừng lại. (Có thể do cách service ... statusứng xử của dịch vụ này?) Nếu tôi viết điều này:

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

Tôi có được hành vi mong muốn. Cũng action :restartlàm cho nó chạy. Tuy nhiên, những thứ này có vẻ như chống mẫu do tính di động (và có khả năng dừng nó trước khi bắt đầu lại trong trường hợp sau).

Vì vậy, làm thế nào tôi có thể nói với Chef để bắt đầu dịch vụ, ngay cả khi nó nghĩ rằng nó đã chạy?

Điều này đang sử dụng Chef 11.6, được lưu trữ bởi OpsCode và công thức postgresql mặc định. (Lưu ý điều này tương tự nhưng tôi nghĩ không hoàn toàn giống như Làm thế nào để buộc các hành động đối với tài nguyên "cập nhật" trong Chef ? .)

--- EDIT (làm rõ sau bài đăng của jtimberland) ---

-l debugđây cho thấy:

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

Ngay cả khi nó KHÔNG chạy. Nghe có vẻ như là một lỗi và tôi thích điều đó. Tuy nhiên, tôi chủ yếu quan tâm đến việc có cách nào để nói với Đầu bếp "luôn luôn gọi lệnh bắt đầu dịch vụ, bỏ qua kiểm tra trạng thái". Đó là câu hỏi ở đây.

(Tôi không phải chuyên gia nhưng tôi nghĩ rằng cách cầm tay nhất để đảm bảo một dịch vụ đang chạy là để bắt đầu dịch vụ và đó là gần như luôn luôn idempotent. OTOH kiểm tra liệu một dịch vụ đang chạy ít nhất quán và tôi không thấy lý do tại sao chúng ta nên quan tâm !)

Câu trả lời:


11

Theo mặc định, Chef sẽ kiểm tra xem dịch vụ có đang chạy hay không và khởi động nó nếu dịch vụ không chạy.

Làm thế nào nó xác định rằng dịch vụ đang chạy phụ thuộc.

Theo mặc định, Chef sẽ cố gắng khớp tên của dịch vụ ( postgresqltại đây) trong bảng quy trình bằng cách sử dụng ps.

ps -ef | grep postgresql

Bản chất. Tên của dịch vụ sẽ được sử dụng cho mẫu khớp khi kiểm tra bảng quy trình. Điều này có thể hoặc không thể là những gì bạn muốn / cần, đặc biệt là tùy thuộc vào nền tảng và cách đặt tên cho dịch vụ "postgresql".

Tuy nhiên, bạn có thể nói với Chef rằng dịch vụ hỗ trợ lệnh "status", có nghĩa là Chef thường sẽ làm một cái gì đó như,

/etc/init.d/postgresql status

Và sử dụng mã trả về để xác định xem nó có chạy hay không (khác không là không chạy).

Chef không làm điều này theo mặc định vì không phải tất cả các tập lệnh dịch vụ đều hỗ trợ lệnh trạng thái (bực bội) và Chef không hoàn toàn biết điều đúng đắn cần làm là gì. Nó cố gắng làm điều mặc định lành mạnh, nhưng đôi khi ngây thơ. Vì vậy, bạn có thể nói với Chef rằng tài nguyên có lệnh trạng thái và không quá ngây thơ.

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

Bây giờ, nếu dịch vụ không thực sự được đặt tên là "postgresql" mà thay vào đó là "postgresql-92" hoặc tương tự, bạn có thể thực hiện việc này như sau:

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

hoặc là

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

Bạn cũng có thể tìm hiểu những gì đang diễn ra chi tiết hơn bằng cách chạy đầu bếp với đầu ra gỡ lỗi:

chef-client -l debug

Điều này rất hữu ích nhưng không trả lời được câu hỏi. Tôi muốn nói với nó để :start phân biệt của :status. Ngoài ra tôi hy vọng nó thực hiện một ps -ef | grep [p]ostgresqlhoặc tương tự, nếu không, nó thường sẽ khớp với lệnh grep của chính nó và do đó luôn nghĩ rằng dịch vụ đang chạy. (Hoặc có thể đó là vấn đề tiềm ẩn?)
Một phần mây

Dường như với tôi rằng có một lỗi trong Chef, hoặc có gì đó không ổn trên hệ thống. Nền tảng / platform_version nào bạn đang chạy? Làm thế nào bạn cài đặt postgresql? Gói, nguồn?
jtimberman

Để minh bạch, Chef thực hiện hành động bình thường để quản lý các tài nguyên được xác định theo cách khai báo. Cách mà bạn đảm bảo dịch vụ đang chạy w / Chef là gửi hành động bắt đầu đến dịch vụ. Nếu điều đó không xảy ra, đó là lỗi trong Chef, lỗi trong công thức hoặc lỗi trên hệ thống.
jtimberman

Cảm ơn @jtimberman. Tôi đã mở một lỗi cho tình trạng sai được trả lại tại Ticket.opscode.com/browse/COOK-334 . Tuy nhiên, câu hỏi của tôi ở đây là liệu có cách nào để buộc đầu bếp đưa ra lệnh bắt đầu dịch vụ, bỏ qua kiểm tra trạng thái. service starthầu như luôn luôn là idempotent vì vậy điều này sẽ ổn.
Một phần mây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.