অন্তর্ভুক্ত_টাস্ক এবং আমদানি_ টাস্কের মধ্যে পার্থক্য কী?


62

উত্তরীয় ২.৪-তে, includeমডিউলটি অবচয় করা হয়েছে। তার জায়গায়, এটি দুটি প্রতিস্থাপন মডিউল সহ জাহাজ import_tasksএবং এবং include_tasks। তবে তাদের খুব অনুরূপ বর্ণনা রয়েছে:

  • include_tasks: বর্তমান প্লেবুকে কার্য সম্পাদনের জন্য একটি তালিকা সহ একটি ফাইল অন্তর্ভুক্ত করে।
  • import_tasks: পরবর্তী সম্পাদনের জন্য বর্তমান প্লেবুকে যুক্ত করা কাজের একটি তালিকা আমদানি করে।

আমি কখন প্রাক্তনটি ব্যবহার করব এবং কখন আমার ব্যবহার করা উচিত?


: (এছাড়াও থামিয়ে দেওয়া সাবধানবাণী বোঝায় "গতিশীল" এবং "স্ট্যাটিক" কর্ম আমি ডক্স পড়তে কিন্তু তাদের বুঝতে পারিনি।।)
বেন এস

উত্তর:


68

ডকুমেন্টেশনে এই বিষয় সম্পর্কে বেশ খানিকটা রয়েছে:

মূল পার্থক্যটি হ'ল:

সমস্ত import*বিবৃতি প্লেবুকগুলি বিশ্লেষণের সময় প্রাক-প্রক্রিয়াজাত করা হয়।
সমস্ত include*বিবৃতি প্লেবুকটি কার্যকর করার সময় তাদের সম্মুখীন হওয়ার সাথে সাথে প্রক্রিয়া করা হয়।

তাই importস্ট্যাটিক হয়, includeগতিশীল।

আমার অভিজ্ঞতা থেকে, আপনি importযখন লজিক্যাল "ইউনিট" ব্যবহার করেন তখন আপনার ব্যবহার করা উচিত । উদাহরণস্বরূপ, সাবটাস্ক ফাইলগুলিতে কার্যের দীর্ঘ তালিকা পৃথক করুন:

main.yml:

- import_tasks: prepare_filesystem.yml
- import_tasks: install_prerequisites.yml
- import_tasks: install_application.yml

তবে আপনি includeবিভিন্ন কর্মপ্রবাহ মোকাবেলা করতে এবং কিছু গতিশীলভাবে জড়িত তথ্যের ভিত্তিতে সিদ্ধান্ত নেওয়ার জন্য ব্যবহার করবেন:

install_prerequisites:

- include_tasks: prerequisites_{{ ansible_os_family | lower }}.yml

8
আমি এই লিঙ্কটি খুব দরকারী বলে খুঁজে পেয়েছি : ডকসস.স্যাবসিল.স্যাবসিল / অ্যান্সিবল / স্লেস্ট/… এটি এমন একটি মামলার ডাক দেয় যেখানে আমদানি করা এবং আলাদাভাবে আচরণ করা অন্তর্ভুক্ত থাকে - একটি 'কখন' শর্তযুক্ত যেখানে ফাইলের কাজগুলি আমদানি নির্ধারণের জন্য ব্যবহৃত মানদণ্ডকে পরিবর্তন করতে পারে । Import_tasks সহ, ​​প্রতিটি কাজ মানদণ্ড পরীক্ষা করে, সুতরাং মানদণ্ড পরিবর্তিত হলে আচরণ পরিবর্তন হয়। অন্তর্ভুক্ত_ টাস্ক সহ, কার্যগুলি উপস্থিত থাকে বা না হয় তার উপর ভিত্তি করে যখন শর্তটি সত্য হিসাবে মূল্যায়ন করা হয় যখন অন্তর্ভুক্ত_টাস্কস বিবৃতিটি কার্যকর করা হয়েছিল। যদি আমি ভালভাবে বুঝতে পারি ...
এথেল ইভান্স

এর আচরণ কী ছিল include? আমরা যদি ব্যবহার করা হয়েছে includeহবে import_tasksসমতুল্য হতে পারে?
অ্যান্ডি শিন 20

includeছিল static: yes(যেমন ভদ্র import_tasks), এবং static: no(যেমন include_tasks)।
কনস্ট্যান্টিন সুভেরভ

ডিফল্ট কি জন্য static?
অ্যান্ডি শিন

staticহয় Noneডিফল্টরূপে: যেহেতু Ansible 2.0 টাস্ক অন্তর্ভুক্ত গতিশীল এবং আরও বাস্তব কর্ম মত আচরণ। এর অর্থ তারা লুপ করা যায়, এড়িয়ে যেতে পারে এবং কোনও উত্স থেকে ভেরিয়েবল ব্যবহার করতে পারে। জবাবদিহীরা এটি স্বয়ংক্রিয়ভাবে সনাক্ত করার চেষ্টা করে, তবে আপনি স্থির নির্দেশিকা (যা উত্তরীয় ২.১ এ যুক্ত হয়েছিল) স্বয়ংক্রিয়রীক্ষণকে বাইপাস করতে ব্যবহার করতে পারেন।
কনস্ট্যান্টিন সুভেরভ

15

আমদানি স্থিতিশীল, অন্তর্ভুক্ত গতিশীল। আমদানিগুলি পার্সিংয়ের সময় ঘটে থাকে, এটি রানটাইমের অন্তর্ভুক্ত।

আমদানিগুলি মূলত ফাইল থেকে টাস্কের সাথে প্রতিস্থাপন করে। কোন ব্যাপার import_taskরানটাইম এ। সুতরাং, tagsএবং when(এবং সম্ভবত অন্যান্য বৈশিষ্ট্যগুলি) মতো বৈশিষ্ট্যগুলি প্রতিটি আমদানি করা কার্যটিতে অনুলিপি করা হয়।

includeগুলি সত্যই মৃত্যুদন্ড কার্যকর করা হয়। tagsএবং whenএকটি অন্তর্ভুক্ত টাস্ক শুধুমাত্র টাস্ক নিজেই প্রয়োগ।

কোনও আমদানি করা ফাইল থেকে ট্যাগ করা কাজগুলি যদি importটাস্কবিহীন থাকে তবে তা কার্যকর করা হয়। যদি কোনও কাজ includeআটকে না থাকে তবে কোনও অন্তর্ভুক্ত ফাইল থেকে কোনও কার্য সম্পাদন করা হয় না।

importটাস্ক ট্যাগ করা থাকলে আমদানি করা ফাইল থেকে সমস্ত কাজ সম্পাদন করা হয়। যদি কোনও ট্যাগ করা থাকে তবে কেবলমাত্র অন্তর্ভুক্ত করা ফাইল থেকে ট্যাগ করা কাজগুলি সম্পাদন করা includeহয়।

এর সীমাবদ্ধতা import:

  • সঙ্গে ব্যবহার করা যাবে না with_*বা loopবৈশিষ্ট্যাবলী
  • কোনও ফাইলটি আমদানি করতে পারে না, কোন নামটি একটি ভেরিয়েবলের উপর নির্ভর করে

এর সীমাবদ্ধতা include:

  • --list-tags অন্তর্ভুক্ত ফাইলগুলি থেকে ট্যাগগুলি দেখায় না
  • --list-tasks অন্তর্ভুক্ত ফাইল থেকে কাজ দেখায় না
  • আপনি notifyকোনও হ্যান্ডলার নামটি ট্রিগার করতে ব্যবহার করতে পারবেন না যা ডায়নামিক অন্তর্ভুক্ত থেকে আসে
  • আপনি --start-at-taskডায়নামিকের অন্তর্ভুক্ত কোনও টাস্কে এক্সিকিউশন শুরু করতে ব্যবহার করতে পারবেন না

এটি এখানে এবং এখানে আরও

আমার জন্য যা মূলত নীচে নেমে আসে যে importগুলি লুপ বৈশিষ্ট্যের সাথে ব্যবহার করা যায় না।

importঅবশ্যই এই জাতীয় ক্ষেত্রে ব্যর্থ হবে :

# playbook.yml
- import_tasks: set-x.yml
  when: x is not defined

# set-x.yml
- set_fact
  x: foo
- debug:
  var: x

debugকার্যকর করা হয় না, যেহেতু এটি কার্য whenথেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় import_tasks। সুতরাং, importএর whenগুণাবলী ব্যবহার করে ভেরিয়েবল পরিবর্তন করে এমন কোনও আমদানি টাস্ক ফাইল নেই ।

importএর সাথে শুরু করার জন্য আমার নীতি ছিল , তবে একবার আমার includeনিশ্চিত হওয়া দরকার যে অন্তর্ভুক্ত ফাইল বা এর অন্তর্ভুক্ত ফাইলগুলি থেকে কোনও কিছুই আমদানি করা হয়নি। তবে এটি বজায় রাখা বেশ জঘন্য। এটি এখনও আমাকে ঝামেলা থেকে রক্ষা করবে কিনা তা এখনও পরিষ্কার নয়। অর্থ, includes এবং imports এর মিশ্রণ যা তারা সুপারিশ করে না।

আমি কেবলমাত্র ব্যবহার করতে পারি না import, যেহেতু মাঝে মাঝে আমার লুপের includeকাজগুলি প্রয়োজন । আমি সম্ভবত শুধুমাত্র includeএস এ যেতে পারে । তবে আমি সিদ্ধান্ত নিয়েছি যে কাজটি বেশ কয়েকবার পরিচালিত হওয়ার কথা বাদে অন্যত্র আমদানিতে সরিয়ে নেব। আমি সিদ্ধান্ত নিয়েছি those সমস্ত কৃপণ প্রবণতাগুলি প্রথম হাতের অভিজ্ঞতা অর্জন করার জন্য। আমার প্লেবুকগুলিতে কোনও কিছুই থাকবে না। অথবা আশা করি আমি এটি কার্যকর করার জন্য একটি উপায় খুঁজে বের করব।

ইউপিডি একটি টাস্ক ফাইল তৈরি করতে সম্ভবত দরকারী কৌশল যা বহুবার আমদানি করা যায় তবে একবার কার্যকর করা হয় :

- name: ...
  ...
  when: not _file_executed | default(False)

- name: ...
  ...
  when: not _file_executed | default(False)

...

- name: Set _file_executed
  set_fact:
    _file_executed: True

ইউপিডি একের মিশ্রণের প্রকৃত প্রত্যাশিত প্রভাবের অন্তর্ভুক্ত এবং আমদানিগুলি হ'ল ভার্স ওভাররাইড আমদানিগুলি অন্তর্ভুক্ত করে:

playbook.yml:

- hosts: all
  tasks:
    - import_tasks: 2.yml
      vars:
        v1: 1
    - include_tasks: 2.yml
      vars:
        v1: 1

2.yml:

- import_tasks: 3.yml
  vars:
    v1: 2

3.yml:

- debug:
    var: v1    # 2 then 1

সম্ভবত, কারণ include_tasksপ্রথমে সমস্ত অতিরিক্ত স্ট্যাটিক আমদানি করে এবং তার varsনির্দেশাবলীর মধ্য দিয়ে পাস করা ভেরিয়েবলগুলি পরিবর্তন করে ।

আসলে, এটি কেবল আমদানি দিয়েই ঘটে না:

playbook.yml:

- hosts: all
  tasks:
    - import_tasks: 2.yml
      vars:
        v1: 1
    - include_tasks: 2.yml
      vars:
        v1: 1

2.yml:

- debug:
    var: v1    # 2 then 1
  vars:
    v1: 2

ইউপিডি মিশ্রণের আরেকটি ক্ষেত্রে অন্তর্ভুক্ত এবং আমদানি।

playbook.yml:

- hosts: all
  tasks:
    # here you're bound to use include, some sort of loop
    - include_tasks: 2.yml
      vars:
        https: yes

2.yml:

- import_tasks: 3.yml
  when: https

3.yml:

- import_tasks: 4.yml
  vars:
    https: no  # here we're trying to temporarily override https var
- import_tasks: 4.yml

4.yml:

- debug:
    var: https

আমরা পেয়েছি trueএবং true, পূর্ববর্তী কেসটি দেখতে পাই (অন্তর্ভুক্ত ওয়ার্স আমদানি vars এর চেয়ে বেশি অগ্রাধিকার গ্রহণ করে)। সুতরাং আমরা অন্তর্ভুক্ত স্যুইচ করুন 3.yml। তবে তারপরে প্রথম অন্তর্ভুক্তটি 3.ymlবাদ দেওয়া হয়। যেহেতু এটি when: httpsপিতা-মাতার কাজ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং সম্ভবত পরবর্তীটি টাস্কটির httpsথেকে নেওয়া হয় vars। সমাধানটি হ'ল 2.ymlপাশাপাশি অন্তর্ভুক্ত করা যায়। when: httpsএটি শিশুর কার্যগুলিতে ছড়িয়ে পড়া প্রতিরোধ করে ।


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