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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

前沿:

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


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


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


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

1
2
3
4
5
6
7
- 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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- 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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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

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


wKiom1POHHSQzBgDAAEMR3VpXNk358.jpg


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


wKiom1POHGvgpQjrAAn1y9XKb-o616.jpg


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


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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[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] #
#原文http://rfyiamcool.blog.51cto.com/1030776/1441451


wKiom1POJYOBIeCKAAIGkGJe4ik158.jpg


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









 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1441451 ,如需转载请自行联系原作者

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
运维 Kubernetes 网络安全
Ansible自动化运维工具之主机管理与自定义配置文件(2)
Ansible自动化运维工具之主机管理与自定义配置文件(2)
147 0
Ansible之playbook剧本-1
Ansible之playbook剧本
122 0
|
5月前
|
NoSQL 应用服务中间件 Shell
Ansible playbook 与handler
Ansible playbook 与handler
49 6
|
7月前
|
关系型数据库 MySQL 网络安全
ansible 深入介绍之 主机清单与playbook
ansible 深入介绍之 主机清单与playbook
Ansible之playbook剧本-3
Ansible之playbook剧本
71 0
|
Python
Ansible之playbook剧本-2
Ansible之playbook剧本
66 0
|
Shell 网络安全 开发工具
|
运维 关系型数据库 应用服务中间件
【运维知识进阶篇】Ansible自动化运维-PlayBook详解
【运维知识进阶篇】Ansible自动化运维-PlayBook详解
257 0
|
应用服务中间件 Linux 数据安全/隐私保护
ansible:playbook学习笔记
ansible:playbook学习笔记
139 0
Ansible 自定义变量与 role 默认变量的合并方法
如果你遇到 failed to combine variables, expected dicts but got a &#39;NoneType&#39; and a &#39;dict&#39; 这样的报错,你可以看看本文。
328 0