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


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

क्या हम एक कार्य को निकालने के लिए सीमित कर सकते हैं केवल जब "foo" टैग निर्दिष्ट किया गया है? क्या हम वर्तमान टैग का उपयोग कर सकते हैं when एक कार्य का खंड?


57
2017-08-24 10:08


मूल


ऐसा लगता है कि आपको जो चाहिए वह कुछ कार्य सेटिंग है जैसे limit_to_tags: foo जो मौजूद नहीं है और मुझे नहीं लगता कि यह अभी संभव है। एक भविष्य के कार्यान्वयन के लिए एक योजना है कि वह एक या एक साथ टैग करें या नहीं। - dgh
"Ansible - डिफ़ॉल्ट / स्पष्ट टैग" में मेरे anwser पर एक नज़र डालें stackoverflow.com/questions/28789912/... - sirkubax


जवाब:


हालांकि यह एक चौराहे समाधान है, यह काम करता है।

सामान्य निष्पादन चलाने पर कार्य सूची के अंदर एक चर पंजीकृत करें। फिर, उस स्थिति को जोड़ें जो उस चर को टैग किए गए कार्य को जांचता है।

- 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

20
2018-01-13 16:25



वास्तव में अच्छा विचार है - perigee
आप भी उपयोग कर सकते हैं untagged यह प्राप्त करने के: - set_fact: untagged_run=true  tags: untagged - Pyzo
क्या आप इसके बारे में कुछ और बता सकते हैं? एक वास्तविक दुनिया का उदाहरण? - Quintin Par


मेरे पास कमांड लाइन चर के उपयोग का सुझाव देने वाले उत्तर पर ऊपर उठाने या टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है (--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 कमांड लाइन पर।


17
2018-05-08 01:17



इसका उपयोग करके हासिल किया जा सकता है thorough | default('no') | bool। - Costi Ciudatu
या when: thorough is defined and thorough अगर आप उस वाक्यविन्यास को पसंद करते हैं - KCD
धन्यवाद, प्यार करो is defined and वाक्यविन्यास और अधिक। कई पाइपों से अधिक जो मुझे नहीं लगता है सहज हैं। - Elijah Lynn


उत्तर 2.5 विशेष टैग के साथ आता है never तथा always। टैग never इस उद्देश्य के लिए बिल्कुल इस्तेमाल किया जा सकता है। उदा:

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

इस उदाहरण में, कार्य केवल तब ही चलाएगा जब debug (या never) टैग स्पष्ट रूप से अनुरोध किया गया है। [उत्तरदायी दस्तावेज़ों पर संदर्भ]


10
2018-04-12 10:58





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

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

उत्तर-प्लेबुक से --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 | match("true")
...

9
2018-03-12 20:51



यदि आप "पूरी तरह से" परिभाषित नहीं करते हैं तो किसी त्रुटि से बचने के लिए बस उपयोग करें thorough | default("false") | match("true")। डिफ़ॉल्ट होना जरूरी नहीं है false, बस कुछ भी मेल नहीं खाता है true, लेकिन यह पठनीयता में सुधार करता है। - Tom Wilson


हाँ। के साथ उत्तरदायी प्लेबुक चल रहा है --tags foo ध्वज यह सुनिश्चित करेगा कि केवल उन कार्यों को टैग किया गया है foo निष्पादित कर रहे हैं उदाहरण के लिए, मान लें कि हमारे पास 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-tag के संयोजन का उपयोग करने की आवश्यकता हो सकती है ताकि यह नियंत्रित किया जा सके कि कौन से कार्य निष्पादित किए गए हैं। उदाहरण के लिए, यदि कोई शामिल कार्य 'foo' के रूप में टैग किया गया है और शामिल प्लेबुक के अंदर कुछ कार्य को 'बार' के रूप में टैग किया गया है और आप दौड़ते हैं

ansible-playbook --tags "foo"

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

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

3
2017-08-24 16:49



यह सच नहीं है: "किसी कार्य पर एक टैग निर्दिष्ट करना मतलब है कि केवल तभी जब यह टैग स्पष्ट रूप से उत्तर-प्लेबुक कमांड को पारित किया जाता है, तो कार्य निष्पादित किया जाएगा।" - gimboland
सेकेंड, कथन सत्य नहीं है। - Chris
तुम सही हो। मैंने दोहराया है धन्यवाद! - Shahar
हां, आप यह सुनिश्चित करके व्यवहार प्राप्त कर सकते हैं कि आप हमेशा सही उपयोग करें ansible-playbook विकल्प, लेकिन मुझे लगता है कि ओपी एक कार्य को एनोटेट करने का एक तरीका मांग रहा है ताकि इसे निष्पादित न किया जाए जब तक कोई विशिष्ट टैग स्पष्ट रूप से जोड़ा नहीं जाता ansible-playbook आदेश। - dgh
हाँ, यह ओपी के सवाल का जवाब नहीं दे रहा है। - Allen Luce


'टैग' चर की जांच करना Ansible 2.1.1.0 में काम नहीं कर रहा है। परीक्षण के लिए नीचे देखें। जब टैग को परिभाषित किया जाता है, तो केवल कार्य निष्पादित करने का दूसरा विचार है, उत्तर 1.9.एक्स और 2.X.Y दोनों के लिए काम करना:

- 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' चर सत्य होगा, फिर आपका कार्य निष्पादित किया जाएगा। का आनंद लें!


और यहां Ansible 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
2017-09-29 07:30





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

पूर्व: एक प्लेबुक और सूची की कल्पना करो

# सूची
[देव]
192.168.1.1

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

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

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

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

# भूमिकाएं / सामान्य / कार्य / uninstall.yml
- नाम: अनइंस्टॉल लिंक
  apt: नाम = लिंक राज्य = अनुपस्थित

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

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

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

Dev समूह पर केवल 'अनइंस्टॉल करें' टैग कैसे चलाएं

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

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


0
2018-04-18 18:35