python - एक और अंडायबल मॉड्यूल से एक अनज्य मॉड्यूल कॉलिंग?



python-2.7 automation (1)

सवाल

क्या अन्य Ansible मॉड्यूल से एक अंकीय मॉड्यूल को प्रोग्राम करना संभव है?

प्रसंग

मैं सिस्को UCS के साथ पायथन (ucsmsdk) और Ansible के साथ काम कर रहा हूं ताकि स्वचालित सेवा प्रोफाइल टेम्पलेट्स (अब से एसपीटीज़) का साधन बनाया जा सके। मैंने एपीआईएस बनाया है और संबंधित जीआईटी रेपो में सेट मानकों के अनुरूप मॉड्यूल हैं

जबकि मैं इन एसपीटी को एक अनन्जिबल प्लेबुक के साथ बनाने में सक्षम हूं, इसमें प्रत्येक व्यक्तिगत मद बनाने और माता-पिता / बच्चे के संबंधों की उनकी लंबी चेन का पालन करने के लिए बहुत अधिक पुन: उपयोग किए जाने वाले गुणों की आवश्यकता है। मैं इस सब से पुनः उपयोग को हटाना चाहूंगा और उन सभी मापदंडों को खिलाकर वस्तुओं के सृजन को सरल करना चाहूंगा, जिन्हें मैं एक-एक में उनकी संरचना के साथ मिलकर काम करना चाहता हूं।

नीचे दिए गए उदाहरण वर्तमान प्रणाली को मैं क्या चाहूंगा I

वर्तमान

tasks:
- name: create ls server
  ls_server_module:
    name: ex
    other_args:
    creds: 
- name: create VNIC Ether
  vnic_ether_module:
    name: ex_child
    parent: ex
    other_args: 
    creds: 
- name: create VNIC Ether If (VLAN)
  vnic_ether_if_module:
    name: ex_child_child
    parent: ex_child
    creds: 
- name: create VNIC Ether
  vnic_ether_module:
    name: ex_child_2
    parent: ex
    other_args: 
    creds: 

चाहा हे

tasks:
- name: create template
  spt_module:
    name: ex
    other_args:
    creds: 
    LAN:
      VNIC:
      - name: ex_child
        other_args:
        vlans:
        - ex_child_child
      - name: ex_child_2
        other_args:

वर्तमान में, मेरी एकमात्र बाधा इन मॉड्यूल को कॉल करके कुछ कोड पुन: उपयोग कर रही है जो ऑब्जेक्ट को एक गतिशील और प्रोग्राममैटिक तरीके से बनाते हैं।


आप किसी मॉड्यूल को अन्य मॉड्यूल के भीतर निष्पादित नहीं कर सकते, क्योंकि अंकेबल में मॉड्यूल आत्मनिहित संस्थाएं हैं, जो कि नियंत्रक पर पैक किए जाते हैं और निष्पादन के लिए दूरस्थ होस्ट को वितरित किए जाते हैं।

लेकिन इस परिस्थितियों के लिए एक्शन प्लगिन हैं आप ऐक्शन प्लगइन spt_module बना सकते हैं (यह स्थानीय रूप से अंकीय नियंत्रक पर निष्पादित होगा) जो कि lan/vnic मापदंडों के आधार पर कई अलग-अलग मॉड्यूल निष्पादित कर सकते हैं।

ऐसा कैसे होता है कि आपका क्रिया ( spt_module.py ) प्लगिन (बहुत सरल) जैसा दिख सकता है:

from ansible.plugins.action import ActionBase

class ActionModule(ActionBase):

    def run(self, tmp=None, task_vars=None):

        result = super(ActionModule, self).run(tmp, task_vars)

        vnic_list = self._task.args['LAN']['VNIC']
        common_args = {}
        common_args['name'] = self._task.args['name']

        res = {}
        res['create_server'] = self._execute_module(module_name='ls_server_module', module_args=common_args, task_vars=task_vars, tmp=tmp)
        for vnic in vnic_list:
          module_args = common_args.copy()
          module_args['other_args'] = vnic['other_args']
          res['vnic_'+vnic['name']] = self._execute_module(module_name='vnic_ether_module', module_args=module_args, task_vars=task_vars, tmp=tmp)
        return res

कोड का परीक्षण नहीं किया गया है (बग, टाइपो संभव)।





ansible-2.x