操作插件允许您将本地处理和本地数据与模块功能集成在一起。
要创建操作插件,就要创建一个以 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):
......