{"id":74,"date":"2018-01-10T08:00:40","date_gmt":"2018-01-10T15:00:40","guid":{"rendered":"http:\/\/bloggf.dannf.org\/?p=74"},"modified":"2019-10-23T14:52:55","modified_gmt":"2019-10-23T20:52:55","slug":"deploying-ubuntu-openstack-to-arm64-servers","status":"publish","type":"post","link":"https:\/\/bloggf.dannf.org\/index.php\/2018\/01\/10\/deploying-ubuntu-openstack-to-arm64-servers\/","title":{"rendered":"Deploying Ubuntu OpenStack to ARM64 servers"},"content":{"rendered":"<p>At Canonical, we&#8217;ve been doing work to make sure <a href=\"https:\/\/www.ubuntu.com\/openstack\">Ubuntu OpenStack<\/a> deploys on ARM servers as easily as on x86. Whether you have Qualcomm 2400 REP boards, Cavium ThunderX boards, HiSilicon D05 boards, or other <a href=\"https:\/\/certification.ubuntu.com\/\">Ubuntu&nbsp; Certified<\/a>&nbsp;server hardware, you can go from bare metal to a working OpenStack in minutes!<\/p>\n<p>The following tutorial will walk you through building a simple Ubuntu OpenStack setup, highlighting any ARM-specific caveats along the way.<\/p>\n<p><em><strong>Note<\/strong>: very little here is actually ARM specific &#8211; you could just as easily follow this to setup an x86 OpenStack.<\/em><\/p>\n<h2>Juju and MAAS<\/h2>\n<p>Ubuntu OpenStack is deployed using <a href=\"https:\/\/maas.io\">MAAS<\/a> and <a href=\"https:\/\/jujucharms.com\/\">Juju<\/a>. If you&#8217;re unfamiliar with these tools, let me give you a quick overview.<\/p>\n<p>MAAS is a service that manages clusters of bare-metal servers in a manner similar to cloud instances. Using the web interface, or its API, you can ask MAAS to power on one or more servers and deploy an OS to them, ready for login. In this tutorial, we&#8217;ll be adding your ARM servers to a MAAS cluster, so that Juju can deploy and manage them via the MAAS API.<\/p>\n<p>Juju is a workload orchestration tool. It takes definitions of workloads, called bundles, and realizes them in a given cloud environment. In this case, we&#8217;ll be deploying Ubuntu&#8217;s openstack-base bundle to your MAAS cloud environment.<\/p>\n<h2>Hardware Requirements<\/h2>\n<p>A minimal Ubuntu OpenStack setup on ARM comprises:<\/p>\n<ul>\n<li>5 <strong>ARM server nodes<\/strong> for your MAAS cluster. 4 of these will be used to run OpenStack services, the 5th will operate a Juju controller that manages the deployment.\n<ul>\n<li>Each system needs to have 2 disks (the second is for ceph storage).<\/li>\n<li>Each system needs to have 2 network adapters. To keep this simple, it&#8217;s best if the network adapters are identically configured (same NICs, and if plug-in NICs are used, same slots).<\/li>\n<li>Each node should be configured to PXE boot by default. If you have one of these systems, checkout the &#8220;MAAS Notes&#8221; section on the Ubuntu wiki for tips:\n<ul>\n<li><a href=\"https:\/\/wiki.ubuntu.com\/HardwareSupport\/Machines\/Servers\/HiSilicon\/D05\">HiSilicon D05<\/a><\/li>\n<li><a href=\"https:\/\/wiki.ubuntu.com\/HardwareSupport\/Machines\/Servers\/Cavium\/ThunderXCRB1S\">Cavium ThunderX CRB<\/a><\/li>\n<li><a href=\"https:\/\/wiki.ubuntu.com\/HardwareSupport\/Machines\/Servers\/Cavium\/Sabre\">Cavium Sabre<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>1 server to run the <strong>MAAS server<\/strong>\n<ul>\n<li>CPU architecture doesn&#8217;t matter.<\/li>\n<li>Install this server with Ubuntu Server 16.04. A clean &#8220;Basic&#8221; installation is recommended.<\/li>\n<li>&gt;= 10GB of free disk space.<\/li>\n<li>&gt;= 2GB of RAM<\/li>\n<\/ul>\n<\/li>\n<li>1 <strong>client system<\/strong> for you to use to execute juju and openstack client commands to initiate, monitor and test out the deployment.\n<ul>\n<li>Make sure this is a system that can run a web browser, so you can use it to view the Juju, MAAS and OpenStack GUIs.<\/li>\n<li>Ubuntu 16.04 is recommended (that&#8217;s what we tested with).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Network Layout<\/h2>\n<p>Again for simplicity, this tutorial will assume that everything (both NICs of each ARM server, ARM server BMCs, MAAS server, client system and your OpenStack floating IPs) are all on the same flat network (you&#8217;ll want more segregation in a production deployment). Cabling should look like the following figure:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/docs.google.com\/drawings\/d\/e\/2PACX-1vT-xonXQpJ4SDGDABNQKXV_i4XcW-9fy9zGCKQX07NwX174Ja3kCpho4eRvQnsy8Ij5UKB2KNWxoJl-\/pub?w=1440&amp;h=1080\"><\/p>\n<p>We&#8217;re using a 10.228.66.0\/24 network throughout this tutorial. MAAS will provide a DHCP server for this subnet, so <strong>be sure to deactivate any other DHCP servers to avoid interference<\/strong>.<\/p>\n<h2>Network Planning<\/h2>\n<p>Since all of your IPs will be sharing a single subnet, you should prepare a plan in advance for how you want to split up the IPs to avoid accidental overlap. For example, with our 10.228.66.0\/24 network, you might allocate:<\/p>\n<ul>\n<li>10.228.66.1 &#8211; Gateway<\/li>\n<li>10.228.66.2:10.228.66.20 &#8211; Static IPs (MAAS Server, client system, ARM Server BMCs, etc.)<\/li>\n<li>10.228.66.21:10.228.66.50: MAAS node IP pool (IPs MAAS is allowed to assign to your ARM Server nodes).<\/li>\n<li>10.228.66.51:10.228.66.254: OpenStack floating IP pool (for your OpenStack instances)<\/li>\n<\/ul>\n<h4>OK. Let&#8217;s get to it.<\/h4>\n<h2>MAAS Server Installation<\/h2>\n<p>On the MAAS Server, run the following command sequence to install the latest version of MAAS:<\/p>\n<pre>sudo apt-add-repository ppa:maas\/stable -y\nsudo apt update\nsudo apt install maas -y<\/pre>\n<p>Once MAAS is installed, run the following command to setup admin username and password:<\/p>\n<pre>ubuntu@maas:~$ sudo maas createadmin\nUsername: ubuntu\nPassword: \nAgain: \nEmail: ubuntu@example.org\nImport SSH keys [] (lp:user-id or gh:user-id): lp:&lt;lpuserid&gt;<\/pre>\n<p>Using a web browser from the client system, connect to the MAAS web interface. It is at http:\/\/&lt;MAAS Server IP addr&gt;\/MAAS :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-82 size-full\" src=\"http:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/EsThCo.png\" alt=\"\" width=\"1474\" height=\"799\" srcset=\"https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/EsThCo.png 1474w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/EsThCo-300x163.png 300w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/EsThCo-768x416.png 768w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/EsThCo-1024x555.png 1024w\" sizes=\"auto, (max-width: 1474px) 100vw, 1474px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Login with the admin credentials you just created. Select arm64 in Architectures of image sources &nbsp;and click \u201cUpdate Selection\u201d. Wait for image download and sync. After all images are synced, Click \u201cContinue\u201d.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-83\" src=\"http:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/TVJkPp.png\" alt=\"\" width=\"1462\" height=\"892\" srcset=\"https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/TVJkPp.png 1462w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/TVJkPp-300x183.png 300w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/TVJkPp-768x469.png 768w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/TVJkPp-1024x625.png 1024w\" sizes=\"auto, (max-width: 1462px) 100vw, 1462px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Import one or more ssh keys. You can paste them in, or easily import from Launchpad or GitHub:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-84 size-full\" src=\"http:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/6OcQnh.png\" alt=\"\" width=\"1160\" height=\"753\" srcset=\"https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/6OcQnh.png 1160w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/6OcQnh-300x195.png 300w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/6OcQnh-768x499.png 768w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/6OcQnh-1024x665.png 1024w\" sizes=\"auto, (max-width: 1160px) 100vw, 1160px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>After basic setup, Goto \u201cSubnets\u201d tag, and click the subnet address:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-85\" src=\"http:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/52RZn9.png\" alt=\"\" width=\"940\" height=\"603\" srcset=\"https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/52RZn9.png 940w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/52RZn9-300x192.png 300w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/52RZn9-768x493.png 768w\" sizes=\"auto, (max-width: 940px) 100vw, 940px\" \/><\/p>\n<p>Provide the correct \u201cGateway IP\u201d and \u201cDNS\u201d address for your subnet:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-86\" src=\"http:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/iWQhPn.png\" alt=\"\" width=\"930\" height=\"541\" srcset=\"https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/iWQhPn.png 930w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/iWQhPn-300x175.png 300w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/iWQhPn-768x447.png 768w\" sizes=\"auto, (max-width: 930px) 100vw, 930px\" \/><\/p>\n<p>Next, goto \u201cSubnets\u201d tag and click untagged VLAN:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-87\" src=\"http:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/ZCu5tF.png\" alt=\"\" width=\"940\" height=\"603\" srcset=\"https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/ZCu5tF.png 940w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/ZCu5tF-300x192.png 300w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/ZCu5tF-768x493.png 768w\" sizes=\"auto, (max-width: 940px) 100vw, 940px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Select \u201cProvide dhcp\u201d in the \u201cTake action\u201d pulldown:<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-88\" src=\"http:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/KJLoM6.png\" alt=\"\" width=\"1173\" height=\"964\" srcset=\"https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/KJLoM6.png 1173w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/KJLoM6-300x247.png 300w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/KJLoM6-768x631.png 768w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/KJLoM6-1024x842.png 1024w\" sizes=\"auto, (max-width: 1173px) 100vw, 1173px\" \/><\/span><\/p>\n<p>Many ARM servers (other than X-Gene\/X-Gene 2 systems and Cavium ThunderX CRBs) require the 16.04 HWE kernel, so we need to configure MAAS to use it by default.&nbsp;Go to the \u201cSettings\u201d tab and select \u201cxenial (hwe-16.04)\u201d as the Default Minimum Kernel Version for Commissioning, then click \u201cSave&#8221;:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-89\" src=\"http:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/xSlQO2.png\" alt=\"\" width=\"909\" height=\"607\" srcset=\"https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/xSlQO2.png 909w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/xSlQO2-300x200.png 300w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/xSlQO2-768x513.png 768w\" sizes=\"auto, (max-width: 909px) 100vw, 909px\" \/><\/p>\n<h2>Enlisting and Commissioning Nodes<\/h2>\n<p><span style=\"font-weight: 400;\">In order for MAAS to manage your ARM Server nodes, they need to be first enlisted into MAAS, then commissioned. To do so, power on the node, and allow it to PXE boot from the MAAS server. This should cause the node to appear with a randomly generated name on the \u201cNodes\u201d page:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-90\" src=\"http:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/WxVIIZ.png\" alt=\"\" width=\"960\" height=\"747\" srcset=\"https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/WxVIIZ.png 960w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/WxVIIZ-300x233.png 300w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/WxVIIZ-768x598.png 768w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/p>\n<p>Click on the Node name, and select \u201cCommission\u201d in the \u201cTake action\u201d menu. This will begin a system inventory process after which the node\u2019s status will become \u201cReady\u201d.<\/p>\n<p>Repeat for all other nodes.<\/p>\n<h2>Testing out MAAS<\/h2>\n<p>Before we deploy OpenStack, it&#8217;d be good to first demonstrate that your MAAS cluster is functioning properly.<\/p>\n<p>From the &#8220;Nodes&#8221; page in the MAAS UI, select a node and choose the &#8220;Deploy&#8221; action in the &#8220;Take action&#8221; pulldown:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-91\" src=\"http:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/uE1QP6.png\" alt=\"\" width=\"970\" height=\"735\" srcset=\"https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/uE1QP6.png 970w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/uE1QP6-300x227.png 300w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/uE1QP6-768x582.png 768w\" sizes=\"auto, (max-width: 970px) 100vw, 970px\" \/><\/p>\n<p>When status becomes &#8220;Deployed&#8221;,&nbsp;you can ssh into the node with username \u201cubuntu\u201d and your ssh private key. You can find a node\u2019s IP address by clicking the node\u2019s hostname and looking at the Interfaces tab:<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-92\" src=\"http:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/1zyL3R.png\" alt=\"\" width=\"962\" height=\"685\" srcset=\"https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/1zyL3R.png 962w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/1zyL3R-300x214.png 300w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/1zyL3R-768x547.png 768w\" sizes=\"auto, (max-width: 962px) 100vw, 962px\" \/><\/p>\n<p>Now ssh to that node with username &#8220;ubuntu&#8221; and the ssh key you configured in MAAS earlier:<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-93\" src=\"http:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/s9DWEW.png\" alt=\"\" width=\"661\" height=\"466\" srcset=\"https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/s9DWEW.png 661w, https:\/\/bloggf.dannf.org\/wp-content\/uploads\/2018\/01\/s9DWEW-300x211.png 300w\" sizes=\"auto, (max-width: 661px) 100vw, 661px\" \/><\/p>\n<p>All good? OK &#8211; release the node back to the cluster via the MAAS UI, and let&#8217;s move onto deploying OpenStack!<\/p>\n<h2>Deploying OpenStack<\/h2>\n<p>Download the bundle .zip file from <a href=\"https:\/\/jujucharms.com\/openstack-base\/50\">https:\/\/jujucharms.com\/openstack-base\/50<\/a> to your client system and extract it:<\/p>\n<pre>ubuntu@jujuclient$ sudo apt install unzip -y\nubuntu@jujuclient$ unzip openstack-base.zip<\/pre>\n<p>The following files will be extracted:<\/p>\n<ul>\n<li><em>bundle.yaml<\/em>: This file defines the modeling and placement of services across your OpenStack cluster<\/li>\n<li><em>neutron-ext-net<\/em>, <em>neutron-tenant-net<\/em>: scripts to help configure your OpenStack networks<\/li>\n<li><em>novarc<\/em>: script to setup your environment to use OpenStack<\/li>\n<\/ul>\n<p>Next, install the Juju client from the snap store to your client system:<\/p>\n<pre><span style=\"font-weight: 400;\">ubuntu@jujuclient$ sudo snap install juju --classic<\/span><\/pre>\n<p>Then, configure Juju to use your MAAS environment, as described <a href=\"https:\/\/jujucharms.com\/docs\/devel\/clouds-maas\">here<\/a>.<\/p>\n<p>After configuring Juju to use your MAAS cluster, run the following command Juju client system to instantiate a Juju controller node:<\/p>\n<pre>ubuntu@jujuclient$ juju bootstrap maas-cloud maas \\\n--bootstrap-constraints arch=arm64<\/pre>\n<p>Where \u201cmaas-cloud\u201d is the cloud name you asssigned in the \u201cConfigure Juju\u201d step. Juju will auto select a node from the MAAS cluster to be the Juju controller, and deploy the node. You can monitor this progress via the MAAS web interface and the console of the bootstrap node.<\/p>\n<p>Now, deploy the OpenStack bundle:<\/p>\n<ul>\n<li>Locate the <em>bundle.yaml<\/em> file from the <em>openstack-base.zip<\/em> tarball.<\/li>\n<li>Open the <em>bundle.yaml<\/em> file in a text editor, and locate the data-port setting for the neutron-gateway service.<\/li>\n<li>Change the data-port setting as appropriate for the systems in your MAAS cluster. This should be name of the connected NIC interface on your systems that is <em>not<\/em> configured by MAAS (see the diagram in the &#8220;Network Layout&#8221; section of this post). For example, if you have a cluster of systems like the one showed on the MAAS interfaces tab screenshot above,&nbsp; you would want to set data-port to either br-ex:enp1s0 or br-ex:enP4p1s0 (enaqcom8070i0 is the one configured by MAAS). For more information, see the \u201cPort Configuration\u201d section in the <a href=\"https:\/\/jujucharms.com\/neutron-gateway\/\">neutron-gateway charm docs<\/a>.<\/li>\n<li>Execute:<\/li>\n<\/ul>\n<pre>ubuntu@jujuclient$ juju deploy bundle.yaml<\/pre>\n<p>You can monitor the status of your deployment using the juju &#8220;status&#8221; command:<\/p>\n<pre>ubuntu@jujuclient$ juju status<\/pre>\n<p><em><strong>Note:<\/strong> The deployment is complete once juju status reports all units, other than ntp, as \u201cUnit is ready\u201d. (The ntp charm has not yet been updated to report status, so ntp units will not report a \u201cUnit is ready\u201d message).<\/em><br \/>\n<em> <strong>Note:<\/strong> You can also view a graphical representation of the deployment and it\u2019s status using the juju gui web interface<\/em>:<\/p>\n<pre>ubuntu@jujuclient$ juju gui\nGUI 2.10.2 for model \"admin\/default\" is enabled at:\n https:\/\/10.228.66.11:17070\/gui\/u\/admin\/default\nYour login credential is:\n username: admin\n password: d954cc41130218e590c62075de0851df<\/pre>\n<p>Troubleshooting Deployment<br \/>\nIf the neutron-gateway charm enters a \u201cfailed\u201d state, it maybe because you have entered an invalid interface for the data-port config setting. You can change this setting after deploying the bundle using the juju set-config command, and asking the unit to retry:<\/p>\n<pre>ubuntu@jujuclient$ juju config neutron-gateway data-port=br-ex:&lt;iface&gt;\nubuntu@jujuclient$ juju resolved neutron-gateway\/0<\/pre>\n<p>If the device name is not consistent between hosts, you can specify the same bridge multiple times with MAC addresses instead of interface names. The charm will loop through the list and configure the first matching interface. To do so, specify a list of macs using a space delimiter as seen in the example below:<\/p>\n<pre>ubuntu@jujuclient$ juju config neutron-gateway data-port=br-ex:&lt;MAC&gt; br-ex:&lt;MAC&gt; br-ex:&lt;MAC&gt; br-ex:&lt;MAC&gt;\nubuntu@jujuclient$ juju resolved neutron-gateway\/0<\/pre>\n<h2>Testing it Out<\/h2>\n<p>See the \u201cEnsure it\u2019s working\u201d section of the following document to complete a sample configuration and launch a test instance:<br \/>\n<a href=\"https:\/\/jujucharms.com\/u\/dannf\/openstack-base\">https:\/\/jujucharms.com\/u\/dannf\/openstack-base<\/a><\/p>\n<p>(^ This is a fork of the main charm docs w\/ some corrections pending merge).<\/p>\n<p>Finally, you can access the OpenStack web interface at:<br \/>\nhttp:\/\/&lt;ip of openstack-dashboard&gt;\/horizon<br \/>\nTo obtain the openstack-dashboard ip address, run:<\/p>\n<pre>ubuntu@jujuclient$ juju run --unit openstack-dashboard\/0 'unit-get public-address'<\/pre>\n<p>Login as user \u2018admin\u2019 with password \u2018openstack\u2019<\/p>\n<p>Many thanks to Sean Feole for helping draft this guide, and to Michael Reed &amp; Ike Pan for testing it out \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>At Canonical, we&#8217;ve been doing work to make sure Ubuntu OpenStack deploys on ARM servers as easily as on x86. Whether you have Qualcomm 2400 REP boards, Cavium ThunderX boards, HiSilicon D05 boards, or other Ubuntu&nbsp; Certified&nbsp;server hardware, you can go from bare metal to a working OpenStack in minutes! The following tutorial will walk [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,6,4],"tags":[],"class_list":["post-74","post","type-post","status-publish","format-standard","hentry","category-arm64","category-openstack","category-ubuntu"],"_links":{"self":[{"href":"https:\/\/bloggf.dannf.org\/index.php\/wp-json\/wp\/v2\/posts\/74","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bloggf.dannf.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bloggf.dannf.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bloggf.dannf.org\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bloggf.dannf.org\/index.php\/wp-json\/wp\/v2\/comments?post=74"}],"version-history":[{"count":14,"href":"https:\/\/bloggf.dannf.org\/index.php\/wp-json\/wp\/v2\/posts\/74\/revisions"}],"predecessor-version":[{"id":115,"href":"https:\/\/bloggf.dannf.org\/index.php\/wp-json\/wp\/v2\/posts\/74\/revisions\/115"}],"wp:attachment":[{"href":"https:\/\/bloggf.dannf.org\/index.php\/wp-json\/wp\/v2\/media?parent=74"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bloggf.dannf.org\/index.php\/wp-json\/wp\/v2\/categories?post=74"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bloggf.dannf.org\/index.php\/wp-json\/wp\/v2\/tags?post=74"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}