উত্তর: কেবলমাত্র যখন ট্যাগ নির্দিষ্ট করা থাকে তখন কার্য সম্পাদন করুন


76

উত্তরযুক্ত ট্যাগগুলি কেবল কার্য / ভূমিকাগুলির একটি উপসেট চালাতে ব্যবহার করা যেতে পারে। এর অর্থ হ'ল ডিফল্টরূপে সমস্ত কার্য সম্পাদিত হয় এবং আমরা কেবলমাত্র কয়েকটি কার্য সম্পাদন করতে বাধা দিতে পারি।

আমরা একটি টাস্ক সীমিত করতে পারেন exectued করা শুধুমাত্র যখন "foo বিন্যাস" ট্যাগ উল্লেখ করা হয়? আমরা কি whenকোনও টাস্কের অংশে বর্তমান ট্যাগ ব্যবহার করতে পারি ?


2
মনে হচ্ছে আপনার প্রয়োজনের কিছু সীমাবদ্ধতার মতো টাস্ক সেটিং যেমন_সামান্য_ ট্যাগগুলি: foo যা বিদ্যমান নেই এবং আমি এখনই তা সম্ভব বলে মনে করি না। ভবিষ্যতে বাস্তবায়নের জন্য ও এবং বা এই ট্যাগগুলি একসাথে করা উচিত কিনা তার জন্যও একটি পরিকল্পনা থাকা দরকার।
0'9 এ 415

- মধ্যে "ডিফল্ট / স্পষ্ট ট্যাগ্স Ansible" আমার anwser কটাক্ষপাত stackoverflow.com/questions/28789912/...
sirkubax

উত্তর:


38

উত্তরযোগ্য 2.5 বিশেষ ট্যাগ neverএবং সহ আসে always। ট্যাগটি neverঠিক এই উদ্দেশ্যে ব্যবহার করা যেতে পারে। উদাহরণ:

tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'never', 'debug' ]

এই উদাহরণে, টাস্ক কেবল তখনই চলবে যখন debug(বা never) ট্যাগটি স্পষ্টভাবে অনুরোধ করা হবে। [জবাবদিহি ডক্স সম্পর্কিত রেফারেন্স]


20

যদিও এটি একটি চক্রাকার সমাধান, এটি কাজ করে।

টাস্ক লিস্টের অভ্যন্তরে যখন সাধারণ এক্সিকিউশন চলে তখন একটি পরিবর্তনশীল নিবন্ধভুক্ত করুন। তারপরে, এমন একটি শর্ত যুক্ত করুন যা ট্যাগ করা কার্যটিতে সেই পরিবর্তনশীল পরীক্ষা করে।

- shell: /bin/true
  register: normal_task_list

- name: Only run when tag is specified
  shell: /bin/echo "Only running because of specified tag"
  when: normal_task_list is not defined
  tags: specified

আপনি এটি untaggedসম্পাদন করতেও ব্যবহার করতে পারেন:- set_fact: untagged_run=true tags: untagged
পাইজো

আপনি এই সম্পর্কে আরও কিছু ব্যাখ্যা করতে পারেন? একটি বাস্তব বিশ্বের উদাহরণ?
কুইন্টিন পার

17

কমান্ড-লাইন ভেরিয়েবল ( --extra-vars) ব্যবহারের পরামর্শ দিয়ে উত্তরে মন্তব্য করতে বা মন্তব্য করার মতো পর্যাপ্ত খ্যাতি আমার নেই, তবে এতে যোগ করার জন্য আমার এই আছে:

এই পদ্ধতির সতর্কতা হ'ল আপনি যদি অতিরিক্ত পরিবর্তনশীলটি সংজ্ঞায়িত না করেন তবে প্লেটি ত্রুটি করবে এবং ব্যর্থ হবে।

আপনি --extra-varsপ্লেবুকে নিজেই একটি ডিফল্ট মান নির্ধারণ করে সংজ্ঞাটির অভাবে খেলতে ব্যর্থতা রোধ করতে পারেন :

---
- hosts: ...
# ↓↓↓
  vars:
    thorough: false
# ↑↑↑
  tasks:
  - name: apt - install nfs-common only when thorough is true
    when: thorough | bool
    apt:
      cache_valid_time: 86400
      force: yes
      pkg:
        - nfs-common

ওভাররাইডিংয়ের মাধ্যমে --extra-varsএখনও কাজ করা হবে কারণ কমান্ড লাইনে সংজ্ঞায়িত ভেরিয়েবলগুলি অন্যান্য সমস্ত সংজ্ঞার চেয়ে বেশি প্রাধান্য পায়।

ফলাফলটি হ'ল নাটকটি ত্রুটি ছাড়াই চলে যখন কমান্ড লাইনে thoroughপরিবর্তন করা trueহয় না।


5
একই ব্যবহার করে অর্জন করা যেতে পারে thorough | default('no') | bool
কোস্তি সিউদাতু

2
বা when: thorough is defined and thoroughযদি আপনি সেই বাক্য
গঠনটি

ধন্যবাদ, is defined andসিনট্যাক্সটি আরও বেশি পছন্দ করুন। আমি একাধিক পাইপ যা স্বজ্ঞাত মনে করি না তার চেয়ে বেশি।
লেন

10

আপনি শর্তসাপেক্ষে চলমান কাজগুলি থেকে রক্ষা করতে ব্যবহার করতে পারেন যা অন্যথায় আপনি কোনও ট্যাগ নির্দিষ্ট না করে কার্যকর করা হবে। এই পদ্ধতির সতর্কতা হ'ল আপনি যদি অতিরিক্ত পরিবর্তনশীলটি সংজ্ঞায়িত না করেন তবে প্লেটি ত্রুটি করবে এবং ব্যর্থ হবে।

অতিরিক্ত ভারসাম্য যুক্তি ব্যবহার করে আপনি নিজের শর্তটি কার্যকর করতে ট্রিগার করতে পারেন।

উত্তরযোগ্য-প্লেবুক থেকে - সহায়তা:

 -e EXTRA_VARS, --extra-vars=EXTRA_VARS
    set additional variables as key=value or YAML/JSON

উদাহরণ:

ansible-playbook test.yaml -e "thorough=true"

test.yaml:

...
- name: apt - install nfs-common only when thorough is true
  apt:
    cache_valid_time: 86400
    force: yes
    pkg:
    - nfs-common
  when: thorough | default(False)
...

2
আপনি যদি "পুঙ্খানুপুঙ্খ" সুনির্দিষ্ট ব্যবহার না করেন তবে কোনও ত্রুটি এড়ানোর জন্য thorough | default("false") | match("true")। ডিফল্ট হতে হবে না false, কিছু মিলছে না true, তবে এটি পঠনযোগ্যতার উন্নতি করে।
টম উইলসন

4

'ট্যাগ' ভেরিয়েবল পরীক্ষা করা উত্তরযোগ্য ২.১.১.০ এ কাজ করছে না। পরীক্ষার জন্য নীচে দেখুন। জবাবদিহিত 1.9.X এবং 2.XY উভয়ের জন্য কাজ করে শুধুমাত্র যখন কোনও ট্যাগ সংজ্ঞায়িত হয় তখনই টাস্কটি সম্পাদন করার আমার কাছে অন্য ধারণা রয়েছে:

- set_fact: foo=true
  tags: bar
- set_fact: foo=false
- name: do something when 'bar' tag is defined
  debug: var=foo
  when: foo
  tags: bar

সেই সাথে, কোনও ট্যাগ ছাড়াই প্লেবুক চালানোর সময়, 'foo' ভেরিয়েবলটি সত্য হয়ে যায় তবে মিথ্যাতে সেট হয়ে যায়, তাই কিছুই কার্যকর করা হয় না। আপনি যদি 'বার' ট্যাগ যুক্ত করেন তবে কেবলমাত্র প্রথম সেটিংস প্রয়োগ করা হবে, সুতরাং 'foo' পরিবর্তনশীলটি সত্য হবে, তবে আপনার কার্য সম্পাদন হবে। উপভোগ করুন!


এবং এখানে উত্তরগুলি ২.১.১.০ তে 'ট্যাগগুলি' পরিবর্তনশীল সম্পর্কে পরীক্ষা করা হচ্ছে:

এখানে প্লেবুক:

- hosts: localhost
  connection: local
  tasks:
    - name: display tags variable
      debug: var=tags
      tags: foo

    - name: do something only when tag 'foo' is provided
      debug: var=tag
      when: tags is defined
      tags: foo

এবং এখানে আউটপুট:

$ ansible-playbook --version ; ansible-playbook ./test.yml -t foo
ansible-playbook 2.1.1.0
  config file = /home/nootal/projects/ivy/src/ansible/ansible.cfg
  configured module search path = Default w/o overrides

PLAY [localhost] ***************************************************************

TASK [display tags variable] ***************************************************
ok: [localhost] => {
    "tags": "VARIABLE IS NOT DEFINED!"
}

TASK [do something only when tag 'foo' is provided] ****************************

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0   

2

হ্যাঁ. --tags fooপতাকা সহ উত্তরসূচক-প্লেবুক চালানো নিশ্চিত করবে যে কেবল ট্যাগ হওয়া কাজগুলি fooকার্যকর করা হয়েছে। উদাহরণস্বরূপ, ধরুন আমাদের কাছে উদাহরণ নামে একটি প্লেবুক রয়েছে ym জিম:

tasks:

  - yum: name={{ item }} state=installed
    with_items:
       - httpd
       - memcached
    tags:
       - packages

  - name: some other task
    ..
    tags:
      - some other tag

চলমান:

ansible-playbook example.yml --tags "packages"

নিশ্চিত করবে যে কেবল ইয়াম টাস্ক কার্যকর হয়েছে।

সুতরাং যখন বিভাগটি শর্তসাপেক্ষে কোনও কার্য সম্পাদন করতে হবে তখন আপনাকে প্রকৃতপক্ষে ট্যাগগুলি ব্যবহার করার দরকার নেই। লক্ষ্য করুন যে আপনার প্লেবুকগুলি / ভূমিকার জটিলতার উপর নির্ভর করে কোন কাজ সম্পাদন করা হয় তা নিয়ন্ত্রণ করতে আপনাকে --tags এবং --স্কিপ-ট্যাগের সংমিশ্রণ ব্যবহার করতে হতে পারে। উদাহরণস্বরূপ, যদি কোনও অন্তর্ভুক্ত টাস্কগুলিকে 'foo' হিসাবে ট্যাগ করা হয় এবং অন্তর্ভুক্ত প্লেবুকের অভ্যন্তরে কিছু টাস্ককে 'বার' হিসাবে ট্যাগ করা হয় এবং আপনি রান করেন

ansible-playbook --tags "foo"

অভ্যন্তরীণ টাস্ক (কেবলমাত্র 'বার' হিসাবে ট্যাগ করা) কার্যকর করা হবে। 'বার' হিসাবে ট্যাগ করা সমস্ত অভ্যন্তরীণ কার্য সম্পাদন এড়াতে আপনাকে নিম্নলিখিত কমান্ডটি প্রয়োগ করতে হবে

ansible-playbook --tags foo --skip-tags bar

7
এটি সত্য নয়: "কোনও কার্যে একটি ট্যাগ নির্দিষ্ট করার অর্থ এই যে কেবল যখন এই ট্যাগটি স্পষ্টভাবে উত্তরযোগ্য-প্লেবুক কমান্ডের কাছে পাঠানো হয় তখন সেই কাজটি কার্যকর করা হবে" "
জিম্বোল্যান্ড

1
দ্বিতীয়ত, বিবৃতিটি সত্য নয়।
ক্রিস

10
হ্যাঁ, আপনি সর্বদা সঠিক ansible-playbookবিকল্পগুলি ব্যবহার করে তা নিশ্চিত করে আপনি আচরণটি অর্জন করতে পারেন , তবে আমি মনে করি যে ওপ কোনও কাজকে টীকায়িত করার জন্য একটি উপায় চেয়েছে যাতে ansible-playbookকমান্ডে একটি নির্দিষ্ট ট্যাগ স্পষ্টভাবে যুক্ত না করা হলে এটি কার্যকর করা হয় না ।
dgh

4
হ্যাঁ, এটি ওপি-র প্রশ্নের উত্তর দিচ্ছে না।
অ্যালেন লুইস

আপনি যখন কোনও ট্যাগ নির্দিষ্ট না করেন তখন সমস্ত ক্রিয়াকলাপ ট্যাগ করা / অবরুদ্ধ থাকে run ট্যাগগুলি চালানোর জন্য কোনও ক্রিয়াকে বাদ দিতে পারে না, কেবল অন্তর্ভুক্ত করে। একটি অ্যাডিটিভ ফিল্টার ব্যতীত কোনও ভবিষ্যদ্বাণীপূর্ণ যুক্তি নেই।
bbaassssiiee

1

একটি বিশেষ ট্যাগ রয়েছে - "কখনই নয়" , যা কোনও ট্যাগকে বিশেষভাবে অনুরোধ না করা হলে কোনও কাজ চালানো থেকে বিরত রাখবে।

tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'never', 'debug' ]

উপরের উত্তরে ইতিমধ্যে উল্লিখিত হয়েছে: সার্ভারফলট.এ
তাহা জাহাঙ্গীর

0

যখন ক্লজ ট্যাগগুলির উপস্থিতি মূল্যায়ন করতে পারে না। কাজের হিসাবে, আমি সেই ট্যাগ / ভেরিয়েবলের সাথে নির্দিষ্ট কাজগুলি চালনার জন্য ভেরিয়েবল এবং ট্যাগগুলি একসাথে ব্যবহার করি।

প্রাক্তন: একটি প্লেবুক এবং ইনভেন্টরি কল্পনা করুন

# জায়
[দেব]
192.168.1.1

# সাইট.yml
- হোস্ট: দেব
  ভূমিকা:
    - {ভূমিকা: সাধারণ}

এবং সাধারণ / কার্য / মেইন.আইএমএল এ

# ভূমিকা / সাধারণ / কার্য / প্রধান.আইএমএল
- নাম: লিঙ্ক ইনস্টল করুন
  apt: নাম = লিঙ্কস রাজ্য = উপস্থিত

- অন্তর্ভুক্ত: আনইনস্টল.আইএমএল
  কখন: আনইনস্টল_লিঙ্কগুলি সংজ্ঞায়িত করা হয়
  ট্যাগ:
    - আনইনস্টল করুন

# ভূমিকা / সাধারণ / কার্য / আনইনস্টল.আইএমএল
- নাম: লিঙ্ক আনইনস্টল করুন
  apt: নাম = লিঙ্ক রাজ্য = অনুপস্থিত

এই পদ্ধতির সাহায্যে আপনি আনইনস্টল.আইএমএল-এ কেবলমাত্র কাজগুলি নির্বাচন করতে ট্যাগটি ব্যবহার করেন তবে এটি সক্ষম করতে আপনাকে 'আনইনস্টল_লিংক' পরিবর্তনশীলও সেট করতে হবে। সুতরাং আপনি যদি কোনও পরামিতি ছাড়াই প্লেবুক চালনা করেন তবে এটি ডিফল্টরূপে ইনস্টল টাস্কটি চালায়। আনইনস্টল করতে, আপনি আপনার প্লেবুকের (বা সেমিডলাইন) ট্যাগটি 'আনইনস্টল' সেট করতে পারেন এবং ভেরিয়েবল সেট করতে হবে । আপনি যদি ট্যাগটি সেট না করেন, এটি সেই ক্রমে সমস্ত কিছু (ইনস্টল এবং আনইনস্টল) চালাবে যা পুরো প্রক্রিয়াটি পরীক্ষা করা ভাল।

কীভাবে সমস্ত চালানো যায় (এটি ইনস্টল ও আনইনস্টল হবে):

$ ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"

ডেভ গ্রুপটিতে কীভাবে কেবল 'আনইনস্টল' ট্যাগ চালানো যায়

$ ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall

অতএব, ভেরিয়েবল এবং ট্যাগগুলি সাইট.আইএমএল / ইনভেন্টরি ফাইলগুলিতেও থাকতে পারে, আপনাকে আপনার এসসিএমের প্রতিশ্রুতিবদ্ধ করতে এবং আপনার অভিপ্রায় রেকর্ড করতে দেয়।


0

নোটাল ঠিক আছে, আমার পদ্ধতি কাজ করে না - এটিকে উপেক্ষা করুন :( আমি এখন স্পষ্টভাবে অনুরোধ করলেই কার্যগুলি সম্পাদন করতে "যখন: মাইভার সংজ্ঞায়িত করা হয়" এবং কমান্ড লাইনটি "-e" myvar = X "ব্যবহার করি।

আরও সহজ (কমপক্ষে উত্তরযোগ্য ২.১.১.০ সহ):

- name: do something only when tag 'foo' is provided
  when: tags is defined
  tags: foo

-> কেবল তখনই কার্যকর করা হবে যখন ট্যাগগুলি সরবরাহ করা হয় এবং ট্যাগগুলিতে "ফু" অন্তর্ভুক্ত থাকে


0

অন Ansible 2.3.2.0, এখানে আমার সমস্যার সমাধান:

---
- hosts: localhost
  gather_facts: no
  vars:
    in_tag: yes
  tasks:
    - set_fact: in_tag=no
    - fail:
        msg: "recently_added is set and you're using blah tag"
      when: ( in_tag | bool )
      tags:
        - blah
    - debug:
        msg: "always remember"

এটা তোলে সেটিং দ্বারা আরম্ভ করা হয় in_tagথেকে Trueতারপর একটি set_factএটি ফিরে সেট Falseউপর যদি আপনি কোন উল্লেখ না তখন tagsথেকে ansible-playbook

আপনি যখন ট্যাগ নির্দিষ্ট করেন, তখন in_tagথাকেন Trueএবং failটাস্কটি চলে।

PS: আপনি যে কোনও কাজে লজিক যুক্ত করতে পারেন

PS2: আপনি লজিক এবং বর্ধিত করে এবং সমস্ত ট্যাগ আপনি হার্ডকোড করতে set_fact: in_tag_blah=Trueসঙ্গে একযোগে tags: ["blah"]অবশ্যই।

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