Fix ansible-server for parsing ouput of executing Ansible playbooks 13/99813/2
authorEnbo Wang <wangenbo@huawei.com>
Thu, 19 Dec 2019 11:15:42 +0000 (19:15 +0800)
committerEnbo Wang <wangenbo@huawei.com>
Thu, 19 Dec 2019 12:14:17 +0000 (20:14 +0800)
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 <wangenbo@huawei.com>
ansible-server/src/main/ansible-server/AnsibleModule.py

index 80e59e2..63cd805 100755 (executable)
@@ -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