শর্তসাপেক্ষে সিস্টেমড পরিষেবা শুরু করবেন?


14

আমার সংস্থায় ইসিএস এবং ডকারের মতো বিভিন্ন পরিষেবার জন্য আমাদের বেশ কয়েকটি সাধারণ ব্যবহারের জন্য বেস এএমআই রয়েছে। যেহেতু আমাদের বেশিরভাগ প্রকল্প ক্লাউডফোমেশনের সাথে জড়িত, আমরা ব্যবহার করছি 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"

যদি কোনও প্রদত্ত শর্ত পূরণ হয় তবে সিস্টেমড কেবলমাত্র পরিষেবা চালানোর কোনও উপায় আছে?

উত্তর:


16

systemd বিভিন্ন শর্তাদি সরবরাহ করে যা আপনি পরীক্ষা করতে পারেন । উদাহরণস্বরূপ, আপনি ConditionPathExists=কোনও ফাইলের অস্তিত্বের জন্য পরীক্ষা করতে ব্যবহার করতে পারেন ।

[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation

3
এটি লক্ষণীয় যে এটি একটি whileশর্ত নয়, তবে একটি if, এর অর্থ যে ConditionPathExistsপরিষেবাটি নির্দিষ্ট সময়ের মধ্যে সার্ভিসটি শুরু করার সময় না থাকলে যদি পরিষেবাটি বাকি অংশ শুরু হয় তবে চলবে না। অর্থাত্, এটি পথের অস্তিত্বের জন্য অপেক্ষা করে না।
মাহন

@ সিস্টেমেড টাইমার ব্যবহার করে, এই সীমাবদ্ধতা কাটিয়ে উঠার জন্য বিরতিতে পরিষেবাটি বারবার ট্রিগার করা সম্ভব হবে।
নাফটুলি কে

@ মাহান 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= হোস্টের হোস্ট নেম বা মেশিন আইডির বিপরীতে মিলতে ব্যবহৃত হতে পারে। এটি হয় একটি হোস্টনাম স্ট্রিং নেয় (shellচ্ছিকভাবে শেল স্টাইল গ্লোব সহ) যা স্থানীয়ভাবে সেট করা হোস্টনামের সাথে টেস্ট করা হয় যেমন গেথোস্টনাম (2), অথবা একটি মেশিন আইডি স্ট্রিং হিসাবে রূপান্তরিত হয় (মেশিন-আইডি (5) দেখুন)। পরীক্ষায় বিস্মৃত চিহ্নটি প্রেরণ করে অবহেলা করা যেতে পারে।

আরো বিষয়ে এখানে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.