Last active
September 28, 2016 02:49
-
-
Save whitekid/97c98133697f15a89961f4afd4bd3a81 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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