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

SEO研究中心 SEO研究中心提供免费SEO公开课

下面来看一个编写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. eth0Linkencap:EthernetHWaddr1B:2B:3B:4B:5B:6B
  3. inetaddr:172.16.1.2Bcast:172.16.1.255Mask:255.255.252.0
  4. ...
  5. eth1Linkencap:EthernetHWaddr1A:2A:3A:4A:5A:6A
  6. inetaddr:100.100.100.100Bcast:100.100.100.255Mask:255.255.255.240
  7. ...
  8. loLinkencap:LocalLoopback
  9. inetaddr:127.0.0.1Mask:255.0.0.0
  10. ...
  11. [root@idc-server1ansible]#vimmyfacts.yml
  12. ---
  13. -hosts:idc-server2
  14. roles:
  15. -myfacts
  16. [root@idc-server1ansible]#mkdir-proles/myfacts/{tasks,templates}
  17. [root@idc-server1ansible]#vimroles/myfacts/tasks/main.yml
  18. ---
  19. -name:runmyfactsmoduletogetcustomizedfacts
  20. myfacts:get_facts=yes
  21. -name:updatefilewiththecustomizedfacts
  22. template:src=myfacts.txt.j2dest=/tmp/myfacts.txt
  23. [root@idc-server1ansible]#vimroles/myfacts/templates/myfacts.txt.j2
  24. ansible_private_ipv4_address:{{ansible_private_ipv4_address}}
  25. [root@idc-server1ansible]#mkdir/usr/share/ansible/heylinux
  26. [root@idc-server1ansible]#vim/usr/share/ansible/heylinux/myfacts
  27. #!/usr/bin/python
  28. importsys
  29. importjson
  30. importshlex
  31. importcommands
  32. importre
  33. defget_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"Linkencap"|awk'{print$1}'|grep-wv'lo'""")
  36. nics=output.split('n')
  37. t_nic_info=""
  38. foriinnics:
  39. ipaddr=commands.getoutput("""/sbin/ifconfig%s|grep-w"inetaddr"|cut-d:-f2|awk'{print$1}'"""%(i))
  40. ifre.match(iprex,ipaddr):
  41. ansible_private_ipv4_address=ipaddr
  42. returnansible_private_ipv4_address
  43. args_file=sys.argv[1]
  44. args_data=file(args_file).read()
  45. arguments=shlex.split(args_data)
  46. forarginarguments:
  47. if"="inarg:
  48. (key,value)=arg.split("=")
  49. ifkey=="get_facts"andvalue=="yes":
  50. ansible_private_ipv4_address=get_ansible_private_ipv4_address()
  51. printjson.dumps({
  52. "changed":False,
  53. "ansible_facts":{
  54. "ansible_private_ipv4_address":ansible_private_ipv4_address
  55. }
  56. })
  57. sys.exit(0)
  58. printjson.dumps({
  59. "changed":False
  60. })
  61. [root@idc-server1ansible]#ansible-playbook-urootmyfacts.yml-ihosts
  62. PLAY[idc1-server2]***************************************************************
  63. GATHERINGFACTS***************************************************************
  64. ok:[idc1-server2]
  65. TASK:[myfacts|runmyfactsmoduletogetcustomizedfacts]**************
  66. ok:[idc1-server2]
  67. TASK:[myfacts|updatefilewiththecustomizedfacts]*********************
  68. changed:[idc1-server2]
  69. PLAYRECAP********************************************************************
  70. idc1-server2:ok=3changed=1unreachable=0failed=0--phpfensi.com
  71. [root@idc-server1ansible]#sshidc1-server2'cat/tmp/myfacts.txt'
  72. ansible_private_ipv4_address:172.16.1.2

相关广告
  • 编写Ansible模块并自定义Facts例子 编写Ansible模块并自定义Facts例子 编写Ansible模块并自定义Facts例子
相关阅读

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

2019/10/10 17:47:01 | 谷歌SEO算法 | 谷歌CEO