उत्तर देने योग्य: केवल एक टैग निर्दिष्ट किए जाने पर कार्य निष्पादित करें


76

कार्य / भूमिकाओं के केवल सबसेट को चलाने के लिए उत्तर देने योग्य टैग का उपयोग किया जा सकता है। इसका मतलब है कि डिफ़ॉल्ट रूप से सभी कार्यों को निष्पादित किया जाता है और हम केवल कुछ कार्यों को निष्पादित करने से रोक सकते हैं।

क्या हम केवल "फू" टैग निर्दिष्ट किए जाने पर किसी कार्य को सीमित कर सकते हैं ? क्या हम whenकिसी कार्य के अनुभाग में वर्तमान टैग का उपयोग कर सकते हैं ?


2
ऐसा लगता है कि आपको जो चाहिए वह है कुछ कार्य सेटिंग जैसे limit_to_tags: foo जो मौजूद नहीं है और मुझे नहीं लगता कि यह अब संभव है। भविष्य के क्रियान्वयन के लिए यह भी योजना होनी चाहिए कि क्या वे या उन टैग को एक साथ कर सकते हैं।
dg

मेरे anser में "Ansible - डिफ़ॉल्ट / स्पष्ट टैग" stackoverflow.com/questions/28789912/…
sirkubax

जवाबों:


38

2.5 2.5 विशेष टैग neverऔर के साथ आता है alwaysneverइस उद्देश्य के लिए टैग का सटीक उपयोग किया जा सकता है। उदाहरण के लिए:

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
Pyzo

क्या आप इसके बारे में थोड़ा और समझा सकते हैं? एक वास्तविक दुनिया उदाहरण?
क्विंटन Par

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यदि आप उस वाक्य रचना को पसंद करते हैं
KCD

धन्यवाद, is defined andवाक्यविन्यास अधिक प्यार करता हूँ । कई पाइपों से अधिक जो मुझे नहीं लगता कि वे सहज हैं।
एलिजा लिन

10

यदि आप एक टैग निर्दिष्ट नहीं करते हैं तो आप गलती से चलने वाले कार्यों से बचने के लिए सशर्त का उपयोग कर सकते हैं । इस पद्धति के लिए चेतावनी यह है कि यदि आप उस अतिरिक्त चर को परिभाषित नहीं करते हैं, तो नाटक त्रुटि और विफल हो जाएगा।

एक्सट्रा-वैर के तर्क का उपयोग करके आप अपने सशर्त को निष्पादित करने के लिए ट्रिगर कर सकते हैं।

Ansible-playbook से --help:

 -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

'टैग' वैरिएबल की जाँच करना Ansible 2.1.1.0 में काम नहीं कर रहा है। परीक्षण के लिए नीचे देखें। मेरे पास कार्य को निष्पादित करने का एक अन्य विचार केवल तभी है जब कोई टैग परिभाषित किया गया हो, दोनों के लिए कार्य करना 1.9.1X और 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' वेरिएबल को सही और फिर असत्य पर सेट किया जाएगा, इसलिए कुछ भी निष्पादित नहीं होता है। यदि आप 'बार' टैग जोड़ते हैं, तो केवल पहली सेटिंग लागू होगी, इसलिए 'फू' वेरिएबल सही होगा, फिर आपके कार्य को निष्पादित किया जाएगा। का आनंद लें!


और यहाँ परीक्षण योग्य 2.1.1.0 में 'टैग' चर के बारे में परीक्षण है:

यहाँ प्लेबुक है:

- 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ध्वज के साथ ansible-playbook चलाने से यह सुनिश्चित हो जाएगा कि केवल उन कार्यों को fooही निष्पादित किया गया है जिन्हें निष्पादित किया गया है। उदाहरण के लिए, मान लें कि हमारे पास एक playbook है, जिसे example.yml कहा जाता है:

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 और --skip- टैग के संयोजन का उपयोग करने की आवश्यकता हो सकती है। उदाहरण के लिए, यदि किसी सम्मिलित कार्य को 'फू' के रूप में टैग किया गया है और शामिल प्लेबुक के अंदर कुछ कार्य को 'बार' के रूप में टैग किया गया है और आप चलते हैं

ansible-playbook --tags "foo"

आंतरिक कार्य (केवल 'बार' के रूप में चिह्नित) निष्पादित किया जाएगा। 'बार' के रूप में टैग किए गए सभी आंतरिक कार्यों के निष्पादन से बचने के लिए आपको निम्नलिखित कमांड को निष्पादित करना होगा

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

7
यह सच नहीं है: "किसी कार्य पर एक टैग निर्दिष्ट करने का मतलब है कि केवल जब यह टैग स्पष्ट रूप से ansible-playbook कमांड को पारित किया जाता है, तो उस कार्य को निष्पादित किया जाएगा।"
गिंबोलैंड

1
दूसरा, कथन सत्य नहीं है।
क्रिस

10
हां, आप यह सुनिश्चित करके व्यवहार को प्राप्त कर सकते हैं कि आप हमेशा सही ansible-playbookविकल्पों का उपयोग करें, लेकिन मुझे लगता है कि ओपी किसी कार्य को एनोटेट करने का तरीका पूछ रहा है ताकि इसे तब तक निष्पादित न किया जाए जब तक कि एक विशिष्ट टैग को ansible-playbookकमांड में स्पष्ट रूप से नहीं जोड़ा जाता है ।
डीजीएच

4
हाँ, यह ओपी के सवाल का जवाब नहीं दे रहा है।
एलन लूज

जब आप कोई टैग निर्दिष्ट नहीं करते हैं तो सभी क्रियाएँ टैग / अनटैग्ड रन होती हैं। टैग चलाने के लिए एक कार्रवाई को बाहर नहीं कर सकते हैं, केवल शामिल हैं। एक एडिटिव फिल्टर के अलावा कोई विधेय तर्क नहीं है।
5

1

एक विशेष टैग है - "कभी नहीं" , जो किसी कार्य को तब तक चलने से रोकेगा जब तक कि एक टैग विशेष रूप से अनुरोध नहीं किया जाता है।

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

उपरोक्त उत्तर में पहले ही उल्लेख किया गया है: serverfault.com/a/907329/105928
ताहा जहाँगीर

0

जब खंड टैग की उपस्थिति का मूल्यांकन नहीं कर सकते। वर्कअराउंड के रूप में, मैं उस टैग / वेरिएबल के लिए विशिष्ट कार्यों को चलाने के लिए चर और टैग का उपयोग करता हूं।

पूर्व: एक प्लेबुक और इन्वेंट्री की कल्पना करें

# सूची
[देव]
192.168.1.1

# site.yml
- यजमान: देव
  भूमिकाओं:
    - {भूमिका: आम}

और आम / कार्यों / main.yml में

# भूमिकाएँ / सामान्य / कार्य / main.yaml
- नाम: लिंक स्थापित करें
  apt: नाम = लिंक राज्य = वर्तमान

- शामिल हैं: uninstall.yml
  कब: अनइंस्टॉल_लिंक परिभाषित किया गया है
  टैग:
    - स्थापना रद्द करें

# भूमिकाएँ / आम / कार्य / अनइंस्टॉल
- नाम: लिंक अनइंस्टॉल करें
  उपयुक्त: नाम = लिंक राज्य = अनुपस्थित

इस दृष्टिकोण के साथ, आप uninstall.yml में केवल कार्यों का चयन करने के लिए टैग का उपयोग करते हैं, लेकिन आपको इसे सक्षम करने के लिए कुछ के लिए 'uninstall_links' चर सेट करने की भी आवश्यकता है। इसलिए यदि आप बिना किसी पैरामीटर के प्लेबुक चलाते हैं, तो यह डिफ़ॉल्ट रूप से इंस्टॉल कार्य को चलाएगा। अनइंस्टॉल करने के लिए, आप अपनी प्लेबुक (या cmdline) पर 'अनइंस्टॉल' टैग सेट कर सकते हैं और वेरिएबल सेट करना होगा । यदि आप टैग सेट नहीं करते हैं, तो यह उस क्रम में सब कुछ स्थापित (इंस्टॉल और अनइंस्टॉल) करेगा, जो पूरी प्रक्रिया का परीक्षण करने के लिए अच्छा है।

सबकुछ कैसे चलाया जाए (यह इंस्टॉल और अनइंस्टॉल होगा):

$ 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

इसलिए, वैरिएबल और टैग भी site.yml / इन्वेंट्री फ़ाइलों में हो सकते हैं, जिससे आप अपने SCM में कमिट कर सकते हैं और अपना इरादा रिकॉर्ड कर सकते हैं।


0

nootal सही है, मेरा दृष्टिकोण काम नहीं करता है - इसे अनदेखा करें :( अब मैं "का उपयोग करता हूं: जब myvar को परिभाषित किया जाता है" और कमांड लाइन स्विच "-e" myvar = X "केवल कार्यों को निष्पादित करने के लिए जब स्पष्ट रूप से अनुरोध किया जाता है।

और भी आसान (कम से कम 2.1.1.0 के साथ):

- 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से शुरू होता है जब आप इसमें से कोई भी निर्दिष्ट नहीं करते हैं, तो इसे वापस सेट करता है ।Trueset_factFalsetagsansible-playbook

जब आप टैग निर्दिष्ट करते हैं, तो in_tagरहता है Trueऔर failकार्य चलता है।

पुनश्च: आप अपने इच्छित किसी भी कार्य में तर्क जोड़ सकते हैं

PS2: आप लॉजिक और हार्डकोड को उन सभी टैग्स को बढ़ा सकते हैं जो आपके पास हैं और निश्चित रूप से set_fact: in_tag_blah=Trueसंयोजन में हैं tags: ["blah"]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.