ansible开发(3)
发布日期:2021-06-29 11:37:46 浏览次数:2 分类:技术文章

本文共 3814 字,大约阅读时间需要 12 分钟。

插件自定义开发

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

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

在这里插入图片描述

转载地址:https://blog.csdn.net/zyxpaomian/article/details/116530815 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Kubernetes开发(1)—环境以及代码目录结构
下一篇:ansible开发(2)

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月19日 02时45分18秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章