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 做操作 。

 代码如下 复制代码
- 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

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

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

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

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

 代码如下 复制代码
[root@vm-10-154-252-46 lookup_plugins]# ansible web -a 'cat /root/b'
10.154.252.47 | success | rc=0 >>
 
 
[root@vm-10-154-252-46 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  
 
[root@vm-10-154-252-46 lookup_plugins]# ansible web -a 'cat /root/b'
10.154.252.47 | success | rc=0 >>
xiaorui.cc
 
[root@vm-10-154-252-46 lookup_plugins]#

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

时间: 2024-10-31 20:37:19

ansible运维工具用lookup_plugins插件如何实现playbook扩展的相关文章

ansible运维工具filter_plugins插件如何实现jinja2自定义filter过滤器

前言:    filter_plugins是什么? 这个单词拆解下,filter !  熟悉jinja2模板的人,到知道他是过滤器,可以在模板中以管道的方式用pyhton的代码处理字符串. ansible模板调用的是jinja2,这个大家都知道 . 这个filter_plugins插件代码,就是为了更好的处理jinja2模板中的字符串和逻辑判断的. 先前,我和沈灿讨论一个模板的问题,实在蛋疼的要命,总是达不到我们要的数据,当时是做一个数据的统计和rabbitmq的配置,有些地方用jinja2模板

Linux自动化运维工具之ansible(一)

运维自动化是运维发展的必然方向,同时也是一个运维工程师实现效率最大化的必然选择. 运维自动化的知识可以说是浩瀚如海,本文将选择其中一个工具ansible为大家介绍一下. 一.哪些工作需要批量部署 1.操作系统的安装 常见的有collber,red hat satelite(redhat)系统专用. 2.操作系统的配置 常见的有cfengine,puppet,chef,func.其中puppet最受欢迎 3.批量程序的部署 4.批量命令的运行查看状态信息 二.ansible介绍 ansible的架

自动化运维工具ansible的使用详细教程_服务器其它

一.ansible简介 1.ansible ansible是新出现的自动化运维工具,基于Python研发.糅合了众多老牌运维工具的优点实现了批量操作系统配置.批量程序的部署.批量运行命令等功能.仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被管控的主机无客户端.ansible应用程序存在于epel(第三方社区)源,依赖于很多python组件.主要包括: (1).连接插件connection plugins:负责和被监控端实现通信: (2).host inventory:指定操

运维工具大宝典之开源平台篇

本文讲的是 :  运维工具大宝典之开源平台篇  , [IT168技术]在运维工具大宝典系列第一篇文章<运维工具大宝典之运维需求篇>中,云智慧对上云企业的运维需求进行的汇总,其中第6条"对开源的强烈需求"主要是来自运维人员,特别是技术大牛,他们喜欢一切尽在掌握的感脚,而这就需要开源运维工具. 目前流行的开源运维工具如Zabbix.Nagios等大部分来自国外,虽然这些开源产品功能非常强大,但对技术要求很高,而且缺少足够的中文文档和本土服务支持,一般运维人员要想用好难度很大.

基于YARN与Docker实现分布式Web服务的自动化部署运维工具

问题描述 部署运维工具主要有以下需求:-面向服务实例LTS类业务组件,不考虑数据库.缓存等基础组件-实现对这些分布式服务进行自动化部署.启停与伸缩-要能够支持自动部署与固定部署混合-自动部署,不指定主机,不指定端口-服务实例分配允许指定主机范围-固定部署,指定主机与端口,匹配传统需求-服务实例服务注册与查询-服务日志存储日志收集需求-数据存储共享存储需求挂共享存储-其他需求,配置界面与监控界面各位大神有没有实现思路与案例? 解决方案

Linux集群和自动化维3.6 轻量级自动化运维工具Fabric介绍

3.6 轻量级自动化运维工具Fabric介绍 笔者公司目前的数据中心采用的是分布式部署方案,在全球多地都有数据中心.数据中心采用的是AWS EC2机器,在核心的数据中心里,EC2机器的数量比较多,基本上每个数据中心都在运行着几百台AWS EC2机器,而且业务繁忙的时候,会通过AWS AMI(Amazon系统映像)直接上线几十台相同业务的EC2机器,它们的机器类型.系统应用和配置文件基本上都是一模一样的,很多时候需要修改相同的配置文件和执行相同的操作,这个时候为了避免重复性的劳动就需要用到自动化运

《Puppet权威指南》——1.3 自动化运维工具对比

1.3 自动化运维工具对比 在1.2节中我们介绍了现在比较常见的自动化配置工具Cfengine.Chef和Puppet,下面再来看一下这3款自动化运维工具的区别,如表1-1所示. 讲到这里,我们已经基本了解了Cfengine.Chef和Puppet这3款自动化运维工具.通过表1-1可知,Puppet的优势还是比较明显的.若是我们去Puppet的官方网站上看一看,会发现很多使用Puppet作为公司自动化运维工具的例子,目前超过18000家公司在使用Puppet软件,其中包括Twitter.Zyng

MySQL自动化运维工具 Inception

Inception 详细介绍 Inception -- 集审核.执行.备份及生成回滚语句于一身的MySQL自动化运维工具 MySQL语句的审核,在业界都已经基本被认同了,实际上也是对MySQL语句写法的统一化,标准化,而之前的人工审核,针对标准这个问题其实是很 吃力的,标准越多,DBA越累,开发也越累. 那么在这个都追求自动化运维的时代,审核也必须要跟上步伐,因此Inception诞生了.而Inception可以做的工作远不止是一个自动化审核工 具,同时还具备执行,生成对影响数据的回滚语句(类似

《Puppet权威指南》——第1章 运维工程师的利器——自动化运维工具

第1章 运维工程师的利器--自动化运维工具 随着网络云时代和大数据时代的到来,运维工程师负责管理的服务器数量也成倍地增长.如何管理好这些服务器为云时代和大数据时代保驾护航,是摆在运维工程师面前的一道难题.而解决这道难题就需要运维工程师对自动化运维工具的掌握达到一定的程度.笔者希望通过本章抛砖引玉,结合自己的经验介绍多年来使用自动化运维工具的心得和体会.本章首先介绍互联网运维工程师的职责.优秀运维工程师和普通运维工程师的区别:然后简要介绍常见的自动化运维工具:最后比较当前常见的自动化运维工具的优势