कठपुतली में एक सेवा के लिए एक कस्टम स्थिति कमांड का उपयोग कैसे करें?


10

मैं बैकपार्ट्स से PostgreSQL 9.1 के साथ डेबियन निचोड़ का उपयोग कर रहा हूं। कठपुतली का संस्करण 2.7.14 है। दुर्भाग्य से init स्क्रिप्ट स्थिति के लिए गलत निकास कोड लौटाता है। इसलिए मैंने statusयह पता लगाने के लिए एक कस्टम कमांड लिखी कि क्या पोस्टग्रैसिकल चल रहा है या नहीं।

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

मेरी आज्ञा एक आकर्षण की तरह काम करती है, लेकिन कठपुतली को एक समस्या है। मैं हमेशा मिलता हूं, notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'हालांकि यह पहले से ही चल रहा है।

तो निम्नलिखित की कोशिश की:

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

जैसा कि मैंने इस कस्टम statusकमांड को समझा , कठपुतली को हमेशा यह सोचना चाहिए कि पोस्टग्रैस्कल चल रहा है। फिर भी कठपुतली हर बार पोस्टग्रैक्स्ल शुरू करने की कोशिश करती है।

मेरी गल्ती क्या है? या यह कठपुतली में बग है?


आपका प्रकटन सही दिखता है, इसलिए यह पपेट में एक बग जैसा लगता है। यह एक लंबा शॉट है, लेकिन सेटिंग की कोशिश करें provider => init(और enableपैरामीटर को हटा दें )।
प्रात:

2
क्या आप सुनिश्चित हैं कि बाहर निकलना 0 एक मान्य कमांड है? निकास कमांड आमतौर पर एक शेल के लिए आंतरिक है। क्या आपको बैश -c 'एक्जिट 0' जैसा कुछ करने की ज़रूरत है?
Zoredache

@Zoredache आप सही हैं। श-सी 'एक्जिट 0' statusके साथ कठपुतली की कमान उम्मीद के मुताबिक काम करती है!
MMore

जवाबों:


6

मेरा सबसे अच्छा अनुमान है कि $4आपके आदेश में कठपुतली के स्वयं के प्रक्षेप द्वारा निगल लिया जा रहा है और यह exit 0शेल इंटरैक्शन मुद्दों के कारण काफी काम नहीं करता है।

मैं कुछ चीजों की कोशिश करूंगा।

  1. यदि समस्या $4आपके आदेश में कठपुतली के प्रक्षेप की $तरह है, तो इससे बचें : status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"(कभी-कभी अधिक बैकस्लैश की आवश्यकता होती है, लेकिन मुझे पूरा यकीन है कि 1 यहाँ पर्याप्त है)।
  2. सुनिश्चित करें कि परीक्षण कमांड वास्तव में सही काम कर रहा है। exitएक खोल आंतरिक है और मुझे यकीन नहीं है कि कठपुतली उसका इलाज कैसे करेगी। इसलिए इसके बजाय विहित "वापसी सफलता" कमांड का उपयोग करें:status => "/bin/true"
  3. शायद (जो एक कठपुतली बग होगा) statusद्वारा ओवरराइड किया जा रहा है provider => debian, इसलिए इसके बजाय सभी कमांड निर्दिष्ट करें और आधार प्रदाता का उपयोग करें (यह ठीक से सक्षम नहीं होगा, हालांकि):

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

एक अन्य बात: प्रकार के समान exec, मुझे लगता है कि कठपुतली को निष्पादनयोग्य के लिए पूर्ण पथ की आवश्यकता है। statusयदि आपने विश्व स्तर पर एक सेट नहीं किया है, तो उन्हें अपनी लाइन में पूर्ण पथ पर स्थापित करने का प्रयास करें ।
शेन मैडेन

@ShaneMadden: कठपुतली को आज्ञाओं के लिए पूर्ण पथ की आवश्यकता नहीं है, हालांकि यह मानते हुए कि उन्हें ज़रूरत है कि उन्हें कुछ भी चोट नहीं पहुंचे। डिफ़ॉल्ट पथ के किसी प्रकार के अतिरिक्त (पर्यावरण डेमॉन में पथ में शुरू किया गया था?) execएक को स्वीकार करता है pathपरम और आप के साथ एक डिफ़ॉल्ट पथ सेट कर सकते हैं Exec { path => '/usr/bin:/bin' }या Exec { path => ['/usr/bin'],['/bin']}। सेवा पर एक समान 'पथ' है, लेकिन यह सामान्य शेल-शैली कमांड सर्च पथ के बजाय मुख्य रूप से इनिट स्क्रिप्ट खोजने के लिए कुछ प्रदाताओं के साथ उपयोग किया जाता है।
Freiheit

1
धन्यवाद! की प्रक्षेप $4समस्या थी। मैंने इसे बदल दिया \$4और अब सब कुछ अपेक्षित रूप से काम करता है :)
MMore
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.