blob: eb32abd145866a5c6af3842fc528b898cb44a595 [file] [log] [blame]
'''
/*-
* ============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