前沿:
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
我这跑的一个测试,简单:
通过结果我们看到,他会从lookup插件,找到相应的插件,然后来处理数据。 这个数据是本地的。
官方的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
|
总结下,这东西 就是用来做playbook的扩展的。 我设立一个变量,但是这个变量是不固定的,需要每次推送playbook的时候,做更新的。 这个时候就可以考虑用lookup plugins插件做支持。