From 12622054e9b501d4e7df9302cbfcd0b5968e3b59 Mon Sep 17 00:00:00 2001 From: "Timoney, Dan (dt5972)" Date: Wed, 12 Sep 2018 10:53:10 -0400 Subject: Add ansible-server to ccsdk Add ansible-server to CCSDK (copied from sdnc) Change-Id: I1a351ada1b31cb6623ec2ef850a9d85f856ba41c Issue-ID: CCSDK-554 Signed-off-by: Timoney, Dan (dt5972) --- ansible-server/src/main/scripts/AnsibleModule.py | 170 +++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100755 ansible-server/src/main/scripts/AnsibleModule.py (limited to 'ansible-server/src/main/scripts/AnsibleModule.py') diff --git a/ansible-server/src/main/scripts/AnsibleModule.py b/ansible-server/src/main/scripts/AnsibleModule.py new file mode 100755 index 00000000..3458c28b --- /dev/null +++ b/ansible-server/src/main/scripts/AnsibleModule.py @@ -0,0 +1,170 @@ +''' +/*- +* ============LICENSE_START======================================================= +* ONAP : APPC +* ================================================================================ +* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. +* ================================================================================ +* Copyright (C) 2017 Amdocs +* ============================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* ECOMP is a trademark and service mark of AT&T Intellectual Property. +* ============LICENSE_END========================================================= +*/ +''' + +import os, subprocess +import sys +from collections import namedtuple +import json + +import uuid + +def ansibleSysCall (inventory_path, playbook_path, nodelist, mandatory, + envparameters, localparameters, lcm, timeout): + + print "***> in AnsibleModule.ansibleSysCall" + print " EnvParameters: ", envparameters + print " LocalParameters:", localparameters + print " Inventory: ", inventory_path + print " Playbook: ", playbook_path + print " NodeList: ", nodelist + print " Mandatory: ", mandatory + print " Timeout: ", timeout + log = [] + + str_parameters = '' + + if not envparameters == {}: + for key in envparameters: + if str_parameters == '': + str_parameters = '"' + str(key) + '=\'' + str(envparameters[key]) + '\'' + else: + str_parameters += ' ' + str(key) + '=\'' + str(envparameters[key]) + '\'' + str_parameters += '"' + + if len(str_parameters) > 0: + cmd = 'timeout --signal=KILL ' + str(timeout) + \ + ' ansible-playbook -v --extra-vars ' + str_parameters + ' -i ' + \ + inventory_path + ' ' + playbook_path + else: + cmd = 'timeout --signal=KILL ' + str(timeout) + \ + ' ansible-playbook -v -i ' + inventory_path + ' ' + playbook_path + + print " CMD: ", cmd + + print "\n =================ANSIBLE STDOUT BEGIN============================================\n" + p = subprocess.Popen(cmd, shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + # p.wait() + (stdout_value, err) = p.communicate() + + stdout_value_cleanup = '' + for line in stdout_value: + stdout_value_cleanup += line.replace(' ', ' ') + stdout_value = stdout_value_cleanup.splitlines() + + ParseFlag = False + retval = {} + returncode = p.returncode + + if returncode == 137: + + print " ansible-playbook system call timed out" + # ansible-playbook system call timed out + for line in stdout_value: # p.stdout.readlines(): + log.append (line) + + + elif 'ping' in lcm: + + targetnode = envparameters['TargetNode'].split(' ') + str_json = None + for line in stdout_value: # p.stdout.readlines(): + print line # line, + if "PLAY RECAP" in line: + ParseFlag = False + if ParseFlag and len(line.strip())>0: + str_json += line.strip() + if "TASK [debug]" in line: + ParseFlag = True + str_json = '' + log.append (line) + + if str_json: + if '=>' in str_json: + out_json =eval(str_json.split('=>')[1].replace('true','True').replace('false','False')) + + if 'ping.stdout_lines' in out_json: + for node in targetnode: + ip_address = node + ok_flag = '0' + changed_flag = '0' + unreachable_flag = '0' + failed_flag = '1' + for rec in out_json['ping.stdout_lines']: + if node in rec and "is alive" in rec: + ok_flag = '1' + changed_flag = '1' + unreachable_flag = '0' + failed_flag = '0' + for rec in out_json['ping.stdout_lines']: + if node in rec and "address not found" in rec: + ok_flag = '0' + changed_flag = '0' + unreachable_flag = '1' + failed_flag = '0' + retval[ip_address]=[ok_flag, changed_flag, unreachable_flag, + failed_flag] + else: + + for line in stdout_value: # p.stdout.readlines(): + print line # line, + if ParseFlag and len(line.strip())>0: + ip_address = line.split(':')[0].strip() + ok_flag = line.split(':')[1].strip().split('=')[1].split('changed')[0].strip() + changed_flag = line.split(':')[1].strip().split('=')[2].split('unreachable')[0].strip() + unreachable_flag = line.split(':')[1].strip().split('=')[3].split('failed')[0].strip() + failed_flag = line.split(':')[1].strip().split('=')[4].strip() + retval[ip_address]=[ok_flag, changed_flag, unreachable_flag, failed_flag] + if "PLAY RECAP" in line: + ParseFlag = True + log.append (line) + + # retval['p'] = p.wait() + + print " =================ANSIBLE STDOUT END==============================================\n" + + return retval, log, returncode + +if __name__ == '__main__': + + from multiprocessing import Process, Value, Array, Manager + import time + + nodelist = 'host' + + playbook_file = 'ansible_sleep@0.00.yml' + + + d = Manager().dict() + + p = Process(nodelist=ansible_call, args=('ansible_module_config', playbook_file, nodelist,d, )) + p.start() + + print "Process running" + print d + p.join() + print d -- cgit 1.2.3-korg