diff --git a/test/ci-bootstrap.py b/test/ci-bootstrap.py
index b52bbc83f82bd7cde4306e96c21cd6ac4caff344..efa65b8e6f1f66b1ffe4e41fcfb01e5092c0d74b 100755
--- a/test/ci-bootstrap.py
+++ b/test/ci-bootstrap.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-"""
+r"""
 Used by CI to bootstrap a new cluster and run tests.
 
 Prerequisites
@@ -8,12 +8,15 @@ Prerequisites
   - ansible-runner
   - requests
   - tabulate
+  - psutil
 
 Env vars needed:
 - COSMOS_API_TOKEN
 
 In Debian:
-    apt-get install -y --no-install-recommends ansible gcc libc6-dev
+    apt-get install -y --no-install-recommends ansible gcc libc6-dev \
+      python3-distutils python3-pip python3-setuptools python3-wheel \
+      python3-psutil
     pip3 install ansible-runner requests tabulate
 """
 
@@ -29,6 +32,25 @@ import traceback
 import yaml
 
 
+def init_logging(log, loglevel):
+    """
+    Configure logging.
+
+    - debug and info go to stdout
+    - warning and above go to stderr
+    """
+    log.setLevel(loglevel)
+    stdout = logging.StreamHandler(sys.stdout)
+    stdout.setLevel(loglevel)
+    stdout.addFilter(lambda record: record.levelno <= logging.INFO)
+
+    stderr = logging.StreamHandler()
+    stderr.setLevel(logging.WARNING)
+
+    log.addHandler(stdout)
+    log.addHandler(stderr)
+
+
 if __name__ == "__main__":
 
     # Parse command line arguments
@@ -70,11 +92,11 @@ if __name__ == "__main__":
 
     # Setup logging for this script
     log = logging.getLogger(__name__)
-    cosmos.init_logging(log, loglevel)
+    init_logging(log, loglevel)
 
     # Setup logging for cosmos module
     log_cosmos = logging.getLogger('cosmos')
-    cosmos.init_logging(log_cosmos, loglevel)
+    init_logging(log_cosmos, loglevel)
 
     # Start bootstrapping
     if args.create_droplet:
diff --git a/test/cosmos.py b/test/cosmos.py
index b51896e9967cc532602fef88fdd5ede0a29ceb25..8a45d830687b0b6e54d3fcc20df471f87c7b5251 100755
--- a/test/cosmos.py
+++ b/test/cosmos.py
@@ -13,25 +13,6 @@ from time import sleep
 
 
 # Helper functions
-def init_logging(log, loglevel):
-    """
-    Configure logging.
-
-    - debug and info go to stdout
-    - warning and above go to stderr
-    """
-    log.setLevel(loglevel)
-    stdout = logging.StreamHandler(sys.stdout)
-    stdout.setLevel(loglevel)
-    stdout.addFilter(lambda record: record.levelno <= logging.INFO)
-
-    stderr = logging.StreamHandler()
-    stderr.setLevel(logging.WARNING)
-
-    log.addHandler(stdout)
-    log.addHandler(stderr)
-
-
 def request_api(resource: str, request_type: str = 'GET',
                 data: str = ''):
     """Query the cosmos API."""
@@ -287,11 +268,12 @@ def wait_for_state(id: int, state):
         status = status_droplet(id)
 
 
-log = logging.getLogger(__name__)
 # When called from from ipython, setup
 # logging to console
 try:
     __IPYTHON__
-    init_logging(log, logging.INFO)
+    log = logging.getLogger()
+    log.addHandler(logging.StreamHandler())
+    log.setLevel(logging.INFO)
 except NameError:
-    pass
+    log = logging.getLogger(__name__)