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 :restart
là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 !)
:start
phân biệt của:status
. Ngoài ra tôi hy vọng nó thực hiện mộtps -ef | grep [p]ostgresql
hoặ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?)