জটিল-আরগস ফর্মটি ব্যবহার করে উত্তরযোগ্যকে ফ্রি-ফর্ম কমান্ডগুলি প্রদান করা


9

আমি প্রোগ্রামক্রমে তৈরি জবাবযুক্ত প্লেবুক ব্যবহার করছি। সাধারণত, যেহেতু প্লেবুকগুলি কেবল YAML, এটি সোজা straight যাইহোক, যখন "সরল" ব্যবহার key=valueফর্ম, playbooks নয় বিশুদ্ধ YAML - তারা একটি এমবেডেড সামগ্রী অন্তর্ভুক্ত shlex-parsable ফর্ম।

এই ফর্মটিতে অস্পষ্টতা এড়াতে ( key=valueসেই আদেশটি কী যুক্তির সাথে যুক্তি বা জবাবদিহি করার পক্ষে যুক্তি?), এবং বিশ্লেষণ ও উত্পন্ন করার জন্য কেবল একটি একক ফর্ম্যাট আছে, আমি নিঃশর্তভাবে উত্তরগুলিতে উদাহরণস্বরূপ প্রদর্শিত জটিল আর্গম প্রক্রিয়াটি ব্যবহার করছি - উদাহরণ সংগ্রহস্থল

এটি নিম্নলিখিত ধরণের একটি বাক্য গঠন ব্যবহার করে:

action: module-name
args:
  key1: value1
  key2: value2

... যা ভাল এবং ভাল। যাইহোক, যখন জন্য এই ফর্ম ব্যবহার করার চেষ্টা shellবা commandমডিউল ( যার ডকুমেন্টেশন নামে একটি আর্গুমেন্ট পাস হচ্ছে হিসাবে প্রকৃত কমান্ড বর্ণনা free_form) এই এত ভাল কাজ করে না:

action: shell
args:
  free_form: echo hello_world >/tmp/something
  creates: /tmp/something

যখন আহ্বান করা হয়, এটি নিম্নলিখিতগুলি চালিত করে:

/bin/sh -c " free_form='echo hello_world >/tmp/something'  "

... যা আমি অর্জন করার চেষ্টা করছি তা খুব বেশি নয়।

বিশুদ্ধ ওয়াইএএমএল সিনট্যাক্স ব্যবহার করে "ফ্রি-ফর্ম" কমান্ড গ্রহণ করে উত্তরযোগ্য মডিউলগুলি ব্যবহার করার সঠিক উপায় কী?

উত্তর:


5

সংক্ষিপ্ত উত্তর: ব্যবহার করবেন না command, raw, script, অথবা shellমডিউল। আপনার নিজস্ব মডিউলটি লিখুন যা কমান্ডটিকে "সাধারণ" আর্গুমেন্ট হিসাবে গ্রহণ করে।

দীর্ঘ উত্তর:

বেশিরভাগ ক্ষেত্রে, আপনি এটি করতে পারেন:

- shell: echo hello_world > /tmp/something
  args:
    creates: /tmp/something

যাইহোক, এটি কিছু প্রান্ত ক্ষেত্রে ব্যর্থ:

- shell: echo hello_world > creates=something
  args:
    creates: creates=something  # The file is named "creates=something"

আমি এটি পরিচালনা করার সাধারণ উপায়টি জানি না, তবে একটি ব্যাশ-নির্দিষ্ট সমাধানটি হ'ল:

- shell: echo hello_world > "creates=something"
  args:
    creates: creates=something

এটির নির্গত করার জন্য আমি কোনও আনুষ্ঠানিক ওয়াইএএমএল জেনারেটরের কাছে যেতে পারি এমন কোনও ডেটা স্ট্রাকচার কি আছে - shell: ...? যদি এই কাঠামোটি এমন কিছু হয় যা কেবলমাত্র নির্ভরযোগ্যভাবে হাতে তৈরি করা যায় যা কিছুটা প্রশ্নের পয়েন্টকে পরাস্ত করে।
চার্লস ডাফি

@ চার্লসডুফি: আমি মনে করি না ...আপনি সাধারণভাবে এই অংশ থেকে পালাতে পারবেন । আপনি তাকান তাহলে library/commands/command, আপনি একটি চমত্কার উদার Regex ম্যাচিং পাবেন creates=, removes=, chdir=, ইত্যাদি। আপনার যদি কোনও গ্যারান্টির দরকার হয় যে কোনও কমান্ড দিয়ে যেতে পারে, আপনাকে নিজের মডিউলটি লিখতে হবে।
স্নোবল

ফর্সা 'nuff। এটি আমার মনে, একটি উল্লেখযোগ্য ডিজাইনের অপব্যবহার ... তবে, ভাল, এটি হ'ল।
চার্লস ডাফি

0

এটি এখন উত্তরীয় ডকুমেন্টেশনে সম্বোধন করা হয়েছে ।

# You can also use the 'args' form to provide the options. This command
# will change the working directory to somedir/ and will only run when
# /path/to/database doesn't exist.
- command: /usr/bin/make_database.sh arg1 arg2
  args:
    chdir: somedir/
    creates: /path/to/database

মনে রাখবেন যে 'ফ্রি_ফর্ম' নামে কোনও প্যারামিটার নেই।


উপস্থিতি জোড়গুলি পার্স করা থেকে argsবাধা দেয় , এর কি কোনও অস্তিত্ব থাকতে হবে? (যদি তা হয় তবে এটি অস্পষ্টতাকে পরিষ্কারভাবে সম্বোধন করে; অন্যথায়, এটি এখনও বিদ্যমান বলে মনে হয়)। k=vcommand
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.