ansible自定义lookup_plugins插件实现playbook扩展

前沿:

ansible的那几个插件都不错,现在咱们聊聊lookup plugins这个插件。 Lookup_plugins主要是用来实现扩展playbook里面各种的字符串和变量的扩展。对于我个人来说,用途不是太大,但是看了下官方提供的lookup_plugins的扩展列表,还是有些想法的。

一开始使用lookup的时,遇到了一个问题,{{ lookup }}里面的数据没有处理,怎么也找不到解决的方法,最后问题在于ubuntu下的版本问题。貌似那个版本对lookup组建支持不好。

感谢沈灿的在旁边扯淡,虽然没啥效果,最后换系统解决了问题~

看这个例子,他的意思是说,通过lookup找到file这个插件扩展,file.py的功能主要是查看/etc/foo.txt文件的各种属性 。

- hosts: all
  vars:
     contents: "{{ lookup(‘file‘, ‘/etc/foo.txt‘) }}"

  tasks:

     - debug: msg="the value of foo.txt is {{ contents }}"

这里在show下更多的lookup_plugins的扩展。

pipe一看这名字,管道,执行linux命令。

redis_kv是 链接到redis 做操作 。

......

原文:http://rfyiamcool.blog.51cto.com/1030776/1441451

- hosts: all

  tasks:

     - debug: msg="{{ lookup(‘env‘,‘HOME‘) }} is an environment variable"

     - debug: msg="{{ item }} is a line from the result of this command"
       with_lines:
         - cat /etc/motd

     - debug: msg="{{ lookup(‘pipe‘,‘date‘) }} is the raw result of running this command"

     - debug: msg="{{ lookup(‘redis_kv‘, ‘redis://localhost:6379,somekey‘) }} is value in Redis for somekey"

     - debug: msg="{{ lookup(‘dnstxt‘, ‘example.com‘) }} is a DNS TXT record for example.com"

     - debug: msg="{{ lookup(‘template‘, ‘./some_template.j2‘) }} is a value from evaluation of this template"

我们来看下pipe.py的插件实现代码:

代码很是干脆,就是subprocess执行,然后return ret。

import subprocess
from ansible import utils, errors

class LookupModule(object):

    def __init__(self, basedir=None, **kwargs):
        self.basedir = basedir

    def run(self, terms, inject=None, **kwargs):

        terms = utils.listify_lookup_plugin_terms(terms, self.basedir, inject) 

        if isinstance(terms, basestring):
            terms = [ terms ] 

        ret = []
        for term in terms:
            term = str(term)

            p = subprocess.Popen(term, cwd=self.basedir, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
            (stdout, stderr) = p.communicate()
            if p.returncode == 0:
                ret.append(stdout.decode("utf-8").rstrip())
            else:
                raise errors.AnsibleError("lookup_plugin.pipe(%s) returned %d" % (term, p.returncode))
        return ret

原文:http://rfyiamcool.blog.51cto.com/1030776/1441451

我这跑的一个测试,简单:

通过结果我们看到,他会从lookup插件,找到相应的插件,然后来处理数据。 这个数据是本地的。

官方的redis_kv感觉有些麻烦,就自己写了个简单的lookup关于redis的插件。

我的执行过程,playbook里面调用,{{ lookup(‘redis_kv‘,‘blog‘) }}   他会从redis里面get blog这个key键。

[[email protected] lookup_plugins]# ansible web -a ‘cat /root/b‘
10.154.252.47 | success | rc=0 >>

[[email protected] lookup_plugins]# ansible-playbook ~/web1.yaml -vvvvv
 [WARNING]: The version of gmp you have installed has a known issue regarding
timing vulnerabilities when used with pycrypto. If possible, you should update
it (ie. yum update gmp).

PLAY [web] ******************************************************************** 

GATHERING FACTS *************************************************************** 
<10.154.252.47> ESTABLISH CONNECTION FOR USER: root on PORT 22 TO 10.154.252.47
<10.154.252.47> REMOTE_MODULE setup
<10.154.252.47> EXEC /bin/sh -c ‘mkdir -p $HOME/.ansible/tmp/ansible-tmp-1406018982.81-198119391249257 && echo $HOME/.ansible/tmp/ansible-tmp-1406018982.81-198119391249257‘
<10.154.252.47> PUT /tmp/tmpXzttC_ TO /root/.ansible/tmp/ansible-tmp-1406018982.81-198119391249257/setup
<10.154.252.47> EXEC /bin/sh -c ‘LC_CTYPE=C LANG=C /usr/bin/python /root/.ansible/tmp/ansible-tmp-1406018982.81-198119391249257/setup; rm -rf /root/.ansible/tmp/ansible-tmp-1406018982.81-198119391249257/ >/dev/null 2>&1‘
ok: [10.154.252.47]
blog

TASK: [lineinfile dest=/root/b regexp=‘nima‘ line="xiaorui.cc" owner=root group=root mode=0644] *** 
<10.154.252.47> ESTABLISH CONNECTION FOR USER: root on PORT 22 TO 10.154.252.47
blog
<10.154.252.47> REMOTE_MODULE lineinfile dest=/root/b regexp=‘nima‘ line="xiaorui.cc" owner=root group=root mode=0644
<10.154.252.47> EXEC /bin/sh -c ‘mkdir -p $HOME/.ansible/tmp/ansible-tmp-1406018984.36-174537627795378 && echo $HOME/.ansible/tmp/ansible-tmp-1406018984.36-174537627795378‘
<10.154.252.47> PUT /tmp/tmpuuRUgy TO /root/.ansible/tmp/ansible-tmp-1406018984.36-174537627795378/lineinfile
<10.154.252.47> EXEC /bin/sh -c ‘LC_CTYPE=C LANG=C /usr/bin/python /root/.ansible/tmp/ansible-tmp-1406018984.36-174537627795378/lineinfile; rm -rf /root/.ansible/tmp/ansible-tmp-1406018984.36-174537627795378/ >/dev/null 2>&1‘
changed: [10.154.252.47] => {"backup": "", "changed": true, "msg": "line added"}

PLAY RECAP ******************************************************************** 
10.154.252.47              : ok=2    changed=1    unreachable=0    failed=0   

[[email protected] lookup_plugins]# ansible web -a ‘cat /root/b‘
10.154.252.47 | success | rc=0 >>
xiaorui.cc

[[email protected] lookup_plugins]#
#原文http://rfyiamcool.blog.51cto.com/1030776/1441451

总结下,这东西 就是用来做playbook的扩展的。 我设立一个变量,但是这个变量是不固定的,需要每次推送playbook的时候,做更新的。  这个时候就可以考虑用lookup plugins插件做支持。

时间: 2025-01-05 17:18:19

ansible自定义lookup_plugins插件实现playbook扩展的相关文章

ansible(七)Conditionals 和 loops,自定义loops插件

ansible的Conditionals 和 loops 和salt-stack比起来真的太强大了.   salt-stack使用判断循环,好像,只能使用模板里面的判断和循环. 而ansible本身自带了适用于各种场景的判断循环插件.. 不但如此,像loops,我们还可以自己编写插件,满足我们的实际需求. 先说说Conditionals吧 Conditionals相对loops来说,简单,就一个关键字when 和咱们其他的程序语言的条件判断一个样,when 后面也是加一个bool值,或者bool

WordPress超好用自定义字段插件:Advanced Custom Fields

WordPress经常需要扩展些字段, 扩展字段一般有两种方法. 1.自己写自定义面板,优点在主题里面比较灵活,但代码写的比较麻烦,对于新手不适合. 2.使用自定义字段插件,这里推荐Advanced Custom Fields 设置和使用相当方便. 下面介绍下安装及使用方法 一.安装插件:插件搜索:Advanced Custom Fields(第一个就是) 二.安装好后点击 菜单->字段 新建字段 填写字段信息 点击发布就可以了.关于字段类型看你自己的需要,需要图片就选图片. 三.填写字段内容

自定义jQuery插件(一)

自定义jQuery插件(一) 虽然现在有大量的插件可供我们选择使用,但实际开发过程中,使用别人的插件难免会带来问题,比如 插件功能强大,代码行数也随着激增,但是我们只使用其中一小部分. 使用别人的插件,很难看懂别人的代码,特别是压缩成min.js,为后期维护,需求变更等带来很严重问题. 同样想在现有插件上做进一步开发也没那么容易. 装逼 所以学习jQuery插件开发很有必要. 自定义插件的类型 自定义插件的类型主要有两种(我猜的) 1. 类级别插件 类级别插件比较简单,通过$.extend()直

看一下自定义的插件怎么样

    publicvoid setUp() throws Exception {protectedfinal Log log = LogFactory.getLog(this.getClass());    public User currOperator;//绝大多数的时候都有登录人信息,特此创建    public BaseUserRole userRole;//登录人角色实例    public String filePathAndName = "D:\\junit.txt";

【分分钟上手weiphp插件开发】Vol.1——第一个自定义weiphp插件:MyHello

我们都知道,学习任何一门编程语言,一般来说第一个范例程序就是输出“Hello World”.从今天开始我们来学习weiphp插件开发,也从一个HelloWorld级别的插件开始讲起,因为安装好了的weiphp框架,默认安装了weiphp官方开发的HelloWorld插件,所以这里为了防止跟官方的插件冲突,我们开发的第一个自定义weiphp插件取名为MyHello,并通过这个简单的插件来讲解weiphp插件开发的整个流程.整个[分分钟上手weiphp插件开发]系列教程都是直接从创建一个新的插件开始

knockoutjs + easyui.treegrid 可编辑的自定义绑定插件【转】

目前仅支持URL的CRUD.不需要的话可以却掉相关代码,把treegrid的data直接赋值给viewModel,然后用ko提交整个data 1.支持双击编辑 2.单击Cell,自动保存编辑. 3.4个功能按钮. 插件源码: ko.bindingHandlers.etreegrid = { editing: false, editIndex: 0, init: function (element, valueAccessor, allBindings, viewModel, bindingCon

自定义jQuery插件

jQuery编写插件的两种方法 1.添加jQuery对象级的插件,是给jQuery类添加方法 写法: (function($){ $.fn.extend({ "函数名":function(自定义参数){ //这里写插件代码 } }); })(jQuery); 或者 (function($){ $.fn.函数名=function(自定义参数){ //这里写插件代码 } })(jQuery); 调用方法:$("#id").函数名(参数); 2.jQuery类级别的插件,

炫酷JQUERY自定义对话框插件JDIALOG_JDIALOG弹出对话框和确认对话框插件

多种类型自定义对话框插件jDialog是一款基于jquery实现的轻量级多种类型的自定义对话框插件 在项目开发中.一般会美化 alert(); 的样式.那么今天我就和大家分享一款非常炫的插件 先来看一下程序最后的效果图片吧 下面是HTMl代码 <center> <button id="test1">alert方式调用</button> <br/><br/> <button id="test2">

自定义ExtJS插件

http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73b6f93834c28c3933fc23904564711b2e73a7650598f832b3b57b2111df7f03471360022b791d58c40dcba852858d2616b2e08c31c528516f881007d8037902bfede13f0cdf525e3ddc5a2a84352ba44737f97868d4d7065dd