Làm thế nào để sử dụng lệnh trạng thái tùy chỉnh cho một dịch vụ trong con rối?


10

Tôi đang sử dụng bóp debian với PostgreSQL 9.1 từ backport. Con rối có phiên bản 2.7,14. Thật không may, tập lệnh init trả về mã thoát sai cho trạng thái. Vì vậy, tôi đã viết một statuslệnh tùy chỉnh để phát hiện xem postgresql có chạy hay không.

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,
}

Lệnh của tôi hoạt động như một lá bùa, nhưng con rối dường như có vấn đề. Tôi luôn luôn nhận được notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'mặc dù nó đã chạy.

Vì vậy, đã thử như sau:

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

Theo tôi hiểu statuslệnh tùy chỉnh này , con rối nên luôn nghĩ rằng postgresql đang chạy. Tuy nhiên, con rối cố gắng bắt đầu postgresql - mọi lúc.

Lỗi của tôi là gì Hay là một lỗi trong con rối?


Tệp kê khai của bạn có vẻ chính xác, vì vậy điều này nghe giống như một lỗi trong Puppet. Đó là một cú sút xa, nhưng hãy thử cài đặt provider => init(và xóa enabletham số).
mgorven

2
Bạn có chắc chắn thoát 0 là một lệnh hợp lệ? Lệnh exit thường là nội bộ cho một shell. Bạn có cần phải làm gì đó như bash -c 'exit 0' không?
Zoredache

@Zoredache bạn nói đúng. Với sh -c 'exit 0', statuslệnh của con rối hoạt động như mong đợi!
MMore

Câu trả lời:


6

Dự đoán tốt nhất của tôi là $4lệnh trong lệnh của bạn đang bị nuốt chửng bởi phép nội suy của con rối và exit 0nó không hoạt động đúng do các vấn đề tương tác vỏ.

Tôi sẽ thử một vài thứ.

  1. Nếu vấn đề là nội suy của con rối $4trong lệnh của bạn thoát $như vậy: status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"(đôi khi cần thêm dấu gạch chéo ngược, nhưng tôi khá chắc chắn rằng 1 là đủ ở đây).
  2. Hãy chắc chắn rằng lệnh kiểm tra đang thực sự hoạt động đúng. exitlà một cái vỏ bên trong và tôi không chắc con rối sẽ đối xử với nó như thế nào. Vì vậy, sử dụng lệnh "return return" chính tắc thay thế:status => "/bin/true"
  3. Có thể statusđang bị ghi đè bởi provider => debian(đó sẽ là một lỗi rối), vì vậy thay vào đó chỉ định tất cả các lệnh và sử dụng nhà cung cấp cơ sở (tuy nhiên điều này sẽ không kích hoạt đúng cách):

    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 }'",
    }
    

Một điều khác: tương tự như execkiểu, tôi nghĩ con rối cần đường dẫn đầy đủ để thực thi. Hãy thử đặt chúng thành đường dẫn đầy đủ trong statusdòng của bạn , nếu bạn chưa đặt một đường dẫn trên toàn cầu?
Shane Madden

@ShaneMadden: Con rối không nhất thiết cần đường dẫn đầy đủ đến các lệnh, mặc dù giả sử nó cần chúng không làm tổn thương gì. Ngoài một số loại đường dẫn mặc định (PATH trong môi trường daemon đã được bắt đầu?) execChấp nhận một paththam số và bạn có thể đặt đường dẫn mặc định bằng Exec { path => '/usr/bin:/bin' }hoặc Exec { path => ['/usr/bin'],['/bin']}. Có một 'đường dẫn' tương tự trên Dịch vụ, nhưng dường như nó chủ yếu được sử dụng với một số nhà cung cấp nhất định để tìm tập lệnh init, thay vì đường dẫn tìm kiếm lệnh kiểu vỏ thông thường.
freiheit

1
Cảm ơn! Nội suy $4là vấn đề. Tôi đã thay thế nó \$4và bây giờ mọi thứ hoạt động như mong đợi :)
MMore
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.