从另一个Ansible模块调用Ansible模块?

时间:2017-10-23 15:27:27

标签: python python-2.7 automation ansible ansible-2.x

问题

是否可以通过编程方式从另一个Ansible模块调用Ansible模块?

上下文

我一直在通过Python(ucsmsdk)和Ansible与Cisco UCS合作,创建一种自动化服务配置文件模板的方法(从现在开始的SPT)。我创建了apismodules符合相应Git存储库中设置的标准。

虽然我能够使用Ansible playbook创建这些SPT,但它需要大量重用属性来创建每个单独的项目并遵循其长链父/子关系。我想删除所有这些重用并简化项目的创建,通过提供我需要的所有参数一起完成它们的结构。

以下示例显示了我想要的当前系统。

电流

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:

目前,我唯一的障碍是通过调用以动态和编程方式创建对象的这些模块来引入一些代码重用。

1 个答案:

答案 0 :(得分:3)

您无法在其他模块中执行模块,因为Ansible中的模块是自包含的实体,它们打包在控制器上并传送到远程主机执行。

但是有针对这种情况的动作插件。您可以创建动作插件spt_module(它将在Ansible控制器上本地执行),然后可以根据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

代码未经过测试(错误,可能出现拼写错误)。