Ansible插件扩展,ansible插件


8.1 Ansible插件使用场景

1)除Paramiko、本机SSH、Local、Winrm连接方式外,希望Ansible基于新的通信方式与远程主机交互;

2)除Ansible内置的with_items、with_fileglob循环体外,希望有新的遍历方式;

3)除了Ansible内置的host_vars、group_vars等变量调用方式外,希望有新的变量定义方式;

4)除了Ansible的内置的Jinja2模板渲染、to_yaml、to_json等过滤器外,希望有新的过滤器;

5)定义新的回调机制,即捕获响应事件后自定义新的响应形式。

  • 丰富强化标准的Stdout输出结果;
  • 增加日志记录的行为方式,如插入MySQL、Redis、MongoDB数据库;
  • 增加事件响应方式,如Playbook执行结果为Success时发送邮件给各部门组织新一轮的测试工作,免去人工干预过程;Playbook执行结果为Failed时发送短信到自己手机上,尽快人为干预排查错误等。

如上场景需自行编写Ansible插件方可实现,类似场景可采用自行编写插件的方式满足。

8.2 Ansible插件类型

Ansible Plugins网址:https://github.com/ansible/ansible/tree/stable-2.4/lib/ansible/plugins

    (1)Connection类型插件

    这类插件代表通信连接,用来和远程主机通信。默认提供Paramiko、Native SSH、Local、Winrm等连接方式。默认通过ansible_connections变量指定连接类型,ansible all -m ping -connections=ssh,或直接在Inventory文件中配置ansible_connection=winrm,默认是系统自动判断连接类型,默认值是smart。将新的Connection插件放在ansible.cfg指定的同级目录下即可生效。

    (2)Lookup类型插件

    这类插件代表循环体功能类型,实现诸如with_items、with_fileglob等遍历功能的内置插件,Ansible-palybook中的with_items、with_fileglob语法均是通过调用Lookup插件实现的。新的Lookup插件放在ansible.cfg指定的同级目录下即可生效。

    (3)Vars类型插件

    变量类型插件,这些变量并非来自Inventory、Playbook、命令终端,而是通过host_vars、group_vars产生的,需要留意的是这些变量也可以通过Inventory产生,言外之意是Vars类型的插件绝大多数时候用不到。

    (4)Filter类型插件

    Filter类型插件其实是Jinja2模板引擎的Filter,Jinja2的常用的Filter实现有to_yaml、to_json,官网实现的Filter Plugins代码全合并在core.py脚本中,新Filter插件需在该脚本的基础上编写。

    (5)Callback类型插件

    Callback类型插件允许程序捕获响应的事件,并进行一些自定义响应,如前面提到的插入日志到数据库、发送邮件等功能。

8.3 如何编写自己的插件

    默认情况下插件案例放在当前系统环境Python安装路径下的site-packages/ansible/plugins/目录下,如/usr/lib/python2.6/site-packages/ansible/plugins/。

    其次编辑ansible.cfg定义插件存放目录,默认配置如下。

    ansible.cfg中在默认定义的插件目录下编写自己的插件。

action_plugins = /usr/share/ansible_plugins/action_plugins
callback_plugins = /usr/share/ansible_plugins/callback_plugins
connection_plugins = /usr/share/ansible_plugins/connection_plugins
lookup_plugins = /usr/share/ansible_plugins/lookup_plugins
vars_plugins = /usr/share/ansible_plugins/vars_plugins
filter_plugins = /usr/share/ansible_plugins/filter_plugins
strategy_plugins = /usr/share/ansible_plugins/strategy_plugins
    最后,从Github下载对应类型的模板到对应的目录修改即可,在模板的基础上修改即可。

8.4 插件案例实战

    插件的好处在于编写YML文件时可以减少我们的工作量,而且结果易于展示,只要学习一些比较重要的比如Filter、Callbacks等即可。

    在普通情况下,我们主要是以{{somevars|filter}对somevars使用filter方法过滤,Ansible已经为我们提供了很多的过滤方法,比如找到列表中最大、最小数的max、min,把数据转换成JSON格式的fromjson等,但这还远远不够,我们还需要自定义一些过滤的方法来满足一些特殊的需求,比如查找列表中大于某个常数的所有数字等。以这个例子,展示如何编写。

    首先,到ansible.cfg中去掉#,打开filter_plugins的存放目录,filter_plugins=/usr/share/ansible/plugins/filter。

    编写deal_list_num.py文件,他主要提供过滤列表中的正数、负数和查询列表大于某一个给定数值这3个方法。/usr/share/ansible/filter/deal_list_num.py。

# !/usr/bin/env python
# encoding=utf-8
class FilterModule(object):
    def filters(self):    # 把使用的方法写在这个return中
        filter_map = {
            'positive': self.positive,
            'negative': self.negative,
            'no_less_than': self.no_less_than
        }
        return filter_map
    def positive(self, data):
        r_data = []
        for item in data:
            if item >= 0:
                r_data.append(item)
        return r_data
    def negative(self, data):
        r_data = []
        for item in data:
            if item <= 0:
                r_data.append(item)
        return r_data
    def no_less_than(self, data, num):    # 第1个变量为传入的数值,第2个为条件1
        r_data = []
        for item in data:
            if item >= num:
                r_data.append(item)
        return r_data
deal_list_num.yml文件的内容如下:

- hosts: localhost
  gather_facts: False

  tasks:
  - name: set fact
    set_fact:
      num_list: [-1,-2,5,3,1]

  - name: echo positive
    shell: echo {{num_list | positive}}
    register: print_positive
  - debug: msg="{{print_positive.stdout_lines[0]}}"

  - name: echo negative
    shell: echo {{num_list | negative}}
    register: print_negative
  - debug: msg="{{print_negative.stdout_lines[0]}}"

  - name: echo negative
    shell: echo {{num_list | no_less_than(4)}}
    register: print_negative
  - debug: msg="{{print_negative.stdout_lines[0]}}"

























相关内容

    暂无相关文章