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

8

问题

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

背景

我一直在使用Python (ucsmsdk)和Ansible与Cisco UCS一起工作,创建了自动化服务配置文件模板(SPTs)。我已经按照各自的Git存储库中设置的标准创建了API模块

虽然我能够使用Ansible播放书来创建这些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个回答

10

在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

代码未经过测试(可能存在错误和拼写错误)。


{btsdaf} - de-crob
{btsdaf} - Konstantin Suvorov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接