मेरे संगठन में हमारे पास विभिन्न सेवाओं जैसे कि ईसीएस और डॉकर के लिए कई सरल-से-उपयोग आधार एएमआई हैं। चूंकि हमारी कई परियोजनाओं में 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"
क्या सिस्टम को केवल एक सेवा चलाने का एक तरीका है अगर किसी दिए गए शर्त को पूरा किया जाए?
while
शर्त नहीं है , लेकिन एकif
, जिसका अर्थ है कि यदि निर्दिष्टConditionPathExists
समय तक सेवा में मौजूद पथ मौजूद नहीं है, तो सेवा शुरू नहीं होती है। यानी, यह रास्ता मौजूद होने का इंतजार नहीं करता है।