ที่องค์กรของฉันเรามี AMI พื้นฐานที่ใช้งานง่ายสำหรับบริการต่าง ๆ เช่น ECS และ Docker เนื่องจากโครงการหลายโครงการของเราเกี่ยวข้องกับ 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
ผมคิดว่าการทำงานนี้เป็น systemd oneshot
บริการซึ่งวิ่งและAfter=network.target
WantedBy=multi-user.target
ปัญหาเดียวคือฉันต้องการให้ AMI ของฉันมีความยืดหยุ่นและใช้งานได้ก็ต่อเมื่อมีไฟล์ที่แน่นอน แทนที่จะฝังสคริปต์ข้างต้นลงในข้อมูลผู้ใช้ EC2 ฉันสามารถให้ข้อมูลผู้ใช้เพียงแค่กำหนดไฟล์สภาพแวดล้อมที่กำหนดตัวแปรที่ฉันต้องการและเรียกใช้บริการ one-shot ของฉันหากไฟล์สภาพแวดล้อมนั้นมีอยู่:
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
มีวิธีที่จะทำให้ systemd ทำงานบริการเท่านั้นหากตรงตามเงื่อนไขที่กำหนด?
while
เงื่อนไข แต่if
หมายความว่าหากเส้นทางที่ระบุConditionPathExists
ไม่มีอยู่ในขณะที่บริการเริ่มต้นบริการที่เหลือจะไม่ทำงาน คือมันไม่รอให้เส้นทางมีอยู่