Ansible - plugin - action

操作插件允许您将本地处理和本地数据与模块功能集成在一起。

要创建操作插件,就要创建一个以 action base 类为父类的新类

 

from ansible.plugins.action import ActionBase

class ActionModule(ActionBase):

 

从那里,使用 _execute_module 方法执行模块以调用原始模块。模块执行成功后,可以修改模块返回数据。

 

==================================================

实例:

vim plugins/action/test_0529.py

from __future__ import (absolute_import, division, print_function)
from ansible.plugins.action import ActionBase

class ActionModule(ActionBase):

    TRANSFERS_FILES = False
    def _get_arg(self, arg, default=None):
        if arg in self._task.args:
            return self._task.args[arg]
        if default is None:
            raise AnsibleError("Missing required option: {0}".format(arg))
        else:
            return default

    def _get_arg_with_aliases(self, accepted_args, default=None):
        for alias in accepted_args:
            if alias in self._task.args:
                return self._task_args[alias]
        if default is None:
            raise AnsibleError("Missing required option: one of ({0})".format(accepted_args.join(', ')))
        else:
            return default

    def run(self, tmp=None, task_vars=None):
        arg1 = self._get_arg('arg1')
        arg2 = self._get_arg('arg2')
        arg3 = self._get_arg('arg3')
        args = [ i for i in (arg1, arg2, arg3) ]
        return { 'changed': False, 'args': " ".join(args) }

vim test.yml

---
- hosts: all
  remote_user: root
  gather_facts: no
  vars:
  tasks:
    - name: test01
      test_0529:
        arg1: 'a'
        arg2: 'b'
        arg3: 'c'

结果

TASK [test01] **********************************************************************************
task path: /root/ansible-test/test.yml:7
ok: [dbw21as] => {
    "args": "a b c",
    "changed": false
}

 

==================================================

如果有多个module,那么获取参数的 _get_arg 方法就要写很多次,给提取出来,写到一个类中。

vim plugins/action/action_base.py

from ansible.plugins.action import ActionBase
from ansible.errors import AnsibleError

class ActionModule(ActionBase):
    def _get_arg(self, arg, default=None):
        if arg in self._task.args:
            return self._task.args[arg]
        if default is None:
            raise AnsibleError("Missing required option: {0}".format(arg))
        else:
            return default

    def _get_arg_with_aliases(self, accepted_args, default=None):
        for alias in accepted_args:
            if alias in self._task.args:
                return self._task_args[alias]
        if default is None:
            raise AnsibleError("Missing required option: one of ({0})".format(accepted_args.join(', ')))
        else:
            return default

在其他module中引用即可,省去了冗余的代码

from ansible.plugins.action import ActionBase
from ansible.plugins.loader import action_loader, plugin_utils_loader

class ActionModule(action_loader.get('ta_action_base', class_only=True)):
    def run(self, tmp=None, task_vars=None):
        ......

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值