From 95dc4ec5ec3bca59f7ef1d61a9540d4efd38435c Mon Sep 17 00:00:00 2001
From: Kevin Brebanov <kevin.brebanov@gmail.com>
Date: Sun, 19 Jul 2015 14:33:35 -0400
Subject: [PATCH] Allow multiple packages to be installed at the same time

---
 .../modules/extras/packaging/os/apk.py        | 40 ++++++++++++-------
 1 file changed, 26 insertions(+), 14 deletions(-)

diff --git a/lib/ansible/modules/extras/packaging/os/apk.py b/lib/ansible/modules/extras/packaging/os/apk.py
index 858d4ad7450..55d79f3686d 100644
--- a/lib/ansible/modules/extras/packaging/os/apk.py
+++ b/lib/ansible/modules/extras/packaging/os/apk.py
@@ -57,6 +57,9 @@ EXAMPLES = '''
 # Update repositories and install "foo" package
 - apk: name=foo update_cache=yes
 
+# Update repositories and install "foo" and "bar" packages
+- apk: name=foo,bar update_cache=yes
+
 # Remove "foo" package
 - apk: name=foo state=absent
 
@@ -66,9 +69,15 @@ EXAMPLES = '''
 # Install the package "foo"
 - apk: name=foo state=present
 
+# Install the packages "foo" and "bar"
+- apk: name=foo,bar state=present
+
 # Update repositories and update package "foo" to latest version
 - apk: name=foo state=latest update_cache=yes
 
+# Update repositories and update packages "foo" and "bar" to latest versions
+- apk: name=foo,bar state=latest update_cache=yes
+
 # Update all installed packages to the latest versions
 - apk: upgrade=yes
 
@@ -118,28 +127,31 @@ def upgrade_packages(module):
         module.exit_json(changed=False, msg="packages already upgraded")
     module.exit_json(changed=True, msg="upgraded packages")
 
-def install_package(module, name, state):
+def install_packages(module, names, state):
     upgrade = False
-    installed = query_package(module, name)
-    latest = query_latest(module, name)
-    if state == 'latest' and not latest:
-        upgrade = True
-    if installed and not upgrade:
-        module.exit_json(changed=False, msg="package already installed")
+    uninstalled = []
+    for name in names:
+        if not query_package(module, name):
+            uninstalled.append(name)
+        elif state == 'latest' and not query_latest(module, name):
+            upgrade = True
+    if not uninstalled and not upgrade:
+        module.exit_json(changed=False, msg="package(s) already installed")
+    names = " ".join(uninstalled)
     if upgrade:
         if module.check_mode:
-            cmd = "apk add --upgrade --simulate %s" % (name)
+            cmd = "apk add --upgrade --simulate %s" % (names)
         else:
-            cmd = "apk add --upgrade %s" % (name)
+            cmd = "apk add --upgrade %s" % (names)
     else:
         if module.check_mode:
-            cmd = "apk add --simulate %s" % (name)
+            cmd = "apk add --simulate %s" % (names)
         else:
-            cmd = "apk add %s" % (name)
+            cmd = "apk add %s" % (names)
     rc, stdout, stderr = module.run_command(cmd, check_rc=False)
     if rc != 0:
-        module.fail_json(msg="failed to install %s" % (name))
-    module.exit_json(changed=True, msg="installed %s package" % (name))
+        module.fail_json(msg="failed to install %s" % (names))
+    module.exit_json(changed=True, msg="installed %s package(s)" % (names))
 
 def remove_packages(module, names):
     installed = []
@@ -197,7 +209,7 @@ def main():
     names = filter((lambda x: x != ''), p['name'].split(','))
 
     if p['state'] in ['present', 'latest']:
-        install_package(module, p['name'], p['state'])
+        install_packages(module, names, p['state'])
     elif p['state'] == 'absent':
         remove_packages(module, names)