2015-08-25 4 views
19

पर सशर्त होने पर मेरे पास उन सर्वरों का एक गुच्छा है जिन पर चार भौतिक ड्राइव हैं (/ dev/sda, sdb, sdc, और sdd)। एसडीए पर ओएस स्थापित है।उत्तरदायी - with_items का उपयोग करना और

मुझे एसडीए को छोड़कर प्रत्येक ड्राइव को प्रारूपित करने की आवश्यकता है। मुझे यह जांचने की ज़रूरत है कि प्रत्येक ड्राइव पर डेटा है या नहीं। अगर ऐसा होता है तो मुझे इसे प्रारूपित नहीं करना चाहिए।

# This will get all physical disks (sda, sdb, sdc, etc) and assign them to disk_var 
- name: Get disks 
    set_fact: disk_var="{{hostvars[inventory_hostname]["ansible_devices"].keys()|list}}" 

- name: Check if the disk is partitioned and also ignore sda 
    stat: path=/dev/{{item}}1 
    with_items: disk_var 
    when: item != 'sda' 
    register: base_secondary_partition_{{item}} 

- name: Create GPT partition table 
    command: /sbin/parted -s /dev/{{item}} mklabel gpt 
    with_items: disk_var 
    when: item != 'sda' and base_secondary_partition_{{item}}.stat.exists == false 

इन ड्राइव को स्वरूपित करने में स्पष्ट रूप से और कदम शामिल हैं लेकिन GPT विभाजन तालिका बनाते समय यह अंतिम कार्य में विफल रहता है।

यह तब चलता है जब यह चलता है। आप देखेंगे कि यह पिछले काम में विफल रहता है:

TASK: [role | Get disks] ****************************************************** 
ok: [server1.com] 

TASK: [role | Check if the disk is partitioned] ******************************* 
skipping: [server1.com] => (item=sda) 
ok: [server1.com] => (item=sdd) 
ok: [server1.com] => (item=sdb) 
ok: [server1.com] => (item=sdc) 

TASK: [role | Create GPT partition table] ************************************* 
fatal: [server1.com] => error while evaluating conditional: base_secondary_partition_sdd.stat.exists == false 

FATAL: all hosts have already failed -- aborting 

किसी भी विचार मैं कैसे जांच कर सकते हैं सशर्त ? मुझे यह सुनिश्चित करने की ज़रूरत है कि यदि ड्राइव पर डेटा है, तो यह प्रारूपित नहीं होगा।

उत्तर

35

आपको item नमक के साथ अपना परिणाम पंजीकृत करने की आवश्यकता नहीं है। जब आप लूप का परिणाम पंजीकृत करते हैं (उदा। with_items) पंजीकृत मान में एक कुंजी results होगी जिसमें लूप के सभी परिणामों की एक सूची होगी। (docs देखें)

इसके बजाय आपका मूल उपकरण सूची पर पाशन की है, तो आप कर सकते हैं पहला काम का पंजीकृत परिणाम तो अधिक पाश:

- name: Check if the disk is partitioned and also ignore sda 
    stat: path=/dev/{{item}}1 
    with_items: disk_var 
    when: item != 'sda' 
    register: device_stat 

- name: Create GPT partition table 
    command: /sbin/parted -s /dev/{{ item.item }} mklabel gpt 
    with_items: device_stat.results 
    when: 
    - not item | skipped 
    - item.stat.exists == false 

हालत not item | skipped का ख्याल रखता है कि तत्वों, जिसमें फ़िल्टर कर दिए गए मूल पाश (एसडीए) संसाधित नहीं किया जाएगा।

हालांकि यह आपकी समस्या का समाधान हो सकता है, आपका प्रश्न बहुत दिलचस्प है। Jinja2 में कोई eval सुविधा नहीं है। आप तार जोड़ सकते हैं आप एक चर नाम के रूप में है कि स्ट्रिंग का उपयोग नहीं कर सकते हैं अपने मूल्य को पाने के लिए ...

+2

आप का उपयोग करना चाहिए '{{ item.item}} 'दूसरे कार्य के लिए। – yaegashi

+0

सही, स्पॉटिंग के लिए धन्यवाद! :) – udondan

+0

बढ़िया! यह उत्तरदायी उदाहरणों में होना चाहिए। – onnimonni

4

आपके कार्य इस के रूप में सरल हो सकता है ...

- stat: 
    path: /dev/{{item}}1 
    with_items: ansible_devices.keys() 
    when: item != 'sda' 
    register: stats 
- command: /sbin/parted -s /dev/{{item.item}} mklabel gpt 
    with_items: stats.results 
    when: item.stat | default(false) and item.stat.exists 
संबंधित मुद्दे