当前位置:首页 > linux教程 > 列表

编写Ansible模块并自定义Facts例子

发布:smiling 来源: PHP粉丝网  添加日期:2014-10-14 10:54:31 浏览: 评论:0 

下面来看一个编写Ansible模块并自定义Facts例子,希望例子能帮助到各位.

背景介绍:Ansible自带的Facts有很多,但很多时候并不够用,比如,Ansible就没有ansible_private_ipv4_address这样一个Facts,用来保存私网IP地址.

而我们恰恰就需要这样的一个Facts,因为我们有很多服务器的默认网卡并非是eth0,有的是bond0,eth1,em0,em1等,而公网IP地址与私网IP地址也并没有固定的绑定在某个网卡上,很多时候还是虚拟网卡.

还好,我们可以通过编写Ansible模块并自定义Facts来实现,具体步骤,代码如下:

  1. [root@idc-server2 ~]# ifconfig 
  2. eth0      Link encap:Ethernet  HWaddr 1B:2B:3B:4B:5B:6B 
  3.           inet addr:172.16.1.2  Bcast:172.16.1.255  Mask:255.255.252.0 
  4. ... 
  5. eth1      Link encap:Ethernet  HWaddr 1A:2A:3A:4A:5A:6A 
  6.           inet addr:100.100.100.100  Bcast:100.100.100.255  Mask:255.255.255.240 
  7. ... 
  8. lo        Link encap:Local Loopback  
  9.           inet addr:127.0.0.1  Mask:255.0.0.0 
  10. ... 
  11. [root@idc-server1 ansible]# vim myfacts.yml 
  12. --- 
  13. - hosts: idc-server2 
  14.   roles: 
  15.   - myfacts 
  16. [root@idc-server1 ansible]# mkdir -p roles/myfacts/{tasks,templates} 
  17. [root@idc-server1 ansible]# vim roles/myfacts/tasks/main.yml 
  18. --- 
  19. name: run myfacts module to get customized facts 
  20.   myfacts: get_facts=yes 
  21. nameupdate file with the customized facts 
  22.   template: src=myfacts.txt.j2 dest=/tmp/myfacts.txt 
  23. [root@idc-server1 ansible]# vim roles/myfacts/templates/myfacts.txt.j2 
  24. ansible_private_ipv4_address : {{ ansible_private_ipv4_address }} 
  25. [root@idc-server1 ansible]# mkdir /usr/share/ansible/heylinux 
  26. [root@idc-server1 ansible]# vim /usr/share/ansible/heylinux/myfacts 
  27. #!/usr/bin/python 
  28. import sys 
  29. import json 
  30. import shlex 
  31. import commands 
  32. import re 
  33. def get_ansible_private_ipv4_address(): 
  34.     iprex = "(^192.168)|(^10.)|(^172.1[6-9])|(^172.2[0-9])|(^172.3[0-1])" 
  35.     output = commands.getoutput("""/sbin/ifconfig |grep "Link encap" |awk '{print $1}' |grep -wv 'lo'"""
  36.     nics = output.split('n'
  37.     t_nic_info = "" 
  38.     for i in nics: 
  39.         ipaddr = commands.getoutput("""/sbin/ifconfig %s |grep -w "inet addr" |cut -d: -f2 | awk '{print $1}'""" % (i)) 
  40.         if re.match(iprex,ipaddr): 
  41.             ansible_private_ipv4_address = ipaddr 
  42.     return ansible_private_ipv4_address 
  43.  
  44. args_file = sys.argv[1] 
  45. args_data = file(args_file).read() 
  46. arguments = shlex.split(args_data) 
  47. for arg in arguments: 
  48.     if "=" in arg: 
  49.         (key, value) = arg.split("="
  50.         if key == "get_facts" and value == "yes"
  51.             ansible_private_ipv4_address = get_ansible_private_ipv4_address() 
  52.             
  53.             print json.dumps({ 
  54.                "changed" : False
  55.                "ansible_facts" : { 
  56.                   "ansible_private_ipv4_address" : ansible_private_ipv4_address 
  57.                } 
  58.             }) 
  59.             sys.exit(0) 
  60. print json.dumps({ 
  61.     "changed" : False 
  62. }) 
  63. [root@idc-server1 ansible]# ansible-playbook -u root myfacts.yml -i hosts 
  64. PLAY [idc1-server2] *************************************************************** 
  65. GATHERING FACTS *************************************************************** 
  66. ok: [idc1-server2] 
  67. TASK: [myfacts | run myfacts module to get customized facts] ************** 
  68. ok: [idc1-server2] 
  69. TASK: [myfacts | update file with the customized facts] ********************* 
  70. changed: [idc1-server2] 
  71. PLAY RECAP ******************************************************************** 
  72. idc1-server2 : ok=3    changed=1    unreachable=0    failed=0   --phpfensi.com 
  73. [root@idc-server1 ansible]# ssh idc1-server2 'cat /tmp/myfacts.txt' 
  74. ansible_private_ipv4_address : 172.16.1.2

Tags: Ansible模块 自定义Facts

分享到: