Skip to content

Instantly share code, notes, and snippets.

@whitekid
Last active September 28, 2016 02:49
Show Gist options
  • Save whitekid/97c98133697f15a89961f4afd4bd3a81 to your computer and use it in GitHub Desktop.
Save whitekid/97c98133697f15a89961f4afd4bd3a81 to your computer and use it in GitHub Desktop.
#!/usr/bin/python
"""network interface address를 관리하는 ansible 모듈
library 디렉토리에 넣어서 사용하면 됩니다.
"""
import re
from ansible.module_utils.basic import AnsibleModule
DOCUMENTATION = '''
---
module: ipaddr
requirements: []
description:
- Manage interfaces
options:
name:
required: true
description:
- name of interface
addr:
required: true
description:
- cidir of interface address
'''
EXAMPLES = '''
# set interface address
- ipaddr: name=docker0 addr=192.168.0.1/24
- ipaddr: name=docker0 addr=192.168.0.10/32
'''
class IPAddress:
def __init__(self, module):
self.module = module
self.name = module.params['name']
self.addr = module.params['addr']
self.changed = False
def ip(self, *cmd):
rc, stdout, stderr = self.module.run_command(['ip'] + list(cmd))
if rc != 0:
raise Exception(stderr)
return rc, stdout, stderr
def get_addrs(self):
rc, stdout, stderr = self.ip('addr', 'show', self.name)
return re.findall(r"inet\s+(\d+\.\d+\.\d+\.\d+/\d+)\s+", stdout)
def del_addr(self, addr):
self.ip('address', 'del', addr, 'dev', self.name)
def add_addr(self, addr):
self.ip('address', 'add', addr, 'dev', self.name)
def check(self):
addrs = self.get_addrs()
self.changed = not (len(addrs) == 1 and addrs[0] == self.addr)
def run(self):
addrs = self.get_addrs()
exists = False
for addr in addrs:
if addr == self.addr:
exists = True
continue
self.del_addr(addr)
self.changed = True
if not exists:
self.add_addr(self.addr)
self.changed = True
def main():
module = AnsibleModule(
argument_spec={
'name': {'required': True, type: 'str'},
'addr': {'required': True, type: 'str'},
},
supports_check_mode=True,
)
try:
ipaddr = IPAddress(module)
if module.check_mode:
ipaddr.check()
else:
ipaddr.run()
module.exit_json(changed=ipaddr.changed)
except Exception, e:
module.fail_json(msg=str(e))
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment