सशर्त सेवा शुरू करें सशर्त?


14

मेरे संगठन में हमारे पास विभिन्न सेवाओं जैसे कि ईसीएस और डॉकर के लिए कई सरल-से-उपयोग आधार एएमआई हैं। चूंकि हमारी कई परियोजनाओं में CloudFormation शामिल है, हम उपयोग कर रहे हैं cfn-bootstrap, जिसमें कुछ स्क्रिप्ट और एक सेवा शामिल है जो कुछ पैकेजों को स्थापित करने के लिए बूट पर चलती है और हमारे लिए कुछ कॉन्फ़िगरेशन प्रबंधन कार्य करती है।

सिस्टम के स्टार्टअप पर, निम्न स्क्रिप्ट के एक बराबर निष्पादित किया जाना चाहिए:

#!/bin/bash

# capture stderr only
output="$(cfn-init -s $STACK_NAME -r $RESOURCE_NAME --region $REGION >/dev/null)"

# if it failed, signal to CloudFormation that it failed and include a reason
returncode=$?
if [[ $returncode == 0]]; then
    cfn-signal -e $returncode -r "$output"
    exit $returncode
fi

# otherwise, signal success
cfn-signal -s

मैं इसे एक सिस्टमड oneshotसर्विस के रूप में चलाने की सोच रहा था जो चलती है After=network.targetऔर WantedBy=multi-user.target

एकमात्र समस्या यह है कि मैं अपने एएमआई को लचीला होना चाहूंगा और केवल एक निश्चित फ़ाइल मौजूद होने पर इसे निष्पादित कर सकता हूं। EC2 उपयोगकर्ता डेटा में उपरोक्त स्क्रिप्ट को एम्बेड करने के बजाय, मैं उपयोगकर्ता डेटा को केवल एक पर्यावरण फ़ाइल को परिभाषित कर सकता हूं, जो उन चर को परिभाषित करता है जिनकी मुझे आवश्यकता है और केवल एक-शॉट सेवा चलाएं यदि वह वातावरण फ़ाइल मौजूद है:

#cloud-init
write_files:
    - path: /etc/sysconfig/cloudformation
      # ...
      content: |
          CFN_STACK_NAME="stack-name"
          CFN_RESOURCE="resource-name"
          CFN_REGION="region"

क्या सिस्टम को केवल एक सेवा चलाने का एक तरीका है अगर किसी दिए गए शर्त को पूरा किया जाए?

जवाबों:


16

systemd विभिन्न प्रकार की स्थितियाँ प्रदान करता है जिनका आप परीक्षण कर सकते हैं । उदाहरण के लिए, आप ConditionPathExists=किसी फ़ाइल के अस्तित्व के लिए परीक्षण कर सकते हैं ।

[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation

3
यह ध्यान देने योग्य है कि यह एक whileशर्त नहीं है , लेकिन एक if, जिसका अर्थ है कि यदि निर्दिष्ट ConditionPathExistsसमय तक सेवा में मौजूद पथ मौजूद नहीं है, तो सेवा शुरू नहीं होती है। यानी, यह रास्ता मौजूद होने का इंतजार नहीं करता है।
माहन

@ एक सिस्टम टाइमर का उपयोग करते हुए, उस सीमा को पार करने के लिए एक अंतराल पर सेवा को बार-बार ट्रिगर करना संभव होना चाहिए।
रात

@Mahn freedesktop.org/software/systemd/man/systemd.path.html# पर एक नज़र डालें । यह एक पथ की निगरानी कर सकता है और सक्रियण प्रदान करता है, उदाहरण के लिए, जब कोई पथ अस्तित्व में आता है।
बेन्फ

2

मैं इस सवाल पर अड़ गया कि किसी शर्त का उपयोग करके सिस्टमड सेवा शुरू करने के तरीके खोज रहा हूँ। बहुत तरीके हैं:

ConditionArchitecture=, ConditionVirtualization=, ConditionHost=, ConditionKernelCommandLine=, ConditionSecurity=, ConditionCapability=, ConditionACPower=, ConditionNeedsUpdate=, ConditionFirstBoot=, ConditionPathExists=, ConditionPathExistsGlob=, ConditionPathIsDirectory=, ConditionPathIsSymbolicLink=, ConditionPathIsMountPoint=, ConditionPathIsReadWrite=, ConditionDirectoryNotEmpty=, ConditionFileNotEmpty=, ConditionFileIsExecutable=

मैं एक विशिष्ट होस्ट नाम के आधार पर सेवा शुरू करना चाहता था।

ConditionHost= होस्ट के होस्टनाम या मशीन आईडी के खिलाफ मैच के लिए इस्तेमाल किया जा सकता है। यह या तो होस्टनाम स्ट्रिंग लेता है (शेल स्टाइल ग्लब्स के साथ वैकल्पिक रूप से) जिसे स्थानीय रूप से सेट होस्टनाम के खिलाफ परीक्षण किया जाता है जैसा कि गेटहोस्टनेम (2) द्वारा लौटाया जाता है, या स्ट्रिंग के रूप में एक मशीन आईडी स्वरूपित होता है (देखें मशीन-आईडी (5))। विस्मयादिबोधक चिह्न लगाने से परीक्षण को नकारा जा सकता है।

उस पर और अधिक यहाँ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.