diff --git a/kayobe/cli/commands.py b/kayobe/cli/commands.py
index 62aff0fcc..6157a4638 100644
--- a/kayobe/cli/commands.py
+++ b/kayobe/cli/commands.py
@@ -127,7 +127,9 @@ class ControlHostUpgrade(KayobeAnsibleMixin, VaultMixin, Command):
 
     def take_action(self, parsed_args):
         self.app.LOG.debug("Upgrading Kayobe control host")
-        utils.galaxy_install("ansible/requirements.yml", "ansible/roles")
+        # Use force to upgrade roles.
+        utils.galaxy_install("ansible/requirements.yml", "ansible/roles",
+                             force=True)
         playbooks = _build_playbook_list("bootstrap")
         self.run_kayobe_playbooks(parsed_args, playbooks)
         playbooks = _build_playbook_list("kolla-ansible")
diff --git a/kayobe/utils.py b/kayobe/utils.py
index 08d4c1d0b..6e41a0287 100644
--- a/kayobe/utils.py
+++ b/kayobe/utils.py
@@ -36,11 +36,13 @@ def yum_install(packages):
         sys.exit(e.returncode)
 
 
-def galaxy_install(role_file, roles_path):
+def galaxy_install(role_file, roles_path, force=False):
     """Install Ansible roles via Ansible Galaxy."""
     cmd = ["ansible-galaxy", "install"]
     cmd += ["--roles-path", roles_path]
     cmd += ["--role-file", role_file]
+    if force:
+        cmd += ["--force"]
     try:
         run_command(cmd)
     except subprocess.CalledProcessError as e: