ansible-自定义模块开发

Ansible就没有 ansible_private_ipv4_address 这样一个Facts,用来保存私网IP地址。 而我们恰恰就需要这样的一个Facts,因为我们有很多服务器的默认网卡并非是eth0,有的是bond0,eth1,em0,em1等,而公网IP地址与私网IP地址也并没有固定的绑定在某个网卡上,很多时候还是虚拟网卡。 还好,我们可以通过编写Ansible模块并自定义Facts来实现。

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
40
41
#!/usr/bin/python

import json
import commands
import re


def get_ansible_private_ipv4_address():
iprex = "(^192\.168)|(^10\.)|(^172\.1[6-9])|(^172\.2[0-9])|(^172\.3[0-1])"
output = commands.getoutput("""/sbin/ifconfig |grep "Link encap" |awk '{print $1}' |grep -wv 'lo'""")
nics = output.split('\n')
for i in nics:
ipaddr = commands.getoutput("""/sbin/ifconfig %s |grep -w "inet addr" |cut -d: -f2 | awk '{print $1}'""" % (i))
if re.match(iprex,ipaddr):
ansible_private_ipv4_address = ipaddr
return ansible_private_ipv4_address

def main():
global module
module = AnsibleModule(
argument_spec = dict(
get_facts=dict(default="yes", required=False),
),
supports_check_mode = True,
)

ansible_facts_dict = {
"changed" : False,
"ansible_facts": {
}
}

if module.params['get_facts'] == 'yes':
ansible_private_ipv4_address = get_ansible_private_ipv4_address()
ansible_facts_dict['ansible_facts']['ansible_private_ipv4_address'] = ansible_private_ipv4_address

print json.dumps(ansible_facts_dict)

from ansible.module_utils.basic import *
from ansible.module_utils.facts import *
main()