diff --git a/releasenotes/notes/octavia-passphrase-285a06885ac735df.yaml b/releasenotes/notes/octavia-passphrase-285a06885ac735df.yaml
new file mode 100644
index 000000000..d1d159839
--- /dev/null
+++ b/releasenotes/notes/octavia-passphrase-285a06885ac735df.yaml
@@ -0,0 +1,7 @@
+---
+features:
+  - |
+    Add OctaviaCaKeyPassphrase to the list of passwords
+    to generate, so users don't have to pick a string or
+    rely on a default value for octavia CA private key
+    passphrase.
diff --git a/tripleo_common/constants.py b/tripleo_common/constants.py
index 3c07977e5..a74531c5f 100644
--- a/tripleo_common/constants.py
+++ b/tripleo_common/constants.py
@@ -102,6 +102,7 @@ PASSWORD_PARAMETER_NAMES = (
     'NovaPassword',
     'NovajoinPassword',
     'MigrationSshKey',
+    'OctaviaCaKeyPassphrase',
     'OctaviaHeartbeatKey',
     'OctaviaPassword',
     'PacemakerRemoteAuthkey',
diff --git a/tripleo_common/tests/actions/test_parameters.py b/tripleo_common/tests/actions/test_parameters.py
index 6c9468cde..41dcbf31f 100644
--- a/tripleo_common/tests/actions/test_parameters.py
+++ b/tripleo_common/tests/actions/test_parameters.py
@@ -57,6 +57,7 @@ _EXISTING_PASSWORDS = {
     'PankoPassword': 'cVZXehsSc2KdmFFMKDudxTLKn',
     'OctaviaHeartbeatKey': 'oct-heartbeat-key',
     'OctaviaPassword': 'NMl7j3nKk1VVwMxUZC8Cgw==',
+    'OctaviaCaKeyPassphrase': 'SLj4c3uCk4DDxPwQOG1Heb==',
     'ManilaPassword': 'NYJN86Fua3X8AVFWmMhQa2zTH',
     'NeutronMetadataProxySharedSecret': 'Q2YgUCwmBkYdqsdhhCF4hbghu',
     'CephMdsKey': b'AQCQXtlXAAAAABAAT4Gk+U8EqqStL+JFa9bp1Q==',
diff --git a/workbooks/octavia_post.yaml b/workbooks/octavia_post.yaml
new file mode 100644
index 000000000..a22efc2cb
--- /dev/null
+++ b/workbooks/octavia_post.yaml
@@ -0,0 +1,139 @@
+---
+version: '2.0'
+name: tripleo.octavia_post.v1
+description: TripleO Octavia post deployment Workflows
+
+workflows:
+
+  octavia_post_deploy:
+    description: Octavia post deployment
+    input:
+      - amp_image_name
+      - amp_image_filename
+      - amp_image_tag
+      - lb_mgmt_net_name
+      - lb_mgmt_subnet_name
+      - lb_sec_group_name
+      - lb_mgmt_subnet_cidr
+      - lb_mgmt_subnet_gateway
+      - lb_mgmt_subnet_pool_start
+      - lb_mgmt_subnet_pool_end
+      - generate_certs
+      - octavia_ansible_playbook
+      - overcloud_admin
+      - ca_cert_path
+      - ca_private_key_path
+      - ca_passphrase
+      - client_cert_path
+      - mgmt_port_dev
+      - overcloud_password
+      - overcloud_project
+      - overcloud_pub_auth_uri
+      - ansible_extra_env_variables:
+          ANSIBLE_HOST_KEY_CHECKING: 'False'
+          ANSIBLE_SSH_RETRIES: '3'
+    tags:
+      - tripleo-common-managed
+    tasks:
+      enable_ssh_admin:
+        workflow: tripleo.access.v1.enable_ssh_admin
+        on-success: get_private_key
+
+      get_private_key:
+        action: tripleo.validations.get_privkey
+        publish:
+          private_key: <% task().result %>
+        on-success: get_overcloud_stack_details
+
+      get_overcloud_stack_details:
+        publish:
+          # TODO(beagles), we are making an assumption about the octavia heatlh manager and
+          # controller worker needing
+          #
+          octavia_controller_ips: <% env().get('service_ips', {}).get('octavia_worker_ctlplane_node_ips', []) %>
+        on-success: make_local_temp_directory
+
+      make_local_temp_directory:
+        action: tripleo.files.make_temp_dir
+        publish:
+          undercloud_local_dir: <% task().result.path %>
+        on-success: make_remote_temp_directory
+
+      make_remote_temp_directory:
+        action: tripleo.files.make_temp_dir
+        publish:
+          undercloud_remote_dir: <% task().result.path %>
+        on-success: build_local_connection_environment_vars
+
+      build_local_connection_environment_vars:
+        publish:
+          ansible_local_connection_variables: <% dict('ANSIBLE_REMOTE_TEMP' => $.undercloud_remote_dir, 'ANSIBLE_LOCAL_TEMP' => $.undercloud_local_dir) + $.ansible_extra_env_variables %>
+        on-success: upload_amphora
+
+      upload_amphora:
+        action: tripleo.ansible-playbook
+        input:
+          inventory:
+            undercloud:
+              hosts:
+                localhost:
+                  ansible_connection: local
+
+          playbook: <% $.octavia_ansible_playbook %>
+          remote_user: stack
+          extra_env_variables: <% $.ansible_local_connection_variables %>
+          extra_vars:
+            os_password: <% $.overcloud_password %>
+            os_username: <% $.overcloud_admin %>
+            os_project_name: <% $.overcloud_project %>
+            os_auth_url: <% $.overcloud_pub_auth_uri %>
+            os_auth_type: "password"
+            os_identity_api_version: "3"
+            amp_image_name: <% $.amp_image_name %>
+            amp_image_filename: <% $.amp_image_filename %>
+            amp_image_tag: <% $.amp_image_tag %>
+        on-success: config_octavia
+
+      config_octavia:
+        action: tripleo.ansible-playbook
+        input:
+          inventory:
+            octavia_nodes:
+              hosts: <% $.octavia_controller_ips.toDict($, {}) %>
+          verbosity: 0
+          playbook: <% $.octavia_ansible_playbook %>
+          remote_user: tripleo-admin
+          become: true
+          become_user: root
+          ssh_private_key: <% $.private_key %>
+          ssh_common_args: '-o StrictHostKeyChecking=no'
+          ssh_extra_args: '-o UserKnownHostsFile=/dev/null'
+          extra_env_variables: <% $.ansible_extra_env_variables %>
+          extra_vars:
+            os_password: <% $.overcloud_password %>
+            os_username: <% $.overcloud_admin %>
+            os_project_name: <% $.overcloud_project %>
+            os_auth_url: <% $.overcloud_pub_auth_uri %>
+            os_auth_type: "password"
+            os_identity_api_version: "3"
+            amp_image_tag: <% $.amp_image_tag %>
+            lb_mgmt_net_name: <% $.lb_mgmt_net_name %>
+            lb_mgmt_subnet_name: <% $.lb_mgmt_subnet_name %>
+            lb_sec_group_name: <% $.lb_sec_group_name %>
+            lb_mgmt_subnet_cidr: <% $.lb_mgmt_subnet_cidr %>
+            lb_mgmt_subnet_gateway: <% $.lb_mgmt_subnet_gateway %>
+            lb_mgmt_subnet_pool_start: <% $.lb_mgmt_subnet_pool_start %>
+            lb_mgmt_subnet_pool_end: <% $.lb_mgmt_subnet_pool_end %>
+            ca_cert_path: <% $.ca_cert_path %>
+            ca_private_key_path: <% $.ca_private_key_path %>
+            ca_passphrase: <% $.ca_passphrase %>
+            client_cert_path: <% $.client_cert_path %>
+            generate_certs: <% $.generate_certs %>
+            mgmt_port_dev: <% $.mgmt_port_dev %>
+        on-complete: purge_local_temp_dir
+      purge_local_temp_dir:
+        action: tripleo.files.remove_temp_dir path=<% $.undercloud_local_dir %>
+        on-complete: purge_remote_temp_dir
+      purge_remote_temp_dir:
+        action: tripleo.files.remove_temp_dir path=<% $.undercloud_remote_dir %>
+