{"id":886,"date":"2015-03-21T16:41:38","date_gmt":"2015-03-21T20:41:38","guid":{"rendered":"http:\/\/blog.domb.net\/?p=886"},"modified":"2015-07-29T01:05:04","modified_gmt":"2015-07-29T05:05:04","slug":"publicadmin-apis-and-high-availability-with-red-hat-openstack-installer-6-juno-get-it-ready-for-cloudforms","status":"publish","type":"post","link":"https:\/\/blog.domb.net\/?p=886","title":{"rendered":"Public\/admin api&#8217;s and high availability with Red Hat OpenStack Installer 6 Juno \/ Getting OpenStack HA CloudForms ready"},"content":{"rendered":"<p>This post will\u00a0guide you through the configuration for an OpenStack HA cluster setup with public facing admin\/public apis. Exposing the OpenStack apis is essential if you want to make use of hybrid cloud management tools like CloudForms.<\/p>\n<p>OpenStack HA is a very complex beast and hard to setup if you don&#8217;t have the right tooling. To succeed with the installation, you need to make sure that you plan accordingly for your 3 controller &#8211; X compute node setup. You will have to think about things like how do you want to lay out your network, what storage are you going to use for the different services, what type of compute nodes are best for your workloads, etc. etc &#8230;<\/p>\n<p>Once you have an idea on how your OpenStack HA architecture should look like, you can use the\u00a0 Red Hat OpenStack Installer which is based on the products theforeman, puppet and staypuft to provision it. A basic HA environment with 3 controllers and 2 compute nodes with publicly accessible api&#8217;s takes about 90 to 120 minutes (tested on BL465G6).<\/p>\n<p>One of the\u00a0challenges which you run into once the OpenStack installer is up and running is to understand what the staypuft plugin does behind the scenes when you move the different tabs into your subnets.<\/p>\n<p>I assume you followed the Red Hat documentation https:\/\/access.redhat.com\/documentation\/en-US\/Red_Hat_Enterprise_Linux_OpenStack_Platform\/6\/html\/Installer_and_Foreman_Guide\/index.html<\/p>\n<p>and you&#8217;re at the following stage in the installation process:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-888\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/openstackdeploy.png\" alt=\"openstackdeploy\" width=\"700\" height=\"444\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/openstackdeploy.png 700w, https:\/\/blog.domb.net\/wp-content\/uploads\/openstackdeploy-300x190.png 300w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/p>\n<p>As you can see you currently have 3 subnets: An external, default and tenant network. If you proceed with the settings as above all your OpenStack api&#8217;s\/vips will point to the default \/ isolated\u00a0 provisioning network, meaning that all your endpoints are going to point to the private\/isolated network. This is bad as you won&#8217;t be able to access your apis from outside the isolated network.<\/p>\n<p>The following diagram will help you to understand how the network for an OpenStack HA environment with public facing api&#8217;s could look like.<\/p>\n<p><a href=\"http:\/\/blog.domb.net\/wp-content\/uploads\/ospinstaller-network-New-Page2.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1115\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/ospinstaller-network-New-Page2.jpeg\" alt=\"ospinstaller network - New Page\" width=\"1207\" height=\"860\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/ospinstaller-network-New-Page2.jpeg 1207w, https:\/\/blog.domb.net\/wp-content\/uploads\/ospinstaller-network-New-Page2-300x214.jpeg 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/ospinstaller-network-New-Page2-1024x730.jpeg 1024w\" sizes=\"auto, (max-width: 1207px) 100vw, 1207px\" \/><\/a><\/p>\n<p>You can fix the access to the apis\u00a0by creating a\u00a0new subnet for your public apis. It is very important to understand what the osp installer triggers when you choose to separate the public\/admin api from the default subnet.\u00a0 Below find an extract of the ruby method.<\/p>\n<p><strong class=\"final-path\">subnet_typings_controller.rb of <\/strong>the\u00a0https:\/\/github.com\/theforeman\/staypuft project<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-889\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/staypuft.png\" alt=\"staypuft\" width=\"708\" height=\"139\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/staypuft.png 708w, https:\/\/blog.domb.net\/wp-content\/uploads\/staypuft-300x59.png 300w\" sizes=\"auto, (max-width: 708px) 100vw, 708px\" \/><\/p>\n<p>Your public api network <strong>must<\/strong> have a default gateway.\u00a0 Didn&#8217;t we have an external network in the diagram above with a default gateway? So what is that external network for if we can&#8217;t use it to expose the apis?<\/p>\n<p>The external network is not meant to be the network which exposes your public\/admin OpenStack apis.\u00a0The term external network in the realm of the OpenStack installer\u00a0 means that its used for connectivity\/bridges (br-ex) for the running instances.<\/p>\n<p>If you want to expose the public and admin api&#8217;s you\u00a0need to create a new subnet which is on a routeable network. \u00a0Click on the &#8220;New Subnet&#8221; button and create a new public api subnet. Remember that the start and stop range you provide will be used for the public vips used by pacemaker ( So public\/admin vips).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-894\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/createpubapinetwork.png\" alt=\"createpubapinetwork\" width=\"897\" height=\"572\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/createpubapinetwork.png 897w, https:\/\/blog.domb.net\/wp-content\/uploads\/createpubapinetwork-300x191.png 300w\" sizes=\"auto, (max-width: 897px) 100vw, 897px\" \/><\/p>\n<p>Once done, assign your networks to the correct subnets. In the current setup I am not using a separate subnet for storage. In a production environment you should be using one.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-895\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/networkingosp.png\" alt=\"networkingosp\" width=\"1347\" height=\"576\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/networkingosp.png 1347w, https:\/\/blog.domb.net\/wp-content\/uploads\/networkingosp-300x128.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/networkingosp-1024x438.png 1024w\" sizes=\"auto, (max-width: 1347px) 100vw, 1347px\" \/><\/p>\n<p>Now that you have chosen in what subnets your services will reside, it&#8217;s time to look behind the scenes and explore what exactly happens\u00a0when you place the\u00a0public\/admin api tab into your newly created public api subnet.<\/p>\n<p>The Public api sets up access to the OpenStack public REST API. It overrides\u00a0the following parameters (smart class variables) in the controller module which you can find in the advanced configurations tab:<\/p>\n<p>* Ceilometer public vip<br \/>\n* Cinder public vip<br \/>\n* Glance public vip<br \/>\n* Heat public vip<br \/>\n* Heat cfn public vip<br \/>\n* Horizon public vip (to access OpenStack admin interface)<br \/>\n* Keystone public vip<br \/>\n* Loadbalancer vip<br \/>\n* Neutron public vip<br \/>\n* Nova public vip (essential as this is connected with the nova_host variable which sets the novncproxy url in nova.conf)<br \/>\n* Swift public vip<\/p>\n<p>Some applications like CloudForms need to be able to access the admin\u00a0REST\u00a0API via public interface. By moving the admin tab into the public api subnet we override these additional controller smart class parameters:<\/p>\n<p>* Ceilometer admin vip<br \/>\n* Glance admin vip<br \/>\n* Heat admin vip<br \/>\n* Heat cfn admin vip<br \/>\n* Horizon admin vip<br \/>\n* Keystone admin vip<br \/>\n* Neutron admin vip<br \/>\n* Nova admin vip<\/p>\n<p>I assume that you now have everything in place from a networking perspective and you pressed the next button. The installer will send you to the following page which shows you what components will get installed on controller and compute.\u00a0 Click next &#8230;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-898\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/overview.png\" alt=\"overview\" width=\"831\" height=\"477\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/overview.png 831w, https:\/\/blog.domb.net\/wp-content\/uploads\/overview-300x172.png 300w\" sizes=\"auto, (max-width: 831px) 100vw, 831px\" \/><\/p>\n<p>The next step will give you the opportunity to set your core plugins for networking as well as\u00a0 cinder\/glance configurations. There was a bug in correlation with vxlan and mtu size in Icehouse which got fixed in Juno. If for whatever reason you would like to specify a default mtu size for your instances you can set it here.\u00a0 Once done with your configuration click next.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-899\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/serivceconfig.png\" alt=\"serivceconfig\" width=\"1577\" height=\"472\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/serivceconfig.png 1577w, https:\/\/blog.domb.net\/wp-content\/uploads\/serivceconfig-300x90.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/serivceconfig-1024x306.png 1024w\" sizes=\"auto, (max-width: 1577px) 100vw, 1577px\" \/><\/p>\n<p>The next steps are <strong>CRITICAL<\/strong> for a successful HA deployment. You will have to assign the the nodes to the roles and place them into the <strong>correct<\/strong> subnets. Click the plus sign and add your hosts to the specific roles<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-901\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/choosehost.png\" alt=\"choosehost\" width=\"766\" height=\"251\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/choosehost.png 766w, https:\/\/blog.domb.net\/wp-content\/uploads\/choosehost-300x98.png 300w\" sizes=\"auto, (max-width: 766px) 100vw, 766px\" \/>Once your done adding the hosts you need to <strong>CONFIGURE<\/strong> the networks. Make sure you don&#8217;t rush this.<\/p>\n<p>You are going to be presented with something like this if you added your controller nodes.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-902\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/3hosts.png\" alt=\"3hosts\" width=\"1898\" height=\"440\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/3hosts.png 1898w, https:\/\/blog.domb.net\/wp-content\/uploads\/3hosts-300x70.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/3hosts-1024x237.png 1024w\" sizes=\"auto, (max-width: 1898px) 100vw, 1898px\" \/><\/p>\n<p>Click on each controller host and configure the following networks:<\/p>\n<p>* default network (must be the first interface)<br \/>\n* tenant network<br \/>\n* public api network<br \/>\n* external network<\/p>\n<p>The order for tenant, public api, external network, storage, etc is irrelevant.<\/p>\n<p>Your configuration could look something like this:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-903\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/networkconfig.png\" alt=\"networkconfig\" width=\"1210\" height=\"936\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/networkconfig.png 1210w, https:\/\/blog.domb.net\/wp-content\/uploads\/networkconfig-300x232.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/networkconfig-1024x792.png 1024w\" sizes=\"auto, (max-width: 1210px) 100vw, 1210px\" \/><\/p>\n<p>Do the same for your compute nodes. (Note: you are not going to see br_int, br_tun, ovs_system virbr0_nic until your installation is done)<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-920\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/nova.png\" alt=\"nova\" width=\"1883\" height=\"523\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/nova.png 1883w, https:\/\/blog.domb.net\/wp-content\/uploads\/nova-300x83.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/nova-1024x284.png 1024w\" sizes=\"auto, (max-width: 1883px) 100vw, 1883px\" \/><\/p>\n<p>The reason why I am using the external network for the compute nodes is because I will be using DVR in my setup. DVR enables east west traffic via virtual router on the compute node and also handles north south traffic for your instances floating ip&#8217;s.<\/p>\n<p>Once you configured all your networks click on the advanced configuration tab, and click edit. You have to override two values in the neutron puppet module.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-905\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/advancedconfig.png\" alt=\"advancedconfig\" width=\"534\" height=\"117\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/advancedconfig.png 534w, https:\/\/blog.domb.net\/wp-content\/uploads\/advancedconfig-300x66.png 300w\" sizes=\"auto, (max-width: 534px) 100vw, 534px\" \/>\u00a0Click on neutron module on the left and add the value &#8220;br-ex&#8221; to the empty field in &#8220;External network bridge.&#8221; Additionally, you need to scroll down to the &#8220;Ovs tunnel iface&#8221; and override the whole string with <strong>eth1<\/strong> (because my tenant network is there).<\/p>\n<p>Ok, now that your done configuring your system you can click deploy and get a coffee.<\/p>\n<p>After your installation is complete you&#8217;re going to see the following screen:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"  wp-image-907 alignleft\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/deployed.png\" alt=\"deployed\" width=\"457\" height=\"290\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/deployed.png 765w, https:\/\/blog.domb.net\/wp-content\/uploads\/deployed-300x191.png 300w\" sizes=\"auto, (max-width: 457px) 100vw, 457px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Lets go and verify that the Red Hat OpenStack Installer configured the system correctly. Login to your controller source the keystone_adminrc. Run keystone endpoint-list:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-908\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/keystoned.png\" alt=\"keystoned\" width=\"1915\" height=\"451\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/keystoned.png 1915w, https:\/\/blog.domb.net\/wp-content\/uploads\/keystoned-300x71.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/keystoned-1024x241.png 1024w\" sizes=\"auto, (max-width: 1915px) 100vw, 1915px\" \/><\/p>\n<p>As you can see our public and admin url are on the correct subnet. Lets make sure that the vips for pacemaker were created correctly.\u00a0 Run\u00a0 pcs status | grep pub<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-913\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/pubipspcs.png\" alt=\"pubipspcs\" width=\"1129\" height=\"277\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/pubipspcs.png 1129w, https:\/\/blog.domb.net\/wp-content\/uploads\/pubipspcs-300x74.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/pubipspcs-1024x251.png 1024w\" sizes=\"auto, (max-width: 1129px) 100vw, 1129px\" \/><\/p>\n<p>Nice, all the vips have public ip&#8217;s. Remember the default route change from external to the public api network? Run route to see if that&#8217;s correct.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-909\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/route.png\" alt=\"route\" width=\"806\" height=\"267\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/route.png 806w, https:\/\/blog.domb.net\/wp-content\/uploads\/route-300x99.png 300w\" sizes=\"auto, (max-width: 806px) 100vw, 806px\" \/><\/p>\n<p>As expected\u00a0we see that the default getaway was set on the public api subnet. This means that my br-ex will be plugged in\u00a0to my eth3\/external subnet which you can see\u00a0 by running ovs-vsctl show.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"  wp-image-910 alignleft\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/br-ex.png\" alt=\"br-ex\" width=\"457\" height=\"210\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/br-ex.png 643w, https:\/\/blog.domb.net\/wp-content\/uploads\/br-ex-300x138.png 300w\" sizes=\"auto, (max-width: 457px) 100vw, 457px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Next we need to check if the cluster is healthy. You can do this with pcs status.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-911\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/pacemakerafterinstall.png\" alt=\"pacemakerafterinstall\" width=\"961\" height=\"648\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/pacemakerafterinstall.png 961w, https:\/\/blog.domb.net\/wp-content\/uploads\/pacemakerafterinstall-300x202.png 300w\" sizes=\"auto, (max-width: 961px) 100vw, 961px\" \/><\/p>\n<p>As you can see my 3 controllers are online and I have no failures in the resources. Last but not least (in my setup I choose to use nfs ) I have to check if cinder and glance got mounted correctly. Type mount<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-915\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/mount.png\" alt=\"mount\" width=\"1027\" height=\"77\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/mount.png 1919w, https:\/\/blog.domb.net\/wp-content\/uploads\/mount-300x23.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/mount-1024x77.png 1024w\" sizes=\"auto, (max-width: 1027px) 100vw, 1027px\" \/><\/p>\n<p>The nfs volumes for Glance and Cinder are both mounted. So we are almost ready to go.<\/p>\n<p>If you want to connect CloudForms with OpenStack you need an admin user which is part of the tenant (admin) and has a role admin. It also needs to be admin for the services project\/tenant. Lets create the CloudForms user for the OpenStack provider. Source your keystone_adminrc<\/p>\n<pre>[root@mac525400efb284 ~(openstack_admin)]# keystone tenant-list\r\n+----------------------------------+----------+---------+\r\n|                id                |   name   | enabled |\r\n+----------------------------------+----------+---------+\r\n| 2bfd94a4c1b544b39d224f2a94901e66 |  admin   |   True  |\r\n| a7777076e3324b33948205d731f9d030 |   blue   |   True  |\r\n| 2892bbb62e474f32a0fa3255a6d812e4 |   red    |   True  |\r\n| 465e99d053b34ddebde3897cb4f1987b | services |   True  |\r\n+----------------------------------+----------+---------+\r\n<\/pre>\n<p>Create the CloudForms user<\/p>\n<pre>[root@mac525400efb284 ~(openstack_admin)]# keystone user-create --name cloudforms --tenant-id 2bfd94a4c1b544b39d224f2a94901e66 --pass redhatrocks --email ilove@open.stack --enable true\r\n+----------+----------------------------------+\r\n| Property |              Value               |\r\n+----------+----------------------------------+\r\n|  email   |         ilove@open.stack         |\r\n| enabled  |               True               |\r\n|    id    | c24c5c2472274a2db6f9bbb30f9edb37 |\r\n|   name   |            cloudforms            |\r\n| tenantId | 2bfd94a4c1b544b39d224f2a94901e66 |\r\n| username |            cloudforms            |\r\n+----------+----------------------------------+\r\n<\/pre>\n<p>List the Keystone Roles and users<\/p>\n<pre>[root@mac525400efb284 ~(openstack_admin)]# keystone role-list\r\n+----------------------------------+------------------+\r\n|                id                |       name       |\r\n+----------------------------------+------------------+\r\n| 9fe2ff9ee4384b1894a90878d3e92bab |     _member_     |\r\n| c892bd2dbda84abe9d60ab6d9201247b |      admin       |\r\n| 064cda4f78c84eaeae076f0e1c25ea2c | heat_stack_owner |\r\n| f19f526d30724eed844683b6a8271162 | heat_stack_user  |\r\n+----------------------------------+------------------+\r\n[root@mac525400efb284 ~(openstack_admin)]# keystone user-list\r\n+----------------------------------+------------+---------+----------------------+\r\n|                id                |    name    | enabled |        email         |\r\n+----------------------------------+------------+---------+----------------------+\r\n| 0f46f03997224f6a96514fac7754cc87 |   admin    |   True  | admin@local.domb.com |\r\n| 59db049f99bf4f84ab4f368d21e5461d |   cinder   |   True  |   cinder@localhost   |\r\n| c24c5c2472274a2db6f9bbb30f9edb37 | cloudforms |   True  |   laurent@domb.net   |\r\n| 4023b1b6ae5f447b902843fe97b902c2 |   glance   |   True  |   glance@localhost   |\r\n| 6527504f789f4493800949b03bacf60d |    heat    |   True  |    heat@localhost    |\r\n| b9b2e08d02774162b9820b9e11fcc7ca |  neutron   |   True  |  neutron@localhost   |\r\n| bb189b4ad8e64dd9af16ace81a8c19c5 |    nova    |   True  |    nova@localhost    |\r\n+----------------------------------+------------+---------+----------------------+\r\n<\/pre>\n<p>Add the correct role tenant id to your user<\/p>\n<pre>[root@mac525400efb284 ~(openstack_admin)]# keystone user-role-add --user c24c5c2472274a2db6f9bbb30f9edb37 --role c892bd2dbda84abe9d60ab6d9201247b --tenant-id 2bfd94a4c1b544b39d224f2a94901e66\r\n<\/pre>\n<p>Add the cloudforms user to the services tenant<\/p>\n<pre>[root@mac525400efb284 ~(openstack_cloudforms)]# keystone user-role-add --user cloudforms --tenant services --role admin\r\n<\/pre>\n<p>We are now ready to connect CloudForms\u00a0 to the keystone public vip:5000.\u00a0 You will also need the amqp user and password &#8220;Amqp username&#8221;\/&#8221;Amqp password&#8221; (&#8220;openstack\/redhat&#8221;) which can be found in the controller class (this can be overridden).<\/p>\n<p>Login to the CloudForms appliance and click on the Cloud -&gt; Providers\u00a0 tab. Under the Cloud -&gt; Provider tab click -&gt; Configuration -&gt; Add new Cloud Provider. <img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-936\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/cloudforms.png\" alt=\"cloudforms\" width=\"513\" height=\"256\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/cloudforms.png 513w, https:\/\/blog.domb.net\/wp-content\/uploads\/cloudforms-300x150.png 300w\" sizes=\"auto, (max-width: 513px) 100vw, 513px\" \/>Enter the following information<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-950\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/openstackkeystone.png\" alt=\"openstackkeystone\" width=\"478\" height=\"603\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/openstackkeystone.png 478w, https:\/\/blog.domb.net\/wp-content\/uploads\/openstackkeystone-238x300.png 238w\" sizes=\"auto, (max-width: 478px) 100vw, 478px\" \/><\/p>\n<p>Click validate. If you get an ok back enter the AMQP user and password<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-952\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/amqp.png\" alt=\"amqp\" width=\"599\" height=\"282\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/amqp.png 599w, https:\/\/blog.domb.net\/wp-content\/uploads\/amqp-300x141.png 300w\" sizes=\"auto, (max-width: 599px) 100vw, 599px\" \/>and click validate and save.<\/p>\n<p>That&#8217;s it, you&#8217;re done! You can now use CloudForms to manage your OpenStack HA environment.<\/p>\n<p>Note: If you add a new tenant to your OpenStack environment and want CloudForms to manage it you will need to add the CloudForms user as admin to that tenant.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post will\u00a0guide you through the configuration for an OpenStack HA cluster setup with public facing admin\/public apis. Exposing the OpenStack apis is essential if you want to make use of hybrid cloud management tools like CloudForms. OpenStack HA is a very complex beast and hard to setup if you don&#8217;t have the right tooling&#8230;.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[36],"tags":[33,32,35,34],"class_list":["post-886","post","type-post","status-publish","format-standard","hentry","category-openstack","tag-high-availability","tag-openstack","tag-openstack-installer","tag-redhat"],"_links":{"self":[{"href":"https:\/\/blog.domb.net\/index.php?rest_route=\/wp\/v2\/posts\/886","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.domb.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.domb.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.domb.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.domb.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=886"}],"version-history":[{"count":63,"href":"https:\/\/blog.domb.net\/index.php?rest_route=\/wp\/v2\/posts\/886\/revisions"}],"predecessor-version":[{"id":1116,"href":"https:\/\/blog.domb.net\/index.php?rest_route=\/wp\/v2\/posts\/886\/revisions\/1116"}],"wp:attachment":[{"href":"https:\/\/blog.domb.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=886"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.domb.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=886"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.domb.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=886"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}