插件自定义开发
插件的执行优先级是高于模块的,且和模块的使用有很大的区别
和模块使用不同,插件是在ansible 服务器上执行的 由于是在ansible 服务器上执行的,所以需要遵循ansible 和 本地python的版本做匹配,且开发语言只能是python使用场景
除Paramiko, SSH, Local, Winrm连接方式外,希望Ansible基于新的通信方式与远程主机交互,比如需要支持SDN的一些协议,比如netconf等。 基于Connection类型插件进行编写,在配置文件/api 参数内会有ansible_connection=xxx,默认是smart,可以自己定义自己需求的连接方式进行插件的开发。 除Ansible内置的with_items、with_fileglob循环体外,希望有新的遍历方式 基于Lookup类型插件进行编写。 除了Ansible内置的host_vars、group_vars等变量调用方式外,希望有新的变量定义方式 Vars类型插件,其实一般用不到,因为一般动态inventory 就可以满足对应需求了。 除了Ansible的内置的Jinja2模板渲染、to_yaml、to_json等过滤器外,希望有新的过滤器 基于Filter类型插件进行编写,Filter类型插件其实是Jinja2模板引擎的Filter,Jinja2的常用的Filter实现有to_yaml、to_json,官网实现的Filter Plugins代码全合并在core.py脚本中,新Filter插件需在该脚本的基础上编写 定义新的回调机制,即捕获响应事件后自定义新的响应形式。 Callback类型插件是用的比较多的一个插件,一般是基于callbackbase 进行继承后再编写,可以在自己定义的callback 里添加类似数据落库,邮件/短信告警等功能。所有的插件类型
所有的插件类型可以在配置文件里看到
# set plugin path directories here, separate with colons #action_plugins = /usr/share/ansible/plugins/action #become_plugins = /usr/share/ansible/plugins/become #cache_plugins = /usr/share/ansible/plugins/cache #callback_plugins = /usr/share/ansible/plugins/callback #connection_plugins = /usr/share/ansible/plugins/connection #lookup_plugins = /usr/share/ansible/plugins/lookup #inventory_plugins = /usr/share/ansible/plugins/inventory #vars_plugins = /usr/share/ansible/plugins/vars #filter_plugins = /usr/share/ansible/plugins/filter #test_plugins = /usr/share/ansible/plugins/test #terminal_plugins = /usr/share/ansible/plugins/terminal #strategy_plugins = /usr/share/ansible/plugins/strategy
插件编写实例
注意事项:
使用Python语言编写 可以抛出异常 返回unicode类型的字符串 符合Ansible的配置和文档标准举个callback 重写的例子, 该代码意思是将所有的callback 返回全部pass掉,之前的api 开发里,也有类似的callback 重新处理的代码。
from ansible.plugins.callback import CallbackBase class CallbackModule(CallbackBase): ''' Magic black hole, nothing will show up. ''' CALLBACK_VERSION = 2.0 CALLBACK_TYPE = 'stdout' CALLBACK_NAME = 'BlackHole' # only needed if you ship it and don't want to enable by default CALLBACK_NEEDS_WHITELIST = True def v2_on_any(self, *args, **kwargs): pass def v2_runner_on_failed(self, result, ignore_errors=False): pass def v2_runner_on_ok(self, result): pass def v2_runner_on_skipped(self, result): pass def v2_runner_on_unreachable(self, result): pass def v2_runner_on_async_poll(self, result): pass def v2_runner_on_async_ok(self, result): pass def v2_runner_on_async_failed(self, result): pass def v2_playbook_on_start(self, playbook): pass def v2_playbook_on_notify(self, handler, host): pass def v2_playbook_on_no_hosts_matched(self): pass def v2_playbook_on_no_hosts_remaining(self): pass def v2_playbook_on_task_start(self, task, is_conditional): pass def v2_playbook_on_cleanup_task_start(self, task): pass def v2_playbook_on_handler_task_start(self, task): pass def v2_playbook_on_vars_prompt(self, varname, private=True, prompt=None, encrypt=None, confirm=False, salt_size=None, salt=None, ault=None, unsafe=None): pass def v2_playbook_on_import_for_host(self, result, imported_file): pass def v2_playbook_on_not_import_for_host(self, result, missing_file): pass def v2_playbook_on_play_start(self, play): pass def v2_playbook_on_stats(self, stats): pass def v2_on_file_diff(self, result): pass def v2_playbook_on_include(self, included_file): pass def v2_runner_item_on_ok(self, result): pass def v2_runner_item_on_failed(self, result): pass def v2_runner_item_on_skipped(self, result): pass def v2_runner_retry(self, result): pass def v2_runner_on_start(self, host, task): pass个人公众号, 分享一些日常开发,运维工作中的日常以及一些学习感悟,欢迎大家互相学习,交流
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did125846