Tại tổ chức của tôi, chúng tôi có một số AMI cơ sở dễ sử dụng cho các dịch vụ khác nhau như ECS và Docker. Do nhiều dự án của chúng tôi liên quan đến CloudFormation, chúng tôi đang sử dụng cfn-bootstrap
, bao gồm một vài tập lệnh và dịch vụ chạy trên boot để cài đặt các gói nhất định và thực hiện một số tác vụ quản lý cấu hình nhất định cho chúng tôi.
Khi khởi động một hệ thống, phải thực hiện một đoạn mã tương đương sau:
#!/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
Tôi đã nghĩ đến việc chạy nó như một oneshot
dịch vụ systemd chạy After=network.target
và WantedBy=multi-user.target
.
Vấn đề duy nhất là tôi muốn AMI của mình linh hoạt và chỉ thực hiện điều này nếu tồn tại một tệp nhất định. Thay vì nhúng tập lệnh trên vào dữ liệu người dùng EC2, tôi có thể có dữ liệu người dùng chỉ cần xác định tệp môi trường xác định các biến tôi cần và chỉ chạy dịch vụ one-shot của mình nếu tệp môi trường đó tồn tại:
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
Có cách nào để systemd chỉ chạy một dịch vụ nếu đáp ứng một điều kiện nhất định không?
while
điều kiện, nhưng cóif
nghĩa là nếu đường dẫn được chỉ địnhConditionPathExists
không tồn tại vào thời điểm dịch vụ bắt đầu thì phần còn lại của dịch vụ sẽ không chạy. Tức là, nó không chờ con đường tồn tại.