2014-07-07 8 views
7

मेरे पास एक प्लेबुक है जो एक रेडिस क्लस्टर और nutcracker प्रॉक्सी के रूप में स्थापित करेगी। कौन से मेजबान प्रति समूह परिभाषित करते हैं कि कौन से भूमिकाएं परिभाषित की जाती हैं। मैं कार्यों को चलाने के सामने एक सैनिटी चेक जोड़ना चाहता हूं, जो है:उत्तरदायी प्लेबुक चलाने से पहले स्वच्छता जांच -> मेजबान

  • क्या वास्तव में एक प्रॉक्सी है? (समूह ए में 1 मेजबान)
  • कम से कम एक redis नोड है (> = समूह बी में 1 मेजबान)

मैं पहले से ही, एक समाधान है, हालांकि मुझे लगता है कि यह बहुत बदसूरत है और सोचा कि हो गया है कुछ बेहतर है, लेकिन मुझे बस यह नहीं मिल रहा है। मैं वर्तमान में एक स्थानीय कार्य चलाता हूं जो प्लेबुक को फिर से सूची-होस्ट पैरामीटर के साथ बुलाता है और आउटपुट की जांच करता है।

- name: Make sure there is only one proxy defined 
    shell: ansible-playbook -i {{ inventory_file }} redis-cluster.yml --tags "redis-proxy" --list-hosts 
    register: test 
    failed_when: test.stdout.find("host count=1\n") == -1 
    changed_when: 1 == 2 

यह काम करता है लेकिन इस अतिरिक्त कॉल के बिना समूह में होस्ट की संख्या की जांच करने का कोई आसान तरीका नहीं है?

उत्तर

21

(अस्वीकरण: मुझे लगता है कि मैं एक ऐसी ही समस्या हो रही है और यह पता लगाना है कि मैं यहाँ दी गई अन्य जवाब ठीक हो जानी चाहिए के बाद महसूस किया।)

क्या Woodham Jinja2 फ़िल्टर का उपयोग कर के बारे में उल्लेख किया सही है लेकिन गलत तरीके से इस्तेमाल किया गया था। वे playbooks में इस्तेमाल किया जा सकता, लेकिन आप इस फैशन में उन्हें इस्तेमाल करना चाहिए: इस तरह आसानी से

vars: 
    num_hosts: "{{ groups['redis-proxy'] | length }}" 

आप हम कर सकते हैं श्रृंखला फिल्टर देख सकते हैं और बाद में हम इस चर पर नियंत्रण हो सकता है:

- name: Validate Number of Nodes 
    fail: msg="The number of nodes must be exactly 1!" 
    when: num_hosts | int != 1 
1

आपको जादू चर का उपयोग करके ऐसा करने में सक्षम होना चाहिए। (यहां उत्तरदायी दस्तावेज देखें: http://docs.ansible.com/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts)

किसी समूह में होस्ट की संख्या प्राप्त करने के लिए, आप समूह को groups['group_name'] का उपयोग करके प्राप्त कर सकते हैं। फिर आप उस समूह की लंबाई प्राप्त करने के लिए Jinja2 फ़ाइलर length (http://jinja.pocoo.org/docs/templates/#length) का उपयोग कर सकते हैं।

उदा। (एक प्लेबुक में)

vars: 
    num_redis_proxy_hosts: length(groups['redis-proxy']) 
संबंधित मुद्दे