summaryrefslogtreecommitdiffstats
path: root/appc-adapters/appc-ansible-adapter/appc-ansible-example-server/AnsibleModule.py
diff options
context:
space:
mode:
Diffstat (limited to 'appc-adapters/appc-ansible-adapter/appc-ansible-example-server/AnsibleModule.py')
-rw-r--r--appc-adapters/appc-ansible-adapter/appc-ansible-example-server/AnsibleModule.py167
1 files changed, 167 insertions, 0 deletions
diff --git a/appc-adapters/appc-ansible-adapter/appc-ansible-example-server/AnsibleModule.py b/appc-adapters/appc-ansible-adapter/appc-ansible-example-server/AnsibleModule.py
new file mode 100644
index 000000000..eb32abd14
--- /dev/null
+++ b/appc-adapters/appc-ansible-adapter/appc-ansible-example-server/AnsibleModule.py
@@ -0,0 +1,167 @@
+'''
+/*-
+* ============LICENSE_START=======================================================
+* APPC
+* ================================================================================
+* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+* ================================================================================
+* 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.
+* ============LICENSE_END=========================================================
+* ECOMP is a trademark and service mark of AT&T Intellectual Property.
+*/
+'''
+
+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