আমার সংস্থায় ইসিএস এবং ডকারের মতো বিভিন্ন পরিষেবার জন্য আমাদের বেশ কয়েকটি সাধারণ ব্যবহারের জন্য বেস এএমআই রয়েছে। যেহেতু আমাদের বেশিরভাগ প্রকল্প ক্লাউডফোমেশনের সাথে জড়িত, আমরা ব্যবহার করছি 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
আমি একটি systemd হল এই চলমান ভাবছিলাম oneshot
সেবা যা রান After=network.target
এবং WantedBy=multi-user.target
।
একমাত্র সমস্যাটি হ'ল আমি চাই যে আমার এএমআই নমনীয় হোক এবং যদি কেবল একটি নির্দিষ্ট ফাইল উপস্থিত থাকে তবে এটি সম্পাদন করুন। উপরের স্ক্রিপ্টটি ইসি 2 ব্যবহারকারীর ডেটাতে এম্বেড করার পরিবর্তে, আমি ব্যবহারকারীর ডেটাতে একটি পরিবেশের ফাইল সংজ্ঞায়িত করতে পারি যা আমার প্রয়োজনীয় ভেরিয়েবলগুলি সংজ্ঞায়িত করে এবং যদি সেই পরিবেশের ফাইলটি উপস্থিত থাকে তবে কেবল আমার ওয়ান-শট পরিষেবা চালাতে পারি:
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
যদি কোনও প্রদত্ত শর্ত পূরণ হয় তবে সিস্টেমড কেবলমাত্র পরিষেবা চালানোর কোনও উপায় আছে?
while
শর্ত নয়, তবে একটিif
, এর অর্থ যেConditionPathExists
পরিষেবাটি নির্দিষ্ট সময়ের মধ্যে সার্ভিসটি শুরু করার সময় না থাকলে যদি পরিষেবাটি বাকি অংশ শুরু হয় তবে চলবে না। অর্থাত্, এটি পথের অস্তিত্বের জন্য অপেক্ষা করে না।