From 2ad824206845d714efaab6de71ad9294db5509cc Mon Sep 17 00:00:00 2001 From: Enbo Wang Date: Thu, 19 Dec 2019 19:15:42 +0800 Subject: Fix ansible-server for parsing ouput of executing Ansible playbooks Fix the issues of parsing the return value of p.communicate() and output lines of executing Ansible playbooks. Change-Id: I7ab10d9d7438ca998d17a7dace2fcde27a4219e7 Issue-ID: CCSDK-2009 Signed-off-by: Enbo Wang --- .../src/main/ansible-server/AnsibleModule.py | 28 +++++++++++++++------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'ansible-server/src') diff --git a/ansible-server/src/main/ansible-server/AnsibleModule.py b/ansible-server/src/main/ansible-server/AnsibleModule.py index 80e59e29..63cd805a 100755 --- a/ansible-server/src/main/ansible-server/AnsibleModule.py +++ b/ansible-server/src/main/ansible-server/AnsibleModule.py @@ -59,15 +59,16 @@ def ansibleSysCall (inventory_path, playbook_path, nodelist, mandatory, envparam cherrypy.log("CMD: " + cmd) cherrypy.log("PlayBook Start: " + playbookdir ) - p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) #PAP #p.wait() stdout_value, err = p.communicate() + stdout_value = stdout_value.splitlines() - stdout_value_cleanup = '' + stdout_value_cleanup = [] for line in stdout_value: - stdout_value_cleanup += line.replace(' ', ' ') - stdout_value = stdout_value_cleanup.splitlines() + stdout_value_cleanup.append(line.replace(' ', ' ')) + stdout_value = stdout_value_cleanup ParseFlag = False retval = {} @@ -80,13 +81,22 @@ def ansibleSysCall (inventory_path, playbook_path, nodelist, mandatory, envparam log.append (line) else: for line in stdout_value: # p.stdout.readlines(): - print(line) # line, + if line: + cherrypy.log("OUTPUT: %s" % 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() + exec_results = line.split(':')[1].strip() + + result_items = [item for item in exec_results.split(' ') if item] + cherrypy.log("Execcution results of '%s': %s" % (ip_address, str(result_items))) + # ['ok=6', 'changed=5', 'unreachable=0', 'failed=0', 'skipped=3', 'rescued=0', 'ignored=0'] + + ok_flag = result_items[0].split('=')[1].strip() + changed_flag = result_items[1].split('=')[1].strip() + unreachable_flag = result_items[2].split('=')[1].strip() + failed_flag = result_items[3].split('=')[1].strip() + retval[ip_address]=[ok_flag, changed_flag, unreachable_flag, failed_flag] if "PLAY RECAP" in line: ParseFlag = True -- cgit 1.2.3-korg