插件自定义开发

插件的执行优先级是高于模块的,且和模块的使用有很大的区别

  • 和模块使用不同,插件是在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
个人公众号, 分享一些日常开发,运维工作中的日常以及一些学习感悟,欢迎大家互相学习,交流

在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐