


 



<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://docwiki.cisco.com/w/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://docwiki.cisco.com/w/index.php?title=Special:Contributions/Shmcfarl&amp;feed=atom&amp;limit=50&amp;target=Shmcfarl&amp;year=&amp;month=</id>
		<title>DocWiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://docwiki.cisco.com/w/index.php?title=Special:Contributions/Shmcfarl&amp;feed=atom&amp;limit=50&amp;target=Shmcfarl&amp;year=&amp;month="/>
		<link rel="alternate" type="text/html" href="http://docwiki.cisco.com/wiki/Special:Contributions/Shmcfarl"/>
		<updated>2013-05-25T20:03:19Z</updated>
		<subtitle>From DocWiki</subtitle>
		<generator>MediaWiki 1.16.0</generator>

	<entry>
		<id>http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide</id>
		<title>COE Grizzly Release: High-Availability Manual Installation Guide</title>
		<link rel="alternate" type="text/html" href="http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide"/>
				<updated>2013-04-24T19:10:10Z</updated>
		
		<summary type="html">&lt;p&gt;Shmcfarl: /* Configuring OpenStack Networking (Quantum) and Deploying the First VM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
There are two common ways of installing [http://docs.openstack.org/ OpenStack], manually or by using automation tools. There is much focus on the full automation of OpenStack deployments using tools such as [http://puppetlabs.com/ Puppet], [http://www.opscode.com/chef/ Chef], [https://juju.ubuntu.com/ JuJu] and others. While these tools offer great advantages over manual configuration, they do hide the OpenStack installation and configuration details. This document can be used by those interested in learning more about the OpenStack Grizzly High-Availability (HA) installation process or for those not interested in using automation tools to deploy HA. The document covers the following OpenStack software components: &lt;br /&gt;
&lt;br /&gt;
*[http://glance.openstack.org/ Glance] (Image Service) &lt;br /&gt;
*[http://keystone.openstack.org/ Keystone] (Identity Service) &lt;br /&gt;
*[http://nova.openstack.org/ Nova] (Compute Service) &lt;br /&gt;
*[http://horizon.openstack.org/ Horizon] (OpenStack Dashboard Web User Interface) &lt;br /&gt;
*[http://docs.openstack.org/developer/quantum/ Quantum] (Network Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/cinder/ Cinder] (Block Storage Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/swift/ Swift] (Object Storage Service)&lt;br /&gt;
&lt;br /&gt;
== Dependencies  ==&lt;br /&gt;
&lt;br /&gt;
=== Critical Reminders  ===&lt;br /&gt;
&lt;br /&gt;
The most common OpenStack HA deployment issues are either incorrect configuration files or not deploying the nodes in the proper order. To save you from future troubleshooting steps, ENSURE that you deploy the nodes in the order described within the document and verify the accuracy of all configuration files. You will likely be using your own IP addressing and passwords in your setup and it is critical to ensure any variations from this guide are fully understood. &lt;br /&gt;
&lt;br /&gt;
Do not configure RAID on the hard disks of Swift Storage Nodes. Swift performs better without RAID and disk redundancy is unneeded since Swift protects the data through replication. Therefore, if a RAID Controller manages the hard disks, ensure you present each of the hard disks independently. Our example uses disk /dev/sda for the Operating System installation and disks /dev/sdb-/dev/sdf for Swift storage. Please remember to modify these definitions based on your specific deployment environment. Additional Swift considerations and tuning information can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/considerations-and-tuning.html here]. &lt;br /&gt;
&lt;br /&gt;
Compute Nodes run Cinder Volume to provide block storage services to Instances. The default Cinder driver (volume_driver=nova.volume.driver.ISCSIDriver) is an iSCSI solution that employs the use of Linux Logical Volume Manager (LVM). Therefore, you must create an LVM Volume Group either during the Ubuntu Precise installation or [http://docs.openstack.org/trunk/openstack-compute/admin/content/cinder-install.html afterwards]. The name of the LVM Volume Group must match the volume_group definition in cinder.conf. Our example uses the name nova-volumes for the LVM Volume Group and associated cinder.conf volume_group name. &lt;br /&gt;
&lt;br /&gt;
The password used in our examples is keystone_admin. Every account, service and configuration file uses this one password. You will want to change this in your setup and you certainly want to use a strong password and a different password for each account/service if this system is going into production.&lt;br /&gt;
&lt;br /&gt;
=== Operating System  ===&lt;br /&gt;
&lt;br /&gt;
The operating system used for this installation is Ubuntu 12.04 LTS (Precise). &lt;br /&gt;
&lt;br /&gt;
=== Server Requirements  ===&lt;br /&gt;
&lt;br /&gt;
Our deployment uses 13 Cisco UCS C-series servers to serve the roles of Controller, Compute, Load-Balancer and Swift Proxy/Storage. The environment scales linearly, therefore individual nodes can be added to increase capacity for any particular OpenStack service. The five distinct node types used in this document are: &lt;br /&gt;
&lt;br /&gt;
*'''3 Controller Nodes-'''&amp;amp;nbsp;Runs Nova API, Nova Conductor, Nova Consoleauth, Nova Novncproxy, Nova Scheduler, NoVNC, Quantum Server, Quantum Plugin OVS, Glance API/Registry, Keystone, Cinder API, Cinder Scheduler, OpenStack Dashboard, RabbitMQ Server, MySQL Server WSREP and Galera. &lt;br /&gt;
**Provides management functionality of the OpenStack environment.&lt;br /&gt;
&lt;br /&gt;
*'''3 Compute Nodes-'''&amp;amp;nbsp;Runs Nova Compute, Quantum OVS and DHCP Agents, Cinder Volume and TGT services. &lt;br /&gt;
**Provides the hypervisor role for running Nova instances (Virtual Machines) and presents LVM volumes for Cinder block storage.&lt;br /&gt;
&lt;br /&gt;
*'''2 Load-Balancer Nodes-'''&amp;amp;nbsp;Runs HAProxy and Keepalived to load-balance traffic across Controller and Swift Proxy clusters.&lt;br /&gt;
&lt;br /&gt;
*'''2 Swift Proxy Nodes-'''&amp;amp;nbsp;The Proxy Node is responsible for tying together users and their data within the the Swift object storage system. For each request, it will look up the location of the account, container or object in the Swift ring and route the request accordingly. The public API is also exposed by Proxy Node.&lt;br /&gt;
&lt;br /&gt;
*'''3 Swift Storage Nodes-'''&amp;amp;nbsp;Each Storage Nodes contains Swift object, container, and account services. At a very high-level, these are the servers that contain the user data and perform replication among one another to keep the system in a consistent state.&lt;br /&gt;
&lt;br /&gt;
=== Networking Requirements  ===&lt;br /&gt;
&lt;br /&gt;
The OpenStack HA environment uses five separate networks. Three of the five networks are used by Tenants. Three tenant networks are being used as an example, and thus the tenant networks can be increased or decreased based on your deployment needs. Connectivity within Tenants uses Quantum with the Open vSwitch (OVS) plugin and [http://docs.openstack.org/trunk/openstack-network/admin/content/provider_networks.html Provider Network Extensions]. Provider Network Extensions allow cloud administrators to create OpenStack networks that map directly to physical networks in the data center and support local, VLAN and GRE deployment models. Our example uses the Provider VLAN networking model. The network details are as follows: &lt;br /&gt;
&lt;br /&gt;
*'''1 Management Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used to perform management functions against the node. For example, SSH'ing to the nodes to change a configuration setting. The network is also used for lights-out management using the CIMC interface of the UCS servers. Lastly, OpenStack API's and the Horizon web dashboard is associated to this network. &lt;br /&gt;
**An IP address for each node is required for this network. If using lights-out management such as CIMC, each node will require 2 addresses from this network. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]). &lt;br /&gt;
*'''3 Tenant Networks'''&amp;lt;br&amp;gt; &lt;br /&gt;
**These networks are used to provide connectivity to Instances. Since Quantum Provider Networking Extensions are being used, it is common to give tenants direct access to a &amp;quot;public&amp;quot; network that can be used to reach the Internet. &lt;br /&gt;
**Compute Nodes will have an interface attached to this network. Since the Compute Node interfaces that attach to this network are managed by OVS, they should not contain an IP address. &lt;br /&gt;
**This network typically employs publicly routable IP addressing if external NAT'ing is not used upstream towards the Internet edge ('''Note:''' in this document all IP addressing for all interfaces comes out of various private addressing blocks). &lt;br /&gt;
*'''1 Storage Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used for providing separate connectivity between Swift Proxy and Storage Nodes. This ensures storage traffic is not interfering with Instance traffic. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]) IP addressing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''[http://docwiki.cisco.com/w/images/a/a8/Grizzly-ha-network-design-details-v1.0.png Figure 1]''' is used to help visualize the network deployment and to act as a reference for configuration steps within the document. It is highly recommend to print the diagram so it can easily be referenced throughout the installation process.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;u&amp;gt;'''Figure 1:'''&amp;lt;/u&amp;gt;'''OpenStack HA Network Design Details''' &lt;br /&gt;
&lt;br /&gt;
[[Image:Grizzly-ha-network-design-details-v1.0.png|thumb|left]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''Other Network Services'''&amp;lt;br&amp;gt; &lt;br /&gt;
**'''DNS: '''In this setup an external DNS server (192.168.26.186) is used for name resolution of OpenStack nodes and external name resolution. If DNS is not being used, the /etc/hosts file should include the following for all nodes:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 127.0.0.1	localhost&lt;br /&gt;
 192.168.220.40  control.dmz-pod2.lab		control&lt;br /&gt;
 192.168.220.41  control01.dmz-pod2.lab	        control01&lt;br /&gt;
 192.168.220.42  control02.dmz-pod2.lab  	control02&lt;br /&gt;
 192.168.220.43  control03.dmz-pod2.lab  	control03&lt;br /&gt;
 192.168.220.60  swiftproxy.dmz-pod2.lab	        swiftproxy&lt;br /&gt;
 192.168.220.61  swiftproxy01.dmz-pod2.lab	swiftproxy01&lt;br /&gt;
 192.168.220.62  swiftproxy02.dmz-pod2.lab	swiftproxy02&lt;br /&gt;
 192.168.220.51  compute01.dmz-pod2.lab          compute01&lt;br /&gt;
 192.168.220.52  compute02.dmz-pod2.lab          compute02&lt;br /&gt;
 192.168.220.53  compute03.dmz-pod2.lab          compute03&lt;br /&gt;
&lt;br /&gt;
*'''NTP: '''In this setup an external NTP server(s) is used for time synchronization. &lt;br /&gt;
*'''Physical Network Switches:''' Each node in this setup is physically attached to a Cisco Nexus switch acting as a Top-of-Rack access layer device. Trunking is configured on each interface connecting to the eth0 NIC of each node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Upstream routers/aggregation layer switches will most likely be terminating the Layer-3 VLAN interfaces. If these interfaces are deployed in a redundant fashion with a First Hop Redundancy Protocol such as HSRP or VRRP, then you should be careful of the IP addresses assigned to the physical L3 switches/routers as they may conflict with the IP address of the Quantum router's public subnet (.3 by default). For example, if you are using HSRP and you have .1 as the standby IP address, .2 as the first L3 switch IP and .3 as the second L3 switch IP, you will receive a duplicate IP address error on the second L3 switch. This can be worked around by using high-order IPs on your upstream L3 device or altering the Quantum subnet configuration at the time of creation to have an IP starting range higher than the physical switches/routers are using (i.e. .4 and higher). Our example uses an IP allocation range that starts with .10 to avoid this issue.&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
The installation of the nodes should be in the following order: &lt;br /&gt;
&lt;br /&gt;
#'''Load-Balancer Nodes-''' slb01 and slb02 &lt;br /&gt;
#'''Swift Storage Nodes-''' swift01, swift02 and swift03 &lt;br /&gt;
#'''Swift Proxy Nodes-''' swiftproxy01 and swiftproxy02 &lt;br /&gt;
#'''Controller Nodes-''' control01, control02 and control03 &lt;br /&gt;
#'''Compute Nodes- '''compute01, compute02 and compute03&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Nodes  ===&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu Precise 12.04 Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Ubuntu 12.04 (AMD 64-bit) from CD/ISO or automated install (i.e. kickstart). You can reference Section 4 in the [http://docwiki.cisco.com/wiki/OpenStack:Essex_Build_Node#Starting_the_Ubuntu_Installation Build Node Guide] if you are unfamiliar with the Ubuntu Precise installation process. Use the following networking section to configure your network adapter properties for each node. As previously mentioned in the Critical Reminders Section, make sure to create an LVM Volume Group named nova-volumes for Compute Nodes and do not configure RAID for Swift Storage Nodes. Lastly, select ssh-server as the only additional package during the Ubuntu Precise installation. &lt;br /&gt;
&lt;br /&gt;
==== Grizzly Packages  ====&lt;br /&gt;
&lt;br /&gt;
Canonical’s [https://wiki.ubuntu.com/ServerTeam/CloudArchive Ubuntu Cloud Archive] allows users the ability to install newer releases of OpenStack (and dependencies) on Ubuntu Server 12.04 LTS as they become available up through the next Ubuntu LTS release. Canonical commits to maintaining and supporting new OpenStack releases for [http://releases.ubuntu.com/precise/ Ubuntu Server 12.04 LTS] in the Ubuntu Cloud archive for at least 18 months after they release. The Ubuntu Cloud Archive should be used for all OpenStack nodes (i.e. not needed for Load-Balancer nodes). &lt;br /&gt;
&lt;br /&gt;
Use sudo mode or run from root account for the entire installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the cloud archive gpg key into your ubuntu-keyring: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install ubuntu-cloud-keyring&amp;lt;/pre&amp;gt; &lt;br /&gt;
Enable the Ubuntu Cloud Archive repository by adding the following to /etc/apt/sources.list.d/grizzly.list: &lt;br /&gt;
&amp;lt;pre&amp;gt;deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/grizzly main&amp;lt;/pre&amp;gt; &lt;br /&gt;
Update your system: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get update&lt;br /&gt;
apt-get upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Networking  ====&lt;br /&gt;
&lt;br /&gt;
Our implementation uses VLANs for segmentation of certain networks. Make sure the VLAN package is installed and your network switches have been configured for VLANs. Otherwise, replicate the network setup using only physical interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install vlan -y&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.81&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.82&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Proxy Node swiftproxy01 /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Proxy Node swiftproxy02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.62&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.62&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.41&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.42&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.43&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.51&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.52&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.53&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart networking: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/networking restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Time Synchronization  ====&lt;br /&gt;
&lt;br /&gt;
Install NTP: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y ntp&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add your NTP server(s) by editing /etc/ntp.conf. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; OpenStack requires that clocks be synchronized. Our example uses a '''FAKE '''server called ntp.corp.com as the NTP server. Make sure you change&amp;amp;nbsp;ntp.corp.com to your real NTP server. Lastly, make sure the NTP server name resolves. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/ntp.conf&lt;br /&gt;
&lt;br /&gt;
server ntp.corp.com&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart NTP for the changes to take effect &lt;br /&gt;
&amp;lt;pre&amp;gt;service ntp restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that you are pulling time: &lt;br /&gt;
&amp;lt;pre&amp;gt;ntpq -p&lt;br /&gt;
&lt;br /&gt;
remote           refid      st t when poll reach   delay   offset  jitter&lt;br /&gt;
==============================================================================&lt;br /&gt;
*ntp.corp.       .GPS.            1 u  185  512  377   76.035    0.053   0.033&lt;br /&gt;
 cheezum.mattnor 129.7.1.66       2 u   8d 1024    0   47.731   -0.555   0.000&lt;br /&gt;
 ntp2.rescomp.be .STEP.          16 u    - 1024    0    0.000    0.000   0.000&lt;br /&gt;
 216.45.57.38    204.123.2.5      2 u  54h 1024    0   12.607    0.808   0.000&lt;br /&gt;
 lithium.constan 128.4.1.1        2 u   8d 1024    0   69.861    0.206   0.000&lt;br /&gt;
 europium.canoni 193.79.237.14    2 u  54h 1024    0  144.040   -1.455   0.000&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load Balancer Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Perform the following steps on nodes slb01 and slb02. &lt;br /&gt;
&lt;br /&gt;
==== Keepalived &amp;amp;amp; HAProxy  ====&lt;br /&gt;
&lt;br /&gt;
Edit /etc/sysctl.conf to allow Keepalived to associate a virtual IP address (VIP) that is not directly bound to an interface on the node:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;net.ipv4.ip_nonlocal_bind=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load in sysctl settings from /etc/sysctl.conf: &lt;br /&gt;
&amp;lt;pre&amp;gt;sysctl -p&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install Keepalived and HAProxy packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keepalived haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the /var/lib/haproxy directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /var/lib/haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure /var/lib/haproxy is owned by root. Change the file ownership if needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /var/lib/haproxy/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the&amp;amp;nbsp;/etc/keepalived/keepalived.conf file for slb01 with the contents below.&amp;amp;nbsp; Change&amp;amp;nbsp;[YOUR_DOMAIN_NAME] with your actual domain name.&amp;amp;nbsp; The keepalived.conf includes the following sections:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global_defs-''' Global parameters affect the whole process behavior.&amp;amp;nbsp;There may be several 'global' sections if needed, but their parameters will only be merged. &amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_script-''' Keepalived supports a VRRP scripting framework to extend base functionality.&amp;amp;nbsp; The vrrp_script named haproxy will check the status of the haproxy service every 2 seconds and add 2 points of priority if the status is running. &amp;amp;nbsp;If the haproxy service is not running, the backup HAProxy Node will become the primary and begin passing traffic for the virtual_ipaddress(es).&amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_instance-''' Is where you define configuration paramters for virtual gateway addresses.&amp;amp;nbsp; slb01 is configured as the primary gateway for 192.168.220.40 (Controller Cluster) and the backup gateway for 192.168.220.60 (Swift Proxy Cluster). Accordingly, slb02 is configured as the primary for 192.168.220.60 and the backup for 192.168.220.40.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb01&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure /etc/keepalived/keepalived.conf for slb02 with the following contents. Change [YOUR_DOMAIN_NAME] with your actual domain name. &lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb02&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb01 with the contents below. HAProxy's configuration process involves 3 major sources of parameters:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*The arguments from the command-line, which always take precedence.&amp;lt;br&amp;gt; &lt;br /&gt;
*The &amp;quot;global&amp;quot; section, which sets process-wide parameters.&amp;lt;br&amp;gt; &lt;br /&gt;
*The proxies sections which can take form of &amp;quot;defaults&amp;quot;, &amp;quot;listen&amp;quot;, &amp;quot;frontend&amp;quot; and &amp;quot;backend&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following provides additional details of the haproxy.cfg file:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global-&amp;amp;nbsp; '''Sets process-wide parameters for load-balancing traffic.&amp;amp;nbsp; Global parameters can be overriden by server-specific configurations within the''listen section ''of the haproxy.cfg file.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''defaults-''' The &amp;quot;defaults&amp;quot; section sets default parameters for all other sections following its declaration. Those default parameters are reset by the next &amp;quot;defaults&amp;quot; section. The name is optional but its use is encouraged for better readability.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''listen-''' A &amp;quot;listen&amp;quot; section defines a complete proxy with its front-end (i.e. listening VIP) and back-end (i.e. real IP of servers)&amp;amp;nbsp;parts combined in one section. Currently two major proxy modes are supported: &amp;quot;tcp&amp;quot;, also known as layer 4 and &amp;quot;http&amp;quot;, also known as layer 7. In layer 4 mode, HAProxy simply forwards bidirectional traffic between two sides. In layer 7 mode, HAProxy analyzes the protocol and can interact with it by allowing, blocking, switching, adding, modifying, or removing arbitrary content in requests or responses based on configurable criteria.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
 chroot  /var/lib/haproxy&lt;br /&gt;
 daemon  &lt;br /&gt;
 group  haproxy&lt;br /&gt;
 log  192.168.220.81 local0&lt;br /&gt;
 maxconn  4000&lt;br /&gt;
 pidfile  /var/run/haproxy.pid&lt;br /&gt;
 user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
 log  global&lt;br /&gt;
 maxconn  8000&lt;br /&gt;
 option  redispatch&lt;br /&gt;
 retries  3&lt;br /&gt;
 timeout  http-request 10s&lt;br /&gt;
 timeout  queue 1m&lt;br /&gt;
 timeout  connect 10s&lt;br /&gt;
 timeout  client 1m&lt;br /&gt;
 timeout  server 1m&lt;br /&gt;
 timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
 bind 192.168.220.40:80&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
 bind 192.168.220.40:3306&lt;br /&gt;
 balance  source&lt;br /&gt;
 mode  tcp&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9292&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
 bind 192.168.220.40:9191&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
 bind 192.168.220.40:35357&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
 bind 192.168.220.40:5000&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
 bind 192.168.220.40:11211&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
 bind 192.168.220.40:8773&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
 bind 192.168.220.40:8774&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
 bind 192.168.220.40:8775&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
 bind 192.168.220.40:8776&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
 bind 192.168.220.40:6080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9696&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
 bind 192.168.220.60:8080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb02 with the contents below. &lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
  chroot  /var/lib/haproxy&lt;br /&gt;
  daemon  &lt;br /&gt;
  group  haproxy&lt;br /&gt;
  log  192.168.220.82 local0&lt;br /&gt;
  maxconn  4000&lt;br /&gt;
  pidfile  /var/run/haproxy.pid&lt;br /&gt;
  user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
  log  global&lt;br /&gt;
  maxconn  8000&lt;br /&gt;
  option  redispatch&lt;br /&gt;
  retries  3&lt;br /&gt;
  timeout  http-request 10s&lt;br /&gt;
  timeout  queue 1m&lt;br /&gt;
  timeout  connect 10s&lt;br /&gt;
  timeout  client 1m&lt;br /&gt;
  timeout  server 1m&lt;br /&gt;
  timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
  bind 192.168.220.40:80&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
  bind 192.168.220.40:3306&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9292&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
  bind 192.168.220.40:9191&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
  bind 192.168.220.40:35357&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
  bind 192.168.220.40:5000&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
  bind 192.168.220.40:11211&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
  bind 192.168.220.40:8773&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
  bind 192.168.220.40:8774&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
  bind 192.168.220.40:8775&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
  bind 192.168.220.40:8776&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
  bind 192.168.220.40:6080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9696&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
  bind 192.168.220.60:8080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set &amp;quot;ENABLED&amp;quot; to &amp;quot;1&amp;quot; in /etc/default/haproxy &lt;br /&gt;
&amp;lt;pre&amp;gt;ENABLED=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keepalived and HAProxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/keepalived restart&lt;br /&gt;
/etc/init.d/haproxy restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Swift Nodes&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Install Swift and other basic packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift openssh-server rsync memcached python-netifaces python-xattr python-memcache &amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir -p /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration file. '''Note:''' This file should be identical on all Swift nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/swift.conf&lt;br /&gt;
&lt;br /&gt;
[swift-hash]&lt;br /&gt;
swift_hash_path_suffix = Gdr8ny7YyWqy2&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the Swift directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Storage Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Run these commands on nodes swift01, swift02 and swift03. Install the Swift Storage Node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-account swift-container swift-object xfsprogs parted&amp;lt;/pre&amp;gt; &lt;br /&gt;
For each of the hard disks other than the Ubuntu installation disk (i.e. /dev/sda), create an XFS volume with a single partition. Our example uses five hard disks (/dev/sdb - /dev/sdf) per Storage Node. Repeat this step for each disk that will be used for Swift storage: &lt;br /&gt;
&amp;lt;pre&amp;gt;parted /dev/sdb mklabel msdos&lt;br /&gt;
parted -a optimal /dev/sdb mkpart primary ext2 0% 100%&lt;br /&gt;
mkfs.xfs -i size=1024 /dev/sdb1&lt;br /&gt;
echo &amp;quot;/dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0&amp;quot; &amp;amp;gt;&amp;amp;gt; /etc/fstab&lt;br /&gt;
mkdir -p /srv/node/sdb1&lt;br /&gt;
mount /srv/node/sdb1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the mount directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /srv/node&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create an Rsync configuration file on each Storage Node. In the following example, replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/rsyncd.conf&lt;br /&gt;
&lt;br /&gt;
uid = swift&lt;br /&gt;
gid = swift&lt;br /&gt;
log file = /var/log/rsyncd.log&lt;br /&gt;
pid file = /var/run/rsyncd.pid&lt;br /&gt;
address = [STORAGE_NET_IP]&lt;br /&gt;
&lt;br /&gt;
[account]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/account.lock&lt;br /&gt;
&lt;br /&gt;
[container]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/container.lock&lt;br /&gt;
&lt;br /&gt;
[object]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/object.lock&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following line in /etc/default/rsync: &lt;br /&gt;
&amp;lt;pre&amp;gt;RSYNC_ENABLE = true&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start rsync daemon: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rsync start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/account-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/account-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = account-server&lt;br /&gt;
&lt;br /&gt;
[app:account-server]&lt;br /&gt;
use = egg:swift#account&lt;br /&gt;
&lt;br /&gt;
[account-replicator]&lt;br /&gt;
&lt;br /&gt;
[account-auditor]&lt;br /&gt;
&lt;br /&gt;
[account-reaper]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/container-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/container-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = container-server&lt;br /&gt;
&lt;br /&gt;
[app:container-server]&lt;br /&gt;
use = egg:swift#container&lt;br /&gt;
&lt;br /&gt;
[container-replicator]&lt;br /&gt;
&lt;br /&gt;
[container-updater]&lt;br /&gt;
&lt;br /&gt;
[container-auditor]&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Create /etc/swift/object-server.conf&amp;amp;nbsp;with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71):&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/object-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = object-server&lt;br /&gt;
&lt;br /&gt;
[app:object-server]&lt;br /&gt;
use = egg:swift#object&lt;br /&gt;
&lt;br /&gt;
[object-replicator]&lt;br /&gt;
&lt;br /&gt;
[object-updater]&lt;br /&gt;
&lt;br /&gt;
[object-auditor]&lt;br /&gt;
&lt;br /&gt;
[object-expirer]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the storage services. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; At this point, the ring files will not be present on the storage nodes. This will cause the *-replicator services to fail to start properly. After you create the ring files on the first proxy node (in the next section) and distribute them to the storage nodes, a service restart should allow all Swift services to start properly. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init object-server start&lt;br /&gt;
swift-init object-replicator start&lt;br /&gt;
swift-init object-updater start&lt;br /&gt;
swift-init object-auditor start&lt;br /&gt;
swift-init container-server start&lt;br /&gt;
swift-init container-replicator start&lt;br /&gt;
swift-init container-updater start&lt;br /&gt;
swift-init container-auditor start&lt;br /&gt;
swift-init account-server start&lt;br /&gt;
swift-init account-replicator start&lt;br /&gt;
swift-init account-auditor start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height: 1.5em;&amp;quot;&amp;gt;Make sure you repeat these steps for every Storage Node.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Proxy Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Ensure you have completed the previous steps in the &amp;quot;General Installation Steps for All Swift Nodes&amp;quot; section. &lt;br /&gt;
&lt;br /&gt;
Perform these steps on nodes swiftproxy01 and swiftproxy02. First, install the proxy node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-proxy memcached python-keystoneclient python-swiftclient swift-plugin-s3&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify memcached to bind to the storage network interface (192.168.222.x in our example). Edit the following line in /etc/memcached.conf, changing: &lt;br /&gt;
&amp;lt;pre&amp;gt;-l 127.0.0.1 &lt;br /&gt;
to&lt;br /&gt;
-l [STORAGE_NET_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the memcached server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
If it does not exist, create the /etc/swift/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /etc/swift/&amp;lt;/pre&amp;gt; &lt;br /&gt;
If /etc/swift and /var/cache/swift directories are not owned by the swift user and group, then change the ownership of the directories: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift/&lt;br /&gt;
chown -R swift:swift /var/cache/swift/&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create /etc/swift/proxy-server.conf with the following contents: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_port = 8080&lt;br /&gt;
workers = 32&lt;br /&gt;
user = swift&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = catch_errors healthcheck cache ratelimit authtoken keystoneauth proxy-server&lt;br /&gt;
&lt;br /&gt;
[app:proxy-server]&lt;br /&gt;
use = egg:swift#proxy&lt;br /&gt;
allow_account_management = true&lt;br /&gt;
account_autocreate = true&lt;br /&gt;
&lt;br /&gt;
[filter:keystoneauth]&lt;br /&gt;
use = egg:swift#keystoneauth&lt;br /&gt;
operator_roles = Member,admin, swiftoperator&lt;br /&gt;
&lt;br /&gt;
[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
signing_dir = /var/cache/swift&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
auth_uri = http://192.168.220.40:5000&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = swift&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
delay_auth_decision = 10&lt;br /&gt;
&lt;br /&gt;
[filter:cache]&lt;br /&gt;
use = egg:swift#memcache&lt;br /&gt;
memcache_servers = 192.168.222.61:11211,192.168.222.62:11211&lt;br /&gt;
&lt;br /&gt;
[filter:catch_errors]&lt;br /&gt;
use = egg:swift#catch_errors&lt;br /&gt;
&lt;br /&gt;
[filter:healthcheck]&lt;br /&gt;
use = egg:swift#healthcheck&lt;br /&gt;
&lt;br /&gt;
[filter:ratelimit]&lt;br /&gt;
use = egg:swift#ratelimit&lt;br /&gt;
clock_accuracy = 1000&lt;br /&gt;
max_sleep_time_seconds = 60&lt;br /&gt;
log_sleep_time_seconds = 0&lt;br /&gt;
rate_buffer_seconds = 5&lt;br /&gt;
account_ratelimit = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, create the account, container and object rings. The builder command is basically creating a builder file with a few parameters. The parameter with the value of 18 represents 2 ^ 18th, this is the value of the partition size. Set this “partition power” value based on the total amount of storage you expect your entire ring to use. The value of 3 represents the number of replicas of each object, with the last value being the number of hours to restrict moving a partition more than once. Additional information regarding Swift ring preperation can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/preparing-the-ring.html here]. &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/swift&lt;br /&gt;
&lt;br /&gt;
swift-ring-builder account.builder create 18 3 1&lt;br /&gt;
swift-ring-builder container.builder create 18 3 1&lt;br /&gt;
swift-ring-builder object.builder create 18 3 1&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, for every storage device on each storage node add entries to each ring. This example prepares the account, container and object rings for storage node swift01 (192.168.222.71) with a partition in zone 1. The mount point of this partition is /srv/node/sdb1 and the path in rsyncd.conf is /srv/node/, the DEVICE would be sdb1 and the commands would look like: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder add z1-192.168.222.71:6002/sdb1 100&lt;br /&gt;
swift-ring-builder container.builder add z1-192.168.222.71:6001/sdb1 100&lt;br /&gt;
swift-ring-builder object.builder add z1-192.168.222.71:6000/sdb1 100&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Make sure not to place all devices in the same zone (i.e. z1). It is recommended to configure the zones as high-level as possible to create the greatest amount of isolation. Some considerations can include physical location, power availability, and network connectivity. For example, in a small cluster you might decide to split the zones up by cabinet, with each cabinet having its own power and network connectivity. Since our deployment only uses 3 storage nodes, each node should be in its own zone. However, it is recommended to have a minimum of 5 zones in a production-level Swift deployment. &lt;br /&gt;
&lt;br /&gt;
Verify the ring contents for each ring: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
swift-ring-builder /etc/swift/container.builder&lt;br /&gt;
swift-ring-builder /etc/swift/object.builder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Your output should look similar to this: &lt;br /&gt;
&amp;lt;pre&amp;gt;root@swiftproxy01:~# swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
/etc/swift/account.builder, build version 15&lt;br /&gt;
262144 partitions, 3 replicas, 3 zones, 15 devices, 0.00 balance&lt;br /&gt;
The minimum number of hours before a partition can be reassigned is 1&lt;br /&gt;
Devices:    id  zone      ip address  port      name weight partitions balance meta&lt;br /&gt;
             0     3  192.168.222.73  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
             1     2  192.168.222.72  6002      sdd1   1.00      52429    0.00 &lt;br /&gt;
             2     3  192.168.222.73  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             3     2  192.168.222.72  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             4     3  192.168.222.73  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             5     1  192.168.222.71  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             6     1  192.168.222.71  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             7     2  192.168.222.72  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
             8     1  192.168.222.71  6002      sdd1   1.00      52428   -0.00 &lt;br /&gt;
             9     2  192.168.222.72  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
            10     1  192.168.222.71  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
            11     1  192.168.222.71  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            12     3  192.168.222.73  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            13     2  192.168.222.72  6002      sde1   1.00      52428   -0.00 &lt;br /&gt;
            14     3  192.168.222.73  6002      sdd1   1.00      52428   -0.00&amp;lt;/pre&amp;gt; &lt;br /&gt;
Rebalance the rings. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Rebalancing rings can take a while. You may get a message about a balance value and that you need to rebalance/push after the minimum 1 hour. If so, recheck the status after an hour. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder rebalance&lt;br /&gt;
swift-ring-builder container.builder rebalance&lt;br /&gt;
swift-ring-builder object.builder rebalance&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the account.ring.gz, container.ring.gz, and object.ring.gz files to swiftproxy02 and the 3 storage nodes in /etc/swift. &lt;br /&gt;
&lt;br /&gt;
Make sure all the config files are owned by the swift user: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Proxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init proxy start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verify the Swift Installation  ===&lt;br /&gt;
&lt;br /&gt;
You can run verification commands from the proxy server or any server with access to Keystone. Keep in mind that proxy nodes are configured to use Keystone for user authentication. As a result, you '''MUST''' complete the Controller Node Installation steps and ensure Keystone is operational before proceeding with Swift verification. &lt;br /&gt;
&lt;br /&gt;
Verify that you can successfully authenticate against Keystone using the Swift authentication credentials: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y curl&lt;br /&gt;
&lt;br /&gt;
curl -s -d &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should receive output similar to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;access&amp;quot;: {&amp;quot;token&amp;quot;: {&amp;quot;issued_at&amp;quot;: &amp;quot;2013-04-02T14:55:31.149327&amp;quot;, &amp;quot;expires&amp;quot;: &amp;quot;2013-04-03T14:55:31Z&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;bb29ef5439ce4a75bf85332bbadf6538&amp;quot;, &amp;quot;tenant&amp;quot;: {&amp;quot;description&amp;quot;: &lt;br /&gt;
null, &amp;quot;enabled&amp;quot;: true, &amp;quot;id&amp;quot;: &amp;quot;b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;services&amp;quot;}}, &amp;quot;serviceCatalog&amp;quot;: [{&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;45a336cb74e04e11ab95c0ea28b699d6&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;compute&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;nova&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;259fef5e66814f47ac1934d3cf522a3d&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;network&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;quantum&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [&lt;br /&gt;
{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;166de3790eb54c31a58237fe9ea3d301&amp;quot;, &lt;br /&gt;
&amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;image&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;glance&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;0a2c69157d5948a9ae8ecee5c65a6d2b&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;volume&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;cinder&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Admin&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &lt;br /&gt;
&amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;05f85b8aacbd4c87b680dcc2fb6da539&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;}], &lt;br /&gt;
&amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;ec2&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;ec2&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.60:8080/v1&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;4a1af526137341c0a682eb573101ddde&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;object-store&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;3e3f7b50b5bd44b7a15b3e4ae55086bf&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;identity&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;keystone&amp;quot;}], &amp;quot;user&amp;quot;: {&amp;quot;username&amp;quot;: &amp;quot;swift&amp;quot;, &amp;quot;roles_links&amp;quot;: [], &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;ed69664ac78a4b65a36d63da6b760863&amp;quot;, &amp;quot;roles&amp;quot;: [{&amp;quot;name&amp;quot;: &amp;quot;_member_&amp;quot;}, {&amp;quot;name&amp;quot;: &amp;quot;admin&amp;quot;}], &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, &amp;quot;metadata&amp;quot;: {&amp;quot;is_admin&amp;quot;: 0, &amp;quot;roles&amp;quot;: [&lt;br /&gt;
&amp;quot;9fe2ff9ee4384b1894a90878d3e92bab&amp;quot;, &amp;quot;6a553ae3be3c4f8c8fe079830d4102a5&amp;quot;]}}}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Use the swift client stat command to make sure you can view the contents of the ring.&amp;amp;nbsp;You can run these commands from the proxy server or any server with the swift client and access to Keystone. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U admin:admin -K keystone_admin stat&lt;br /&gt;
   Account: AUTH_3eccdb2a9331419c96ac9ff336110b65&lt;br /&gt;
Containers: 1&lt;br /&gt;
   Objects: 2&lt;br /&gt;
     Bytes: 0&lt;br /&gt;
Accept-Ranges: bytes&lt;br /&gt;
X-Timestamp: 1363989109.30329&lt;br /&gt;
X-Trans-Id: tx147dd9983ac54af1b71c5a561ae2aa9a&lt;br /&gt;
Content-Type: text/plain; charset=utf-8&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can see that 1 container exists. &amp;amp;nbsp;Now, lets find out the name of the container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list&lt;br /&gt;
glance&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The glance container is created after the Controller cluster is built and an image has been uploaded to Glance. &lt;br /&gt;
&lt;br /&gt;
List the contents of the Glance container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list glance&lt;br /&gt;
24164630-ba2f-436a-8bc6-43975717d5e5&lt;br /&gt;
858a11dc-ed61-4a18-a778-eabcb454ae45&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Controller Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Runs these commands on nodes control01, control02 and control03. &amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install MySQL and Galera dependencies: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y libaio1 libssl0.9.8 mysql-client-5.5 python-mysqldb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download MySQL-WSREP and Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget -O /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb http://launchpad.net/codership-mysql/5.5/5.5.23-23.6/+download/mysql-server-wsrep-5.5.23-23.6-amd64.deb --no-check-certificate&lt;br /&gt;
wget -O /tmp/galera-23.2.1-amd64.deb http://launchpad.net/galera/2.x/23.2.1/+download/galera-23.2.1-amd64.deb --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install MySQL and Galera. '''Note:''' If you are prompted to create a root password during the Galera package installation, please make note of the password you use as it will be needed when connecting to MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;dpkg -i /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb&lt;br /&gt;
dpkg -i /tmp/galera-23.2.1-amd64.deb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the MySQL bind address: &lt;br /&gt;
&amp;lt;pre&amp;gt;sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the following line to /etc/rc.local on all controllers to allow MySQL to start automatically upon reboot: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.41&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.42&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.43&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt;It is important to understand the [http://www.codership.com/wiki/doku.php?id=mysql_options_0.8 gcomm address] concept behind [http://www.codership.com/ Galera]. Only use an empty gcomm:// address when you create a NEW cluster. Never use it when your intention is to reconnect to an existing one. After the Galera cluster is established, you should change the gcomm address on control01 from gcomm:// to gcomm://192.168.220.42 or gcomm://192.168.220.43. Otherwise, control01 will not join the cluster upon reboot. Make sure to also restart the mysql service when making changes to any of the associated configuration files. &lt;br /&gt;
&lt;br /&gt;
Restart MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the Galera cluster has been established. The value should show 4 for all nodes in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | Variable_name      | Value |&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | wsrep_local_state  |    4  |&lt;br /&gt;
  +------------------------+---+&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Monitoring  ====&lt;br /&gt;
Complete each of the steps below on each control node except for when a single node is specified.&lt;br /&gt;
&lt;br /&gt;
Install xinetd: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y xinetd&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the mysqlchk service: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/mysqlchk -P /etc/xinetd.d/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' After functional testing is complete, it's recommended to secure the mysqlchk service. This can be accomplished by editing the only_from and per_source values in /etc/xinetd.d/ to the subnet used by the load-balancer nodes. &lt;br /&gt;
&lt;br /&gt;
Edit /etc/xinetd.d/mysqlchk by changing &amp;amp;lt;%= mysqlchk_script_dir&amp;amp;nbsp;%&amp;amp;gt;/galera_chk to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure root is the file owner: &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
If not, change the file permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the mysqlcheck service to /etc/services by adding the following line: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysqlchk        9200/tcp                        # MySQL Galera health check script&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the MySQL Galera health check script: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/galera_chk -P /usr/local/bin/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the file ownership and permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /usr/local/bin/galera_chk &lt;br /&gt;
chmod +x  /usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /usr/local/bin/galera_chk as follows. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41). &lt;br /&gt;
&amp;lt;pre&amp;gt;MYSQL_HOST=&amp;quot;[CONTROLLER_MGT_IP]&amp;quot;&lt;br /&gt;
MYSQL_PORT=&amp;quot;3306&amp;quot;&lt;br /&gt;
MYSQL_USERNAME=&amp;quot;mysqlchk_user&amp;quot;&lt;br /&gt;
MYSQL_PASSWORD=&amp;quot;mysqlchk_password&amp;quot;&lt;br /&gt;
MYSQL_OPTS=&amp;quot;-N -q -A&amp;quot;&lt;br /&gt;
TMP_FILE=&amp;quot;/dev/shm/mysqlchk.$$.out&amp;quot;&lt;br /&gt;
ERR_FILE=&amp;quot;/dev/shm/mysqlchk.$$.err&amp;quot;&lt;br /&gt;
FORCE_FAIL=&amp;quot;/dev/shm/proxyoff&amp;quot;&lt;br /&gt;
MYSQL_BIN=&amp;quot;/usr/bin/mysql&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart xinetsd: &lt;br /&gt;
&amp;lt;pre&amp;gt;service xinetd restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Connect to MySQL and add the mysqlchk user to each controller in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
use mysql;&lt;br /&gt;
INSERT INTO user (Host,User,Password) VALUES('%','mysqlchk_user',PASSWORD('mysqlchk_password'));&lt;br /&gt;
flush privileges;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Grant privileges for the mysqlchk user. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41).: &lt;br /&gt;
&amp;lt;pre&amp;gt;grant SUPER,PROCESS on *.* to 'mysqlchk_user'@'[CONTROLLER_MGT_IP]' IDENTIFIED BY 'mysqlchk_password';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the operational status of the MySQL Galera health check service. From slb01 or slb02, Telnet using port 9200 (health check port) and make sure you get a &amp;quot;MySQL is running&amp;quot; message: &lt;br /&gt;
&amp;lt;pre&amp;gt;telnet 192.168.220.41 9200&lt;br /&gt;
Trying 192.168.220.41...&lt;br /&gt;
Connected to 192.168.220.41.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Content-Type: text/html&lt;br /&gt;
Content-Length: 43&lt;br /&gt;
&amp;amp;lt;html&amp;amp;gt;&amp;amp;lt;body&amp;amp;gt;MySQL is running.&amp;amp;lt;/body&amp;amp;gt;&amp;amp;lt;/html&amp;amp;gt;&lt;br /&gt;
Connection closed by foreign host.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Repeat the previous step for each control node. &lt;br /&gt;
&lt;br /&gt;
Verify that you can access the MySQL database by using the Virtual IP address (VIP) of the Galera cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -umysqlchk_user -pmysqlchk_password -h192.168.220.40&amp;lt;/pre&amp;gt; &lt;br /&gt;
For informational purposes, this is the command used by the health check script. This example is for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql -N -q -A --host=192.168.220.41 --user=mysqlchk_user --password=mysqlchk_password -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RabbitMQ Installation  ====&lt;br /&gt;
Complete each of the following steps on each control node unless a specific node is called out.&lt;br /&gt;
&lt;br /&gt;
Install RabbitMQ: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y rabbitmq-server&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure RabbitMQ Clustering. First, stop the service and remove the mnesia database on all control nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server stop&lt;br /&gt;
rm -rf /var/lib/rabbitmq/mnesia&amp;lt;/pre&amp;gt; &lt;br /&gt;
Clustering requires that the nodes have the same Erlang cookie. Copy the Erlang cookie from control01 to control02 and control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.42:/var/lib/rabbitmq/.erlang.cookie&lt;br /&gt;
scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.43:/var/lib/rabbitmq/.erlang.cookie&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The above command requires root login (disabled by default in Ubuntu). If you do not have root permissions, copy the Erlang cookie from /var/lib/rabbitmq/ to the /tmp directory of control02 and control03 and then to /var/lib/rabbitmq/. Also, make sure the file permissions match on all 3 nodes. &lt;br /&gt;
&lt;br /&gt;
Now that all 3 control nodes have the same Erlang cookie, make sure that RabbitMQ will start: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server start&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' If RabbitMQ does not successfully start, do not proceed with clustering.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Clustering can be configured using rabbitmqctl commands or by modifying the RabbitMQ configuration file. Our example uses the rabbitmqctl commands since issues were experienced using the configuration file with RabbitMQ 2.7.1. You can see both approaches to configuring RabbitMQ clustering [http://www.rabbitmq.com/clustering.html#setup here]. &lt;br /&gt;
&lt;br /&gt;
In order to cluster the three control nodes, two of the nodes (i.e. rabbit@control2 and rabbit@control03) will be configured to join the cluster of the third node (rabbit@control01). '''Note:''' Joining a cluster implicitly resets the node, thus removing all resources and data that were previously present on that node. &lt;br /&gt;
&lt;br /&gt;
From control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control02 is now clustered with control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control02 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
From control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control03 is now clustered with control01 and control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control03 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02,rabbit@control03]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02,rabbit@control03]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Now that clustering is complete, secure RabbitMQ by removing the default (guest) user: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl delete_user guest&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a RabbitMQ user account that will be used by OpenStack services: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl add_user openstack_rabbit_user openstack_rabbit_password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the permissions for the new RabbitMQ user account: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl set_permissions -p / openstack_rabbit_user &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the user settings: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl list_users&lt;br /&gt;
rabbitmqctl list_user_permissions openstack_rabbit_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keystone Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Keystone on every control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keystone python-keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Remove the sqllite db: &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/keystone/keystone.db&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Keystone. The database needs to be created on only 1 control node. &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE keystone;&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'%' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'localhost' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' From other controllers in the cluster, you can see that databases are replicated by Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show databases;&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/keystone/keystone.conf file on each controller. Change [CONTROLLER_MGT_IP] to the management IP address of the control node (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
admin_token = keystone_admin_token&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
&lt;br /&gt;
[sql]&lt;br /&gt;
connection = mysql://keystone_admin:keystone_db_pass@192.168.220.40/keystone&lt;br /&gt;
&lt;br /&gt;
[ssl]&lt;br /&gt;
enable = False&lt;br /&gt;
&lt;br /&gt;
[signing]&lt;br /&gt;
token_format = UUID&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a credential file and load it so credentials are not required for every OpenStack client command. '''Note:''' This needs to be created on each node that you will run OpenStack commands from: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that MySQL is listening on the VIP for the Keystone database. If you have any problems connecting to the VIP, try the real IP address of a control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -h192.168.220.40 -ukeystone_admin -pkeystone_db_pass keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keystone: &lt;br /&gt;
&amp;lt;pre&amp;gt;service keystone restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh Keystone data script](Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;ADMIN_PASSWORD=${ADMIN_PASSWORD:-keystone_admin}&lt;br /&gt;
export SERVICE_TOKEN=&amp;quot;keystone_admin_token&amp;quot;&lt;br /&gt;
export SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0/&amp;quot;&lt;br /&gt;
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-services}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with data (users, tenants, services). '''Note:''' If you see a long timeout and errors about &amp;quot;connection timeout&amp;quot;, it may be related to your proxy setting. Remove the export of your http/https proxies and re-run the script. You will have to re-add your proxies for any other external downloads. &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://github.com/EmilienM/openstack-folsom-guide/blob/master/scripts/keystone-endpoints.sh Keystone endpoint script] (Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;# MySQL definitions&lt;br /&gt;
MYSQL_USER=keystone_admin&lt;br /&gt;
MYSQL_DATABASE=keystone&lt;br /&gt;
MYSQL_HOST=192.168.220.40&lt;br /&gt;
MYSQL_PASSWORD=keystone_db_pass&lt;br /&gt;
&lt;br /&gt;
# Keystone definitions&lt;br /&gt;
KEYSTONE_REGION=RegionOne&lt;br /&gt;
SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# other definitions&lt;br /&gt;
MASTER=&amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
SWIFT_MASTER=&amp;quot;192.168.220.60&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with service endpoints. Again, if you are using proxies then you will need remove them from your export before running this command: &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Test connectivity to Keystone by using a curl request&amp;amp;nbsp;: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install curl openssl -y&lt;br /&gt;
&lt;br /&gt;
curl -d '{&amp;quot;auth&amp;quot;: {&amp;quot;tenantName&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;passwordCredentials&amp;quot;:{&amp;quot;username&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;password&amp;quot;: &amp;quot;keystone_admin&amp;quot;}}}' -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens | python -mjson.tool&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the above command is successful, you will receive output that includes a token and a list of service endpoints.&amp;amp;nbsp;You may also want to verify the other service account credentials: &lt;br /&gt;
&lt;br /&gt;
'''Glance''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;glance\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Nova''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;nova\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Swift''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Quantum''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;quantum\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Cinder''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;cinder\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can also use the Keystone client to verify the configuration: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
keystone user-list&lt;br /&gt;
keystone role-list&lt;br /&gt;
keystone service-list&lt;br /&gt;
keystone endpoint-list&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Glance Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Glance API and Registry packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y glance-api glance-registry&amp;lt;/pre&amp;gt; &lt;br /&gt;
Delete the glance.sqlite file created in the /var/lib/glance/ directory &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/glance/glance.sqlite&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Glance on only 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE glance;&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-api.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41). Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
default_store = swift&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
registry_host = 192.168.220.40&lt;br /&gt;
swift_store_auth_address = http://192.168.220.40:5000/v2.0/&lt;br /&gt;
swift_store_user = services:swift&lt;br /&gt;
swift_store_key = keystone_admin&lt;br /&gt;
swift_store_container = glance&lt;br /&gt;
swift_store_create_container_on_put = True&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone+cachemanagement&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-registry.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41) Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the glance-api and glance-registry services: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-api restart; service glance-registry restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
The database tables are under version control and you use the following command on a new installation to prevent the Image service from breaking possible upgrades. This command is used on only one of the controllers: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage version_control 0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the glance database on one control node (You may get a message about deprecation - you can ignore): &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the services again to take into account the new modifications: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-registry restart; service glance-api restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the Cirros 0.3.1 cloud image to a controller node and then upload it to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-disk.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;cirros&amp;quot; is_public=true disk_format=qcow2 container_format=ovf &amp;amp;lt; cirros-0.3.1-x86_64-disk.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that Glance is serving the image: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance image-list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, you can add the Ubuntu Precise image to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
 &lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum Server on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y quantum-server quantum-plugin-openvswitch&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Quantum database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE quantum; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'%' IDENTIFIED BY 'quantum_pass'; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'localhost' IDENTIFIED BY 'quantum_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/quantum/quantum.conf file on all control nodes. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = quantum&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/quantum/keystone-signing&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1&lt;br /&gt;
bridge_mappings = physnet1:br-ex &lt;br /&gt;
&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the quantum server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-server restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova software packages on all Control Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-api nova-conductor nova-consoleauth nova-scheduler nova-novncproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Nova database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE nova;&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the authtoken section in the /etc/nova/api-paste.ini file on each control node to include the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = nova&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [CONTROLLER_MGT_IP] with the controller node's management IP address (i.e. control01 = 192.168.220.41). Do this on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
dhcpbridge_flagfile=/etc/nova/nova.conf&lt;br /&gt;
dhcpbridge=/usr/bin/nova-dhcpbridge&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
verbose=true&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
image_service=nova.image.glance.GlanceImageService&lt;br /&gt;
rpc_backend=nova.rpc.impl_kombu&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
service_down_time=60&lt;br /&gt;
rabbit_port=5672&lt;br /&gt;
rabbit_virtual_host=/&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
ec2_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
enabled_apis=ec2,osapi_compute&lt;br /&gt;
osapi_compute_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
novncproxy_port=6080&lt;br /&gt;
novncproxy_host=0.0.0.0&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
novncproxy_host=[CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Synchronize the Nova database (You may get a DEBUG message - You can ignore this). '''Note:''' The db sync needs to be completed on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Due to [https://bugs.launchpad.net/nova/+bug/1158958 bug 1158958], Nova API must be patched to support memcached instead of the in-process cache. First, see if Nova needs to be patched by grep'ing the file that needs to be patched. You will receive no output if the file needs to be patched. You will receive host = str(instance.get('host')) if the file does not need patching: &lt;br /&gt;
&amp;lt;pre&amp;gt;grep &amp;quot;str(instance.get('host'))&amp;quot; /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the extended_availability_zone.py file needs patching, download the patched file: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/dflorea/nova/grizzly/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the patched extended_availability_zone.py to the /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;cp extended_availability_zone.py /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure the file is owned by root:root. &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If&amp;amp;nbsp;extended_availability_zone.py is not owned by root, then change the file ownership: &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod root:root /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart nova-* services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/init.d/; for i in $( ls nova-* ); do sudo service $i restart; done&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Also check that nova-api is running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-api status&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Cinder software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-api cinder-scheduler&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Cinder MySQL database on 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE cinder;&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/api-paste.ini file on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
service_protocol = http&lt;br /&gt;
service_host = 192.168.220.40&lt;br /&gt;
service_port = 5000&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = cinder&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/cinder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf configuration file on each control node. '''Note:''' The default volume_group is being changed from cinder-volumes to nova-volumes. As mentioned in the Critical Reminders section, an LVM Volume Group named nova-volumes must exist on each Compute Node. &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30 &lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Initialize the Cinder database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;cinder-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Cinder services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-api restart&lt;br /&gt;
service cinder-scheduler restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Horizon Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Horizon software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y memcached libapache2-mod-wsgi openstack-dashboard&amp;lt;/pre&amp;gt; &lt;br /&gt;
Next, modify the /etc/openstack-dashboard/local_settings.py file as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;CACHES = {&lt;br /&gt;
    'default': {&lt;br /&gt;
        'BACKEND'&amp;amp;nbsp;: 'django.core.cache.backends.memcached.MemcachedCache',&lt;br /&gt;
        'LOCATION'&amp;amp;nbsp;: '[CONTROLLER_MGT_IP]:11211'&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
OPENSTACK_HOST = &amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
OPENSTACK_KEYSTONE_URL = &amp;quot;http://%s:5000/v2.0&amp;quot;&amp;amp;nbsp;% OPENSTACK_HOST&lt;br /&gt;
OPENSTACK_KEYSTONE_DEFAULT_ROLE = &amp;quot;Member&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the memcached listening address in /etc/memcached.conf. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;-l [CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Reload Apache and memcached on each control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service apache2 restart; service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Access Horizon by using the following URL in your web browser. Use '''admin/keystone_admin''' for your login credentials. &amp;amp;nbsp;If you have problems accessing Horizon by using the VIP (192.168.220.40), then try using a real IP address of a control node (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;http://192.168.220.40/horizon&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, if you would like to remove the Ubuntu theme: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get purge -y openstack-dashboard-ubuntu-theme&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Compute Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Follow these steps for compute01, compute02 and compute03 compute nodes. &lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum software packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install quantum-plugin-openvswitch quantum-plugin-openvswitch-agent quantum-dhcp-agent&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check the status of the Open vSwitch services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch status&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Open vSwitch services on each compute node if they are not running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Nodes require OVS bridges named &amp;quot;br-int&amp;quot; and &amp;quot;br-ex&amp;quot;, and that &amp;quot;br-ex&amp;quot; is associated with the Public Network interface (eth1 in our example): &lt;br /&gt;
&amp;lt;pre&amp;gt;ovs-vsctl add-br br-int&lt;br /&gt;
ovs-vsctl add-br br-ex&lt;br /&gt;
ovs-vsctl add-port br-ex eth1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the Quantum configuration file /etc/quantum/quantum.conf with the following. '''Note:''' Make sure the names in rabbit_hosts= resolve: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini with: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the database section&lt;br /&gt;
[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following under the OVS section. &amp;amp;nbsp; '''Note:''' 223:225 signifies the VLAN ID range used for tenant VLANs. Modify this range based on your deployment needs. These VLANs should be trunked to eth1 of Compute Nodes and you must create a gateway address (i.e. 192.168.223.1 for VLAN 223) on your upstream Layer-3 device. &lt;br /&gt;
&amp;lt;pre&amp;gt;[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1:223:225&lt;br /&gt;
bridge_mappings = physnet1:br-ex&lt;br /&gt;
&lt;br /&gt;
# Using Quantum Security Groups instead of Nova Security Groups&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Update the /etc/quantum/dhcp_agent.ini: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
# Required to run multiple Quantum DHCP agents&lt;br /&gt;
use_component_ext = True&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Quantum services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-plugin-openvswitch-agent restart&lt;br /&gt;
service quantum-dhcp-agent restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova Compute software package on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-compute&amp;lt;/pre&amp;gt; &lt;br /&gt;
The deployment uses config_drive instead of Nova Metadata. Install the genisoimage package used by config_drive: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y genisoimage&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that the authtoken section in the /etc/nova/api-paste.ini file includes the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 127.0.0.1&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name =&amp;amp;nbsp;%SERVICE_TENANT_NAME%&lt;br /&gt;
admin_user =&amp;amp;nbsp;%SERVICE_USER%&lt;br /&gt;
admin_password =&amp;amp;nbsp;%SERVICE_PASSWORD%&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
force_config_drive=true&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
verbose=true&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_host=192.168.220.40&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
vncserver_proxyclient_address=[COMPUTE_MGT_IP]&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
vncserver_listen=[COMPUTE_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Restart the nova-compute service on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-compute restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt; Create a credentials file so you can issue OpenStack client commands from the Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing Cinder software packages on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-volume&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
iscsi_ip_address=[COMPUTE_MGT_IP]&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Cinder services on all compute nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-volume restart&lt;br /&gt;
service tgt restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring OpenStack Networking (Quantum) and Deploying the First VM  ===&lt;br /&gt;
&lt;br /&gt;
Run the following commands from either a Compute Node or Controller Node. If something has to be done on a specific node it will be called out. '''Note:''' If you have an issue with a Quantum command no being found, you may need to do the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y python-pip&lt;br /&gt;
pip install -U cliff&amp;lt;/pre&amp;gt; &lt;br /&gt;
Obtain the tenant ID and create your first tenant network. Create additional networks and associated subnets as needed. '''Note:''' The network is created with the &amp;quot;--shared&amp;quot; argument set so that the network is available to all tenants. If you only want this network available to the tenant for which you set your openrc file to then remove that argument: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
quantum net-create public223 --tenant_id &amp;amp;lt;tenant-id&amp;amp;gt; --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 223 --shared&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create your first tenant subnet and associate it to the network you created in the previous step. The example below uses .10-.250 for Instance IP addresses. Modify the allocation-pool and dns_nameservers based on your deployment needs. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum subnet-create --name 223-subnet --allocation-pool start=192.168.223.10,end=192.168.223.250 public223 192.168.223.0/24 --dns_nameservers list=true 192.168.26.186&amp;lt;/pre&amp;gt; &lt;br /&gt;
If you skipped the earlier step of downloading an image and uploading it to glance, do that now: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
*'''On a Compute Node''' create an SSH keypair and add the public key to Nova. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Leave the passphrase empty when creating the keypair. If you have an issue with the Nova commands not being found, you will need to to install the nova client support:&lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install python-novaclient&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;ssh-keygen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;cd ~/.ssh/&lt;br /&gt;
nova keypair-add --pub_key id_rsa.pub &amp;amp;lt;key_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova keypair-add --pub_key id_rsa.pub net-key&amp;lt;/pre&amp;gt; &lt;br /&gt;
Before booting the instance, check for the ID of the network we created earlier. Note: the &amp;amp;lt;quantum_net_id&amp;amp;gt; value will come from the output of the &amp;quot;quantum net-list&amp;quot; command: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum net-list&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name &amp;amp;lt;key_name&amp;amp;gt; --nic net-id=&amp;amp;lt;quantum_net_id&amp;amp;gt; &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name net-key --nic net-id=f9035744-72a9-42cf-bd46-73d54c0cea06 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Watch the status of the instance: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
The instance is booted completely when the OS-EXT-STS:vm_state is &amp;quot;active&amp;quot;. Make note of the IP address of the VM. Alternatively, you can watch the complete log of the VM booting by running: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova console-log --length=25 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the default Quantum Security Group to allow ingress traffic to Instances. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Security Group rules are associated to a specific tenant. The &amp;amp;lt;tenant-id&amp;amp;gt; can be found from the output of keystone tenant-list. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
This example allows all ICMP and SSH traffic: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should now be able to ping the VM as well as SSH into it from the host that you used to create the key you associated with the VM during the boot phase.&lt;/div&gt;</summary>
		<author><name>Shmcfarl</name></author>	</entry>

	<entry>
		<id>http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide</id>
		<title>COE Grizzly Release: High-Availability Manual Installation Guide</title>
		<link rel="alternate" type="text/html" href="http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide"/>
				<updated>2013-04-24T19:02:48Z</updated>
		
		<summary type="html">&lt;p&gt;Shmcfarl: /* Configuring OpenStack Networking (Quantum) and Deploying the First VM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
There are two common ways of installing [http://docs.openstack.org/ OpenStack], manually or by using automation tools. There is much focus on the full automation of OpenStack deployments using tools such as [http://puppetlabs.com/ Puppet], [http://www.opscode.com/chef/ Chef], [https://juju.ubuntu.com/ JuJu] and others. While these tools offer great advantages over manual configuration, they do hide the OpenStack installation and configuration details. This document can be used by those interested in learning more about the OpenStack Grizzly High-Availability (HA) installation process or for those not interested in using automation tools to deploy HA. The document covers the following OpenStack software components: &lt;br /&gt;
&lt;br /&gt;
*[http://glance.openstack.org/ Glance] (Image Service) &lt;br /&gt;
*[http://keystone.openstack.org/ Keystone] (Identity Service) &lt;br /&gt;
*[http://nova.openstack.org/ Nova] (Compute Service) &lt;br /&gt;
*[http://horizon.openstack.org/ Horizon] (OpenStack Dashboard Web User Interface) &lt;br /&gt;
*[http://docs.openstack.org/developer/quantum/ Quantum] (Network Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/cinder/ Cinder] (Block Storage Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/swift/ Swift] (Object Storage Service)&lt;br /&gt;
&lt;br /&gt;
== Dependencies  ==&lt;br /&gt;
&lt;br /&gt;
=== Critical Reminders  ===&lt;br /&gt;
&lt;br /&gt;
The most common OpenStack HA deployment issues are either incorrect configuration files or not deploying the nodes in the proper order. To save you from future troubleshooting steps, ENSURE that you deploy the nodes in the order described within the document and verify the accuracy of all configuration files. You will likely be using your own IP addressing and passwords in your setup and it is critical to ensure any variations from this guide are fully understood. &lt;br /&gt;
&lt;br /&gt;
Do not configure RAID on the hard disks of Swift Storage Nodes. Swift performs better without RAID and disk redundancy is unneeded since Swift protects the data through replication. Therefore, if a RAID Controller manages the hard disks, ensure you present each of the hard disks independently. Our example uses disk /dev/sda for the Operating System installation and disks /dev/sdb-/dev/sdf for Swift storage. Please remember to modify these definitions based on your specific deployment environment. Additional Swift considerations and tuning information can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/considerations-and-tuning.html here]. &lt;br /&gt;
&lt;br /&gt;
Compute Nodes run Cinder Volume to provide block storage services to Instances. The default Cinder driver (volume_driver=nova.volume.driver.ISCSIDriver) is an iSCSI solution that employs the use of Linux Logical Volume Manager (LVM). Therefore, you must create an LVM Volume Group either during the Ubuntu Precise installation or [http://docs.openstack.org/trunk/openstack-compute/admin/content/cinder-install.html afterwards]. The name of the LVM Volume Group must match the volume_group definition in cinder.conf. Our example uses the name nova-volumes for the LVM Volume Group and associated cinder.conf volume_group name. &lt;br /&gt;
&lt;br /&gt;
The password used in our examples is keystone_admin. Every account, service and configuration file uses this one password. You will want to change this in your setup and you certainly want to use a strong password and a different password for each account/service if this system is going into production.&lt;br /&gt;
&lt;br /&gt;
=== Operating System  ===&lt;br /&gt;
&lt;br /&gt;
The operating system used for this installation is Ubuntu 12.04 LTS (Precise). &lt;br /&gt;
&lt;br /&gt;
=== Server Requirements  ===&lt;br /&gt;
&lt;br /&gt;
Our deployment uses 13 Cisco UCS C-series servers to serve the roles of Controller, Compute, Load-Balancer and Swift Proxy/Storage. The environment scales linearly, therefore individual nodes can be added to increase capacity for any particular OpenStack service. The five distinct node types used in this document are: &lt;br /&gt;
&lt;br /&gt;
*'''3 Controller Nodes-'''&amp;amp;nbsp;Runs Nova API, Nova Conductor, Nova Consoleauth, Nova Novncproxy, Nova Scheduler, NoVNC, Quantum Server, Quantum Plugin OVS, Glance API/Registry, Keystone, Cinder API, Cinder Scheduler, OpenStack Dashboard, RabbitMQ Server, MySQL Server WSREP and Galera. &lt;br /&gt;
**Provides management functionality of the OpenStack environment.&lt;br /&gt;
&lt;br /&gt;
*'''3 Compute Nodes-'''&amp;amp;nbsp;Runs Nova Compute, Quantum OVS and DHCP Agents, Cinder Volume and TGT services. &lt;br /&gt;
**Provides the hypervisor role for running Nova instances (Virtual Machines) and presents LVM volumes for Cinder block storage.&lt;br /&gt;
&lt;br /&gt;
*'''2 Load-Balancer Nodes-'''&amp;amp;nbsp;Runs HAProxy and Keepalived to load-balance traffic across Controller and Swift Proxy clusters.&lt;br /&gt;
&lt;br /&gt;
*'''2 Swift Proxy Nodes-'''&amp;amp;nbsp;The Proxy Node is responsible for tying together users and their data within the the Swift object storage system. For each request, it will look up the location of the account, container or object in the Swift ring and route the request accordingly. The public API is also exposed by Proxy Node.&lt;br /&gt;
&lt;br /&gt;
*'''3 Swift Storage Nodes-'''&amp;amp;nbsp;Each Storage Nodes contains Swift object, container, and account services. At a very high-level, these are the servers that contain the user data and perform replication among one another to keep the system in a consistent state.&lt;br /&gt;
&lt;br /&gt;
=== Networking Requirements  ===&lt;br /&gt;
&lt;br /&gt;
The OpenStack HA environment uses five separate networks. Three of the five networks are used by Tenants. Three tenant networks are being used as an example, and thus the tenant networks can be increased or decreased based on your deployment needs. Connectivity within Tenants uses Quantum with the Open vSwitch (OVS) plugin and [http://docs.openstack.org/trunk/openstack-network/admin/content/provider_networks.html Provider Network Extensions]. Provider Network Extensions allow cloud administrators to create OpenStack networks that map directly to physical networks in the data center and support local, VLAN and GRE deployment models. Our example uses the Provider VLAN networking model. The network details are as follows: &lt;br /&gt;
&lt;br /&gt;
*'''1 Management Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used to perform management functions against the node. For example, SSH'ing to the nodes to change a configuration setting. The network is also used for lights-out management using the CIMC interface of the UCS servers. Lastly, OpenStack API's and the Horizon web dashboard is associated to this network. &lt;br /&gt;
**An IP address for each node is required for this network. If using lights-out management such as CIMC, each node will require 2 addresses from this network. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]). &lt;br /&gt;
*'''3 Tenant Networks'''&amp;lt;br&amp;gt; &lt;br /&gt;
**These networks are used to provide connectivity to Instances. Since Quantum Provider Networking Extensions are being used, it is common to give tenants direct access to a &amp;quot;public&amp;quot; network that can be used to reach the Internet. &lt;br /&gt;
**Compute Nodes will have an interface attached to this network. Since the Compute Node interfaces that attach to this network are managed by OVS, they should not contain an IP address. &lt;br /&gt;
**This network typically employs publicly routable IP addressing if external NAT'ing is not used upstream towards the Internet edge ('''Note:''' in this document all IP addressing for all interfaces comes out of various private addressing blocks). &lt;br /&gt;
*'''1 Storage Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used for providing separate connectivity between Swift Proxy and Storage Nodes. This ensures storage traffic is not interfering with Instance traffic. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]) IP addressing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''[http://docwiki.cisco.com/w/images/a/a8/Grizzly-ha-network-design-details-v1.0.png Figure 1]''' is used to help visualize the network deployment and to act as a reference for configuration steps within the document. It is highly recommend to print the diagram so it can easily be referenced throughout the installation process.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;u&amp;gt;'''Figure 1:'''&amp;lt;/u&amp;gt;'''OpenStack HA Network Design Details''' &lt;br /&gt;
&lt;br /&gt;
[[Image:Grizzly-ha-network-design-details-v1.0.png|thumb|left]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''Other Network Services'''&amp;lt;br&amp;gt; &lt;br /&gt;
**'''DNS: '''In this setup an external DNS server (192.168.26.186) is used for name resolution of OpenStack nodes and external name resolution. If DNS is not being used, the /etc/hosts file should include the following for all nodes:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 127.0.0.1	localhost&lt;br /&gt;
 192.168.220.40  control.dmz-pod2.lab		control&lt;br /&gt;
 192.168.220.41  control01.dmz-pod2.lab	        control01&lt;br /&gt;
 192.168.220.42  control02.dmz-pod2.lab  	control02&lt;br /&gt;
 192.168.220.43  control03.dmz-pod2.lab  	control03&lt;br /&gt;
 192.168.220.60  swiftproxy.dmz-pod2.lab	        swiftproxy&lt;br /&gt;
 192.168.220.61  swiftproxy01.dmz-pod2.lab	swiftproxy01&lt;br /&gt;
 192.168.220.62  swiftproxy02.dmz-pod2.lab	swiftproxy02&lt;br /&gt;
 192.168.220.51  compute01.dmz-pod2.lab          compute01&lt;br /&gt;
 192.168.220.52  compute02.dmz-pod2.lab          compute02&lt;br /&gt;
 192.168.220.53  compute03.dmz-pod2.lab          compute03&lt;br /&gt;
&lt;br /&gt;
*'''NTP: '''In this setup an external NTP server(s) is used for time synchronization. &lt;br /&gt;
*'''Physical Network Switches:''' Each node in this setup is physically attached to a Cisco Nexus switch acting as a Top-of-Rack access layer device. Trunking is configured on each interface connecting to the eth0 NIC of each node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Upstream routers/aggregation layer switches will most likely be terminating the Layer-3 VLAN interfaces. If these interfaces are deployed in a redundant fashion with a First Hop Redundancy Protocol such as HSRP or VRRP, then you should be careful of the IP addresses assigned to the physical L3 switches/routers as they may conflict with the IP address of the Quantum router's public subnet (.3 by default). For example, if you are using HSRP and you have .1 as the standby IP address, .2 as the first L3 switch IP and .3 as the second L3 switch IP, you will receive a duplicate IP address error on the second L3 switch. This can be worked around by using high-order IPs on your upstream L3 device or altering the Quantum subnet configuration at the time of creation to have an IP starting range higher than the physical switches/routers are using (i.e. .4 and higher). Our example uses an IP allocation range that starts with .10 to avoid this issue.&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
The installation of the nodes should be in the following order: &lt;br /&gt;
&lt;br /&gt;
#'''Load-Balancer Nodes-''' slb01 and slb02 &lt;br /&gt;
#'''Swift Storage Nodes-''' swift01, swift02 and swift03 &lt;br /&gt;
#'''Swift Proxy Nodes-''' swiftproxy01 and swiftproxy02 &lt;br /&gt;
#'''Controller Nodes-''' control01, control02 and control03 &lt;br /&gt;
#'''Compute Nodes- '''compute01, compute02 and compute03&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Nodes  ===&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu Precise 12.04 Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Ubuntu 12.04 (AMD 64-bit) from CD/ISO or automated install (i.e. kickstart). You can reference Section 4 in the [http://docwiki.cisco.com/wiki/OpenStack:Essex_Build_Node#Starting_the_Ubuntu_Installation Build Node Guide] if you are unfamiliar with the Ubuntu Precise installation process. Use the following networking section to configure your network adapter properties for each node. As previously mentioned in the Critical Reminders Section, make sure to create an LVM Volume Group named nova-volumes for Compute Nodes and do not configure RAID for Swift Storage Nodes. Lastly, select ssh-server as the only additional package during the Ubuntu Precise installation. &lt;br /&gt;
&lt;br /&gt;
==== Grizzly Packages  ====&lt;br /&gt;
&lt;br /&gt;
The [https://launchpad.net/~openstack-ubuntu-testing/+archive/grizzly-trunk-testing Ubuntu Testers Team] manages the repository used by this document for OpenStack Grizzly packaging. Although the repository supports Ubuntu Precise and Raring releases, the document is only based on Precise. The Ubuntu Testers PPA should be used for all OpenStack nodes (i.e. not needed for Load-Balancer nodes). &lt;br /&gt;
&lt;br /&gt;
Use sudo mode or run from root account for the entire installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the Ubuntu Grizzly repository: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install python-software-properties -y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;apt-add-repository ppa:openstack-ubuntu-testing/grizzly-trunk-testing&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' Press enter when you are prompted for “[ENTER] or cancel” when adding the PPA. Update your system: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get update&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Networking  ====&lt;br /&gt;
&lt;br /&gt;
Our implementation uses VLANs for segmentation of certain networks. Make sure the VLAN package is installed and your network switches have been configured for VLANs. Otherwise, replicate the network setup using only physical interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install vlan -y&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.81&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.82&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Proxy Node swiftproxy01 /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Proxy Node swiftproxy02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.62&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.62&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.41&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.42&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.43&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.51&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.52&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.53&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart networking: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/networking restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Time Synchronization  ====&lt;br /&gt;
&lt;br /&gt;
Install NTP: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y ntp&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add your NTP server(s) by editing /etc/ntp.conf. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; OpenStack requires that clocks be synchronized. Our example uses a '''FAKE '''server called ntp.corp.com as the NTP server. Make sure you change&amp;amp;nbsp;ntp.corp.com to your real NTP server. Lastly, make sure the NTP server name resolves. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/ntp.conf&lt;br /&gt;
&lt;br /&gt;
server ntp.corp.com&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart NTP for the changes to take effect &lt;br /&gt;
&amp;lt;pre&amp;gt;service ntp restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that you are pulling time: &lt;br /&gt;
&amp;lt;pre&amp;gt;ntpq -p&lt;br /&gt;
&lt;br /&gt;
remote           refid      st t when poll reach   delay   offset  jitter&lt;br /&gt;
==============================================================================&lt;br /&gt;
*ntp.corp.       .GPS.            1 u  185  512  377   76.035    0.053   0.033&lt;br /&gt;
 cheezum.mattnor 129.7.1.66       2 u   8d 1024    0   47.731   -0.555   0.000&lt;br /&gt;
 ntp2.rescomp.be .STEP.          16 u    - 1024    0    0.000    0.000   0.000&lt;br /&gt;
 216.45.57.38    204.123.2.5      2 u  54h 1024    0   12.607    0.808   0.000&lt;br /&gt;
 lithium.constan 128.4.1.1        2 u   8d 1024    0   69.861    0.206   0.000&lt;br /&gt;
 europium.canoni 193.79.237.14    2 u  54h 1024    0  144.040   -1.455   0.000&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load Balancer Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Perform the following steps on nodes slb01 and slb02. &lt;br /&gt;
&lt;br /&gt;
==== Keepalived &amp;amp;amp; HAProxy  ====&lt;br /&gt;
&lt;br /&gt;
Edit /etc/sysctl.conf to allow Keepalived to associate a virtual IP address (VIP) that is not directly bound to an interface on the node:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;net.ipv4.ip_nonlocal_bind=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load in sysctl settings from /etc/sysctl.conf: &lt;br /&gt;
&amp;lt;pre&amp;gt;sysctl -p&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install Keepalived and HAProxy packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keepalived haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the /var/lib/haproxy directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /var/lib/haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure /var/lib/haproxy is owned by root. Change the file ownership if needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /var/lib/haproxy/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the&amp;amp;nbsp;/etc/keepalived/keepalived.conf file for slb01 with the contents below.&amp;amp;nbsp; Change&amp;amp;nbsp;[YOUR_DOMAIN_NAME] with your actual domain name.&amp;amp;nbsp; The keepalived.conf includes the following sections:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global_defs-''' Global parameters affect the whole process behavior.&amp;amp;nbsp;There may be several 'global' sections if needed, but their parameters will only be merged. &amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_script-''' Keepalived supports a VRRP scripting framework to extend base functionality.&amp;amp;nbsp; The vrrp_script named haproxy will check the status of the haproxy service every 2 seconds and add 2 points of priority if the status is running. &amp;amp;nbsp;If the haproxy service is not running, the backup HAProxy Node will become the primary and begin passing traffic for the virtual_ipaddress(es).&amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_instance-''' Is where you define configuration paramters for virtual gateway addresses.&amp;amp;nbsp; slb01 is configured as the primary gateway for 192.168.220.40 (Controller Cluster) and the backup gateway for 192.168.220.60 (Swift Proxy Cluster). Accordingly, slb02 is configured as the primary for 192.168.220.60 and the backup for 192.168.220.40.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb01&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure /etc/keepalived/keepalived.conf for slb02 with the following contents. Change [YOUR_DOMAIN_NAME] with your actual domain name. &lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb02&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb01 with the contents below. HAProxy's configuration process involves 3 major sources of parameters:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*The arguments from the command-line, which always take precedence.&amp;lt;br&amp;gt; &lt;br /&gt;
*The &amp;quot;global&amp;quot; section, which sets process-wide parameters.&amp;lt;br&amp;gt; &lt;br /&gt;
*The proxies sections which can take form of &amp;quot;defaults&amp;quot;, &amp;quot;listen&amp;quot;, &amp;quot;frontend&amp;quot; and &amp;quot;backend&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following provides additional details of the haproxy.cfg file:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global-&amp;amp;nbsp; '''Sets process-wide parameters for load-balancing traffic.&amp;amp;nbsp; Global parameters can be overriden by server-specific configurations within the''listen section ''of the haproxy.cfg file.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''defaults-''' The &amp;quot;defaults&amp;quot; section sets default parameters for all other sections following its declaration. Those default parameters are reset by the next &amp;quot;defaults&amp;quot; section. The name is optional but its use is encouraged for better readability.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''listen-''' A &amp;quot;listen&amp;quot; section defines a complete proxy with its front-end (i.e. listening VIP) and back-end (i.e. real IP of servers)&amp;amp;nbsp;parts combined in one section. Currently two major proxy modes are supported: &amp;quot;tcp&amp;quot;, also known as layer 4 and &amp;quot;http&amp;quot;, also known as layer 7. In layer 4 mode, HAProxy simply forwards bidirectional traffic between two sides. In layer 7 mode, HAProxy analyzes the protocol and can interact with it by allowing, blocking, switching, adding, modifying, or removing arbitrary content in requests or responses based on configurable criteria.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
 chroot  /var/lib/haproxy&lt;br /&gt;
 daemon  &lt;br /&gt;
 group  haproxy&lt;br /&gt;
 log  192.168.220.81 local0&lt;br /&gt;
 maxconn  4000&lt;br /&gt;
 pidfile  /var/run/haproxy.pid&lt;br /&gt;
 user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
 log  global&lt;br /&gt;
 maxconn  8000&lt;br /&gt;
 option  redispatch&lt;br /&gt;
 retries  3&lt;br /&gt;
 timeout  http-request 10s&lt;br /&gt;
 timeout  queue 1m&lt;br /&gt;
 timeout  connect 10s&lt;br /&gt;
 timeout  client 1m&lt;br /&gt;
 timeout  server 1m&lt;br /&gt;
 timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
 bind 192.168.220.40:80&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
 bind 192.168.220.40:3306&lt;br /&gt;
 balance  source&lt;br /&gt;
 mode  tcp&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9292&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
 bind 192.168.220.40:9191&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
 bind 192.168.220.40:35357&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
 bind 192.168.220.40:5000&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
 bind 192.168.220.40:11211&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
 bind 192.168.220.40:8773&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
 bind 192.168.220.40:8774&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
 bind 192.168.220.40:8775&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
 bind 192.168.220.40:8776&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
 bind 192.168.220.40:6080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9696&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
 bind 192.168.220.60:8080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb02 with the contents below. &lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
  chroot  /var/lib/haproxy&lt;br /&gt;
  daemon  &lt;br /&gt;
  group  haproxy&lt;br /&gt;
  log  192.168.220.82 local0&lt;br /&gt;
  maxconn  4000&lt;br /&gt;
  pidfile  /var/run/haproxy.pid&lt;br /&gt;
  user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
  log  global&lt;br /&gt;
  maxconn  8000&lt;br /&gt;
  option  redispatch&lt;br /&gt;
  retries  3&lt;br /&gt;
  timeout  http-request 10s&lt;br /&gt;
  timeout  queue 1m&lt;br /&gt;
  timeout  connect 10s&lt;br /&gt;
  timeout  client 1m&lt;br /&gt;
  timeout  server 1m&lt;br /&gt;
  timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
  bind 192.168.220.40:80&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
  bind 192.168.220.40:3306&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9292&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
  bind 192.168.220.40:9191&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
  bind 192.168.220.40:35357&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
  bind 192.168.220.40:5000&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
  bind 192.168.220.40:11211&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
  bind 192.168.220.40:8773&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
  bind 192.168.220.40:8774&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
  bind 192.168.220.40:8775&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
  bind 192.168.220.40:8776&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
  bind 192.168.220.40:6080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9696&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
  bind 192.168.220.60:8080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set &amp;quot;ENABLED&amp;quot; to &amp;quot;1&amp;quot; in /etc/default/haproxy &lt;br /&gt;
&amp;lt;pre&amp;gt;ENABLED=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keepalived and HAProxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/keepalived restart&lt;br /&gt;
/etc/init.d/haproxy restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Swift Nodes&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Install Swift and other basic packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift openssh-server rsync memcached python-netifaces python-xattr python-memcache &amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir -p /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration file. '''Note:''' This file should be identical on all Swift nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/swift.conf&lt;br /&gt;
&lt;br /&gt;
[swift-hash]&lt;br /&gt;
swift_hash_path_suffix = Gdr8ny7YyWqy2&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the Swift directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Storage Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Run these commands on nodes swift01, swift02 and swift03. Install the Swift Storage Node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-account swift-container swift-object xfsprogs parted&amp;lt;/pre&amp;gt; &lt;br /&gt;
For each of the hard disks other than the Ubuntu installation disk (i.e. /dev/sda), create an XFS volume with a single partition. Our example uses five hard disks (/dev/sdb - /dev/sdf) per Storage Node. Repeat this step for each disk that will be used for Swift storage: &lt;br /&gt;
&amp;lt;pre&amp;gt;parted /dev/sdb mklabel msdos&lt;br /&gt;
parted -a optimal /dev/sdb mkpart primary ext2 0% 100%&lt;br /&gt;
mkfs.xfs -i size=1024 /dev/sdb1&lt;br /&gt;
echo &amp;quot;/dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0&amp;quot; &amp;amp;gt;&amp;amp;gt; /etc/fstab&lt;br /&gt;
mkdir -p /srv/node/sdb1&lt;br /&gt;
mount /srv/node/sdb1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the mount directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /srv/node&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create an Rsync configuration file on each Storage Node. In the following example, replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/rsyncd.conf&lt;br /&gt;
&lt;br /&gt;
uid = swift&lt;br /&gt;
gid = swift&lt;br /&gt;
log file = /var/log/rsyncd.log&lt;br /&gt;
pid file = /var/run/rsyncd.pid&lt;br /&gt;
address = [STORAGE_NET_IP]&lt;br /&gt;
&lt;br /&gt;
[account]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/account.lock&lt;br /&gt;
&lt;br /&gt;
[container]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/container.lock&lt;br /&gt;
&lt;br /&gt;
[object]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/object.lock&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following line in /etc/default/rsync: &lt;br /&gt;
&amp;lt;pre&amp;gt;RSYNC_ENABLE = true&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start rsync daemon: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rsync start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/account-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/account-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = account-server&lt;br /&gt;
&lt;br /&gt;
[app:account-server]&lt;br /&gt;
use = egg:swift#account&lt;br /&gt;
&lt;br /&gt;
[account-replicator]&lt;br /&gt;
&lt;br /&gt;
[account-auditor]&lt;br /&gt;
&lt;br /&gt;
[account-reaper]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/container-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/container-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = container-server&lt;br /&gt;
&lt;br /&gt;
[app:container-server]&lt;br /&gt;
use = egg:swift#container&lt;br /&gt;
&lt;br /&gt;
[container-replicator]&lt;br /&gt;
&lt;br /&gt;
[container-updater]&lt;br /&gt;
&lt;br /&gt;
[container-auditor]&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Create /etc/swift/object-server.conf&amp;amp;nbsp;with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71):&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/object-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = object-server&lt;br /&gt;
&lt;br /&gt;
[app:object-server]&lt;br /&gt;
use = egg:swift#object&lt;br /&gt;
&lt;br /&gt;
[object-replicator]&lt;br /&gt;
&lt;br /&gt;
[object-updater]&lt;br /&gt;
&lt;br /&gt;
[object-auditor]&lt;br /&gt;
&lt;br /&gt;
[object-expirer]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the storage services. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; At this point, the ring files will not be present on the storage nodes. This will cause the *-replicator services to fail to start properly. After you create the ring files on the first proxy node (in the next section) and distribute them to the storage nodes, a service restart should allow all Swift services to start properly. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init object-server start&lt;br /&gt;
swift-init object-replicator start&lt;br /&gt;
swift-init object-updater start&lt;br /&gt;
swift-init object-auditor start&lt;br /&gt;
swift-init container-server start&lt;br /&gt;
swift-init container-replicator start&lt;br /&gt;
swift-init container-updater start&lt;br /&gt;
swift-init container-auditor start&lt;br /&gt;
swift-init account-server start&lt;br /&gt;
swift-init account-replicator start&lt;br /&gt;
swift-init account-auditor start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height: 1.5em;&amp;quot;&amp;gt;Make sure you repeat these steps for every Storage Node.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Proxy Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Ensure you have completed the previous steps in the &amp;quot;General Installation Steps for All Swift Nodes&amp;quot; section. &lt;br /&gt;
&lt;br /&gt;
Perform these steps on nodes swiftproxy01 and swiftproxy02. First, install the proxy node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-proxy memcached python-keystoneclient python-swiftclient swift-plugin-s3&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify memcached to bind to the storage network interface (192.168.222.x in our example). Edit the following line in /etc/memcached.conf, changing: &lt;br /&gt;
&amp;lt;pre&amp;gt;-l 127.0.0.1 &lt;br /&gt;
to&lt;br /&gt;
-l [STORAGE_NET_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the memcached server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
If it does not exist, create the /etc/swift/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /etc/swift/&amp;lt;/pre&amp;gt; &lt;br /&gt;
If /etc/swift and /var/cache/swift directories are not owned by the swift user and group, then change the ownership of the directories: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift/&lt;br /&gt;
chown -R swift:swift /var/cache/swift/&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create /etc/swift/proxy-server.conf with the following contents: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_port = 8080&lt;br /&gt;
workers = 32&lt;br /&gt;
user = swift&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = catch_errors healthcheck cache ratelimit authtoken keystoneauth proxy-server&lt;br /&gt;
&lt;br /&gt;
[app:proxy-server]&lt;br /&gt;
use = egg:swift#proxy&lt;br /&gt;
allow_account_management = true&lt;br /&gt;
account_autocreate = true&lt;br /&gt;
&lt;br /&gt;
[filter:keystoneauth]&lt;br /&gt;
use = egg:swift#keystoneauth&lt;br /&gt;
operator_roles = Member,admin, swiftoperator&lt;br /&gt;
&lt;br /&gt;
[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
signing_dir = /var/cache/swift&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
auth_uri = http://192.168.220.40:5000&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = swift&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
delay_auth_decision = 10&lt;br /&gt;
&lt;br /&gt;
[filter:cache]&lt;br /&gt;
use = egg:swift#memcache&lt;br /&gt;
memcache_servers = 192.168.222.61:11211,192.168.222.62:11211&lt;br /&gt;
&lt;br /&gt;
[filter:catch_errors]&lt;br /&gt;
use = egg:swift#catch_errors&lt;br /&gt;
&lt;br /&gt;
[filter:healthcheck]&lt;br /&gt;
use = egg:swift#healthcheck&lt;br /&gt;
&lt;br /&gt;
[filter:ratelimit]&lt;br /&gt;
use = egg:swift#ratelimit&lt;br /&gt;
clock_accuracy = 1000&lt;br /&gt;
max_sleep_time_seconds = 60&lt;br /&gt;
log_sleep_time_seconds = 0&lt;br /&gt;
rate_buffer_seconds = 5&lt;br /&gt;
account_ratelimit = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, create the account, container and object rings. The builder command is basically creating a builder file with a few parameters. The parameter with the value of 18 represents 2 ^ 18th, this is the value of the partition size. Set this “partition power” value based on the total amount of storage you expect your entire ring to use. The value of 3 represents the number of replicas of each object, with the last value being the number of hours to restrict moving a partition more than once. Additional information regarding Swift ring preperation can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/preparing-the-ring.html here]. &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/swift&lt;br /&gt;
&lt;br /&gt;
swift-ring-builder account.builder create 18 3 1&lt;br /&gt;
swift-ring-builder container.builder create 18 3 1&lt;br /&gt;
swift-ring-builder object.builder create 18 3 1&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, for every storage device on each storage node add entries to each ring. This example prepares the account, container and object rings for storage node swift01 (192.168.222.71) with a partition in zone 1. The mount point of this partition is /srv/node/sdb1 and the path in rsyncd.conf is /srv/node/, the DEVICE would be sdb1 and the commands would look like: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder add z1-192.168.222.71:6002/sdb1 100&lt;br /&gt;
swift-ring-builder container.builder add z1-192.168.222.71:6001/sdb1 100&lt;br /&gt;
swift-ring-builder object.builder add z1-192.168.222.71:6000/sdb1 100&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Make sure not to place all devices in the same zone (i.e. z1). It is recommended to configure the zones as high-level as possible to create the greatest amount of isolation. Some considerations can include physical location, power availability, and network connectivity. For example, in a small cluster you might decide to split the zones up by cabinet, with each cabinet having its own power and network connectivity. Since our deployment only uses 3 storage nodes, each node should be in its own zone. However, it is recommended to have a minimum of 5 zones in a production-level Swift deployment. &lt;br /&gt;
&lt;br /&gt;
Verify the ring contents for each ring: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
swift-ring-builder /etc/swift/container.builder&lt;br /&gt;
swift-ring-builder /etc/swift/object.builder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Your output should look similar to this: &lt;br /&gt;
&amp;lt;pre&amp;gt;root@swiftproxy01:~# swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
/etc/swift/account.builder, build version 15&lt;br /&gt;
262144 partitions, 3 replicas, 3 zones, 15 devices, 0.00 balance&lt;br /&gt;
The minimum number of hours before a partition can be reassigned is 1&lt;br /&gt;
Devices:    id  zone      ip address  port      name weight partitions balance meta&lt;br /&gt;
             0     3  192.168.222.73  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
             1     2  192.168.222.72  6002      sdd1   1.00      52429    0.00 &lt;br /&gt;
             2     3  192.168.222.73  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             3     2  192.168.222.72  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             4     3  192.168.222.73  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             5     1  192.168.222.71  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             6     1  192.168.222.71  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             7     2  192.168.222.72  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
             8     1  192.168.222.71  6002      sdd1   1.00      52428   -0.00 &lt;br /&gt;
             9     2  192.168.222.72  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
            10     1  192.168.222.71  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
            11     1  192.168.222.71  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            12     3  192.168.222.73  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            13     2  192.168.222.72  6002      sde1   1.00      52428   -0.00 &lt;br /&gt;
            14     3  192.168.222.73  6002      sdd1   1.00      52428   -0.00&amp;lt;/pre&amp;gt; &lt;br /&gt;
Rebalance the rings. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Rebalancing rings can take a while. You may get a message about a balance value and that you need to rebalance/push after the minimum 1 hour. If so, recheck the status after an hour. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder rebalance&lt;br /&gt;
swift-ring-builder container.builder rebalance&lt;br /&gt;
swift-ring-builder object.builder rebalance&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the account.ring.gz, container.ring.gz, and object.ring.gz files to swiftproxy02 and the 3 storage nodes in /etc/swift. &lt;br /&gt;
&lt;br /&gt;
Make sure all the config files are owned by the swift user: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Proxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init proxy start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verify the Swift Installation  ===&lt;br /&gt;
&lt;br /&gt;
You can run verification commands from the proxy server or any server with access to Keystone. Keep in mind that proxy nodes are configured to use Keystone for user authentication. As a result, you '''MUST''' complete the Controller Node Installation steps and ensure Keystone is operational before proceeding with Swift verification. &lt;br /&gt;
&lt;br /&gt;
Verify that you can successfully authenticate against Keystone using the Swift authentication credentials: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y curl&lt;br /&gt;
&lt;br /&gt;
curl -s -d &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should receive output similar to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;access&amp;quot;: {&amp;quot;token&amp;quot;: {&amp;quot;issued_at&amp;quot;: &amp;quot;2013-04-02T14:55:31.149327&amp;quot;, &amp;quot;expires&amp;quot;: &amp;quot;2013-04-03T14:55:31Z&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;bb29ef5439ce4a75bf85332bbadf6538&amp;quot;, &amp;quot;tenant&amp;quot;: {&amp;quot;description&amp;quot;: &lt;br /&gt;
null, &amp;quot;enabled&amp;quot;: true, &amp;quot;id&amp;quot;: &amp;quot;b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;services&amp;quot;}}, &amp;quot;serviceCatalog&amp;quot;: [{&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;45a336cb74e04e11ab95c0ea28b699d6&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;compute&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;nova&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;259fef5e66814f47ac1934d3cf522a3d&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;network&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;quantum&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [&lt;br /&gt;
{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;166de3790eb54c31a58237fe9ea3d301&amp;quot;, &lt;br /&gt;
&amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;image&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;glance&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;0a2c69157d5948a9ae8ecee5c65a6d2b&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;volume&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;cinder&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Admin&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &lt;br /&gt;
&amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;05f85b8aacbd4c87b680dcc2fb6da539&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;}], &lt;br /&gt;
&amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;ec2&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;ec2&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.60:8080/v1&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;4a1af526137341c0a682eb573101ddde&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;object-store&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;3e3f7b50b5bd44b7a15b3e4ae55086bf&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;identity&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;keystone&amp;quot;}], &amp;quot;user&amp;quot;: {&amp;quot;username&amp;quot;: &amp;quot;swift&amp;quot;, &amp;quot;roles_links&amp;quot;: [], &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;ed69664ac78a4b65a36d63da6b760863&amp;quot;, &amp;quot;roles&amp;quot;: [{&amp;quot;name&amp;quot;: &amp;quot;_member_&amp;quot;}, {&amp;quot;name&amp;quot;: &amp;quot;admin&amp;quot;}], &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, &amp;quot;metadata&amp;quot;: {&amp;quot;is_admin&amp;quot;: 0, &amp;quot;roles&amp;quot;: [&lt;br /&gt;
&amp;quot;9fe2ff9ee4384b1894a90878d3e92bab&amp;quot;, &amp;quot;6a553ae3be3c4f8c8fe079830d4102a5&amp;quot;]}}}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Use the swift client stat command to make sure you can view the contents of the ring.&amp;amp;nbsp;You can run these commands from the proxy server or any server with the swift client and access to Keystone. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U admin:admin -K keystone_admin stat&lt;br /&gt;
   Account: AUTH_3eccdb2a9331419c96ac9ff336110b65&lt;br /&gt;
Containers: 1&lt;br /&gt;
   Objects: 2&lt;br /&gt;
     Bytes: 0&lt;br /&gt;
Accept-Ranges: bytes&lt;br /&gt;
X-Timestamp: 1363989109.30329&lt;br /&gt;
X-Trans-Id: tx147dd9983ac54af1b71c5a561ae2aa9a&lt;br /&gt;
Content-Type: text/plain; charset=utf-8&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can see that 1 container exists. &amp;amp;nbsp;Now, lets find out the name of the container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list&lt;br /&gt;
glance&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The glance container is created after the Controller cluster is built and an image has been uploaded to Glance. &lt;br /&gt;
&lt;br /&gt;
List the contents of the Glance container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list glance&lt;br /&gt;
24164630-ba2f-436a-8bc6-43975717d5e5&lt;br /&gt;
858a11dc-ed61-4a18-a778-eabcb454ae45&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Controller Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Runs these commands on nodes control01, control02 and control03. &amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install MySQL and Galera dependencies: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y libaio1 libssl0.9.8 mysql-client-5.5 python-mysqldb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download MySQL-WSREP and Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget -O /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb http://launchpad.net/codership-mysql/5.5/5.5.23-23.6/+download/mysql-server-wsrep-5.5.23-23.6-amd64.deb --no-check-certificate&lt;br /&gt;
wget -O /tmp/galera-23.2.1-amd64.deb http://launchpad.net/galera/2.x/23.2.1/+download/galera-23.2.1-amd64.deb --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install MySQL and Galera. '''Note:''' If you are prompted to create a root password during the Galera package installation, please make note of the password you use as it will be needed when connecting to MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;dpkg -i /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb&lt;br /&gt;
dpkg -i /tmp/galera-23.2.1-amd64.deb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the MySQL bind address: &lt;br /&gt;
&amp;lt;pre&amp;gt;sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the following line to /etc/rc.local on all controllers to allow MySQL to start automatically upon reboot: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.41&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.42&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.43&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt;It is important to understand the [http://www.codership.com/wiki/doku.php?id=mysql_options_0.8 gcomm address] concept behind [http://www.codership.com/ Galera]. Only use an empty gcomm:// address when you create a NEW cluster. Never use it when your intention is to reconnect to an existing one. After the Galera cluster is established, you should change the gcomm address on control01 from gcomm:// to gcomm://192.168.220.42 or gcomm://192.168.220.43. Otherwise, control01 will not join the cluster upon reboot. Make sure to also restart the mysql service when making changes to any of the associated configuration files. &lt;br /&gt;
&lt;br /&gt;
Restart MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the Galera cluster has been established. The value should show 4 for all nodes in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | Variable_name      | Value |&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | wsrep_local_state  |    4  |&lt;br /&gt;
  +------------------------+---+&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Monitoring  ====&lt;br /&gt;
Complete each of the steps below on each control node except for when a single node is specified.&lt;br /&gt;
&lt;br /&gt;
Install xinetd: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y xinetd&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the mysqlchk service: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/mysqlchk -P /etc/xinetd.d/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' After functional testing is complete, it's recommended to secure the mysqlchk service. This can be accomplished by editing the only_from and per_source values in /etc/xinetd.d/ to the subnet used by the load-balancer nodes. &lt;br /&gt;
&lt;br /&gt;
Edit /etc/xinetd.d/mysqlchk by changing &amp;amp;lt;%= mysqlchk_script_dir&amp;amp;nbsp;%&amp;amp;gt;/galera_chk to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure root is the file owner: &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
If not, change the file permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the mysqlcheck service to /etc/services by adding the following line: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysqlchk        9200/tcp                        # MySQL Galera health check script&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the MySQL Galera health check script: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/galera_chk -P /usr/local/bin/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the file ownership and permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /usr/local/bin/galera_chk &lt;br /&gt;
chmod +x  /usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /usr/local/bin/galera_chk as follows. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41). &lt;br /&gt;
&amp;lt;pre&amp;gt;MYSQL_HOST=&amp;quot;[CONTROLLER_MGT_IP]&amp;quot;&lt;br /&gt;
MYSQL_PORT=&amp;quot;3306&amp;quot;&lt;br /&gt;
MYSQL_USERNAME=&amp;quot;mysqlchk_user&amp;quot;&lt;br /&gt;
MYSQL_PASSWORD=&amp;quot;mysqlchk_password&amp;quot;&lt;br /&gt;
MYSQL_OPTS=&amp;quot;-N -q -A&amp;quot;&lt;br /&gt;
TMP_FILE=&amp;quot;/dev/shm/mysqlchk.$$.out&amp;quot;&lt;br /&gt;
ERR_FILE=&amp;quot;/dev/shm/mysqlchk.$$.err&amp;quot;&lt;br /&gt;
FORCE_FAIL=&amp;quot;/dev/shm/proxyoff&amp;quot;&lt;br /&gt;
MYSQL_BIN=&amp;quot;/usr/bin/mysql&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart xinetsd: &lt;br /&gt;
&amp;lt;pre&amp;gt;service xinetd restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Connect to MySQL and add the mysqlchk user to each controller in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
use mysql;&lt;br /&gt;
INSERT INTO user (Host,User,Password) VALUES('%','mysqlchk_user',PASSWORD('mysqlchk_password'));&lt;br /&gt;
flush privileges;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Grant privileges for the mysqlchk user. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41).: &lt;br /&gt;
&amp;lt;pre&amp;gt;grant SUPER,PROCESS on *.* to 'mysqlchk_user'@'[CONTROLLER_MGT_IP]' IDENTIFIED BY 'mysqlchk_password';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the operational status of the MySQL Galera health check service. From slb01 or slb02, Telnet using port 9200 (health check port) and make sure you get a &amp;quot;MySQL is running&amp;quot; message: &lt;br /&gt;
&amp;lt;pre&amp;gt;telnet 192.168.220.41 9200&lt;br /&gt;
Trying 192.168.220.41...&lt;br /&gt;
Connected to 192.168.220.41.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Content-Type: text/html&lt;br /&gt;
Content-Length: 43&lt;br /&gt;
&amp;amp;lt;html&amp;amp;gt;&amp;amp;lt;body&amp;amp;gt;MySQL is running.&amp;amp;lt;/body&amp;amp;gt;&amp;amp;lt;/html&amp;amp;gt;&lt;br /&gt;
Connection closed by foreign host.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Repeat the previous step for each control node. &lt;br /&gt;
&lt;br /&gt;
Verify that you can access the MySQL database by using the Virtual IP address (VIP) of the Galera cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -umysqlchk_user -pmysqlchk_password -h192.168.220.40&amp;lt;/pre&amp;gt; &lt;br /&gt;
For informational purposes, this is the command used by the health check script. This example is for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql -N -q -A --host=192.168.220.41 --user=mysqlchk_user --password=mysqlchk_password -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RabbitMQ Installation  ====&lt;br /&gt;
Complete each of the following steps on each control node unless a specific node is called out.&lt;br /&gt;
&lt;br /&gt;
Install RabbitMQ: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y rabbitmq-server&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure RabbitMQ Clustering. First, stop the service and remove the mnesia database on all control nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server stop&lt;br /&gt;
rm -rf /var/lib/rabbitmq/mnesia&amp;lt;/pre&amp;gt; &lt;br /&gt;
Clustering requires that the nodes have the same Erlang cookie. Copy the Erlang cookie from control01 to control02 and control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.42:/var/lib/rabbitmq/.erlang.cookie&lt;br /&gt;
scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.43:/var/lib/rabbitmq/.erlang.cookie&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The above command requires root login (disabled by default in Ubuntu). If you do not have root permissions, copy the Erlang cookie from /var/lib/rabbitmq/ to the /tmp directory of control02 and control03 and then to /var/lib/rabbitmq/. Also, make sure the file permissions match on all 3 nodes. &lt;br /&gt;
&lt;br /&gt;
Now that all 3 control nodes have the same Erlang cookie, make sure that RabbitMQ will start: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server start&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' If RabbitMQ does not successfully start, do not proceed with clustering.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Clustering can be configured using rabbitmqctl commands or by modifying the RabbitMQ configuration file. Our example uses the rabbitmqctl commands since issues were experienced using the configuration file with RabbitMQ 2.7.1. You can see both approaches to configuring RabbitMQ clustering [http://www.rabbitmq.com/clustering.html#setup here]. &lt;br /&gt;
&lt;br /&gt;
In order to cluster the three control nodes, two of the nodes (i.e. rabbit@control2 and rabbit@control03) will be configured to join the cluster of the third node (rabbit@control01). '''Note:''' Joining a cluster implicitly resets the node, thus removing all resources and data that were previously present on that node. &lt;br /&gt;
&lt;br /&gt;
From control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control02 is now clustered with control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control02 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
From control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control03 is now clustered with control01 and control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control03 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02,rabbit@control03]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02,rabbit@control03]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Now that clustering is complete, secure RabbitMQ by removing the default (guest) user: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl delete_user guest&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a RabbitMQ user account that will be used by OpenStack services: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl add_user openstack_rabbit_user openstack_rabbit_password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the permissions for the new RabbitMQ user account: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl set_permissions -p / openstack_rabbit_user &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the user settings: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl list_users&lt;br /&gt;
rabbitmqctl list_user_permissions openstack_rabbit_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keystone Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Keystone on every control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keystone python-keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Remove the sqllite db: &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/keystone/keystone.db&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Keystone. The database needs to be created on only 1 control node. &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE keystone;&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'%' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'localhost' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' From other controllers in the cluster, you can see that databases are replicated by Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show databases;&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/keystone/keystone.conf file on each controller. Change [CONTROLLER_MGT_IP] to the management IP address of the control node (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
admin_token = keystone_admin_token&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
&lt;br /&gt;
[sql]&lt;br /&gt;
connection = mysql://keystone_admin:keystone_db_pass@192.168.220.40/keystone&lt;br /&gt;
&lt;br /&gt;
[ssl]&lt;br /&gt;
enable = False&lt;br /&gt;
&lt;br /&gt;
[signing]&lt;br /&gt;
token_format = UUID&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a credential file and load it so credentials are not required for every OpenStack client command. '''Note:''' This needs to be created on each node that you will run OpenStack commands from: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that MySQL is listening on the VIP for the Keystone database. If you have any problems connecting to the VIP, try the real IP address of a control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -h192.168.220.40 -ukeystone_admin -pkeystone_db_pass keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keystone: &lt;br /&gt;
&amp;lt;pre&amp;gt;service keystone restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh Keystone data script](Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;ADMIN_PASSWORD=${ADMIN_PASSWORD:-keystone_admin}&lt;br /&gt;
export SERVICE_TOKEN=&amp;quot;keystone_admin_token&amp;quot;&lt;br /&gt;
export SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0/&amp;quot;&lt;br /&gt;
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-services}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with data (users, tenants, services). '''Note:''' If you see a long timeout and errors about &amp;quot;connection timeout&amp;quot;, it may be related to your proxy setting. Remove the export of your http/https proxies and re-run the script. You will have to re-add your proxies for any other external downloads. &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://github.com/EmilienM/openstack-folsom-guide/blob/master/scripts/keystone-endpoints.sh Keystone endpoint script] (Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;# MySQL definitions&lt;br /&gt;
MYSQL_USER=keystone_admin&lt;br /&gt;
MYSQL_DATABASE=keystone&lt;br /&gt;
MYSQL_HOST=192.168.220.40&lt;br /&gt;
MYSQL_PASSWORD=keystone_db_pass&lt;br /&gt;
&lt;br /&gt;
# Keystone definitions&lt;br /&gt;
KEYSTONE_REGION=RegionOne&lt;br /&gt;
SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# other definitions&lt;br /&gt;
MASTER=&amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
SWIFT_MASTER=&amp;quot;192.168.220.60&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with service endpoints. Again, if you are using proxies then you will need remove them from your export before running this command: &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Test connectivity to Keystone by using a curl request&amp;amp;nbsp;: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install curl openssl -y&lt;br /&gt;
&lt;br /&gt;
curl -d '{&amp;quot;auth&amp;quot;: {&amp;quot;tenantName&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;passwordCredentials&amp;quot;:{&amp;quot;username&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;password&amp;quot;: &amp;quot;keystone_admin&amp;quot;}}}' -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens | python -mjson.tool&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the above command is successful, you will receive output that includes a token and a list of service endpoints.&amp;amp;nbsp;You may also want to verify the other service account credentials: &lt;br /&gt;
&lt;br /&gt;
'''Glance''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;glance\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Nova''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;nova\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Swift''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Quantum''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;quantum\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Cinder''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;cinder\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can also use the Keystone client to verify the configuration: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
keystone user-list&lt;br /&gt;
keystone role-list&lt;br /&gt;
keystone service-list&lt;br /&gt;
keystone endpoint-list&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Glance Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Glance API and Registry packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y glance-api glance-registry&amp;lt;/pre&amp;gt; &lt;br /&gt;
Delete the glance.sqlite file created in the /var/lib/glance/ directory &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/glance/glance.sqlite&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Glance on only 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE glance;&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-api.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41). Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
default_store = swift&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
registry_host = 192.168.220.40&lt;br /&gt;
swift_store_auth_address = http://192.168.220.40:5000/v2.0/&lt;br /&gt;
swift_store_user = services:swift&lt;br /&gt;
swift_store_key = keystone_admin&lt;br /&gt;
swift_store_container = glance&lt;br /&gt;
swift_store_create_container_on_put = True&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone+cachemanagement&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-registry.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41) Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the glance-api and glance-registry services: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-api restart; service glance-registry restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
The database tables are under version control and you use the following command on a new installation to prevent the Image service from breaking possible upgrades. This command is used on only one of the controllers: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage version_control 0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the glance database on one control node (You may get a message about deprecation - you can ignore): &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the services again to take into account the new modifications: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-registry restart; service glance-api restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the Cirros 0.3.1 cloud image to a controller node and then upload it to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-disk.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;cirros&amp;quot; is_public=true disk_format=qcow2 container_format=ovf &amp;amp;lt; cirros-0.3.1-x86_64-disk.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that Glance is serving the image: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance image-list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, you can add the Ubuntu Precise image to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
 &lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum Server on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y quantum-server quantum-plugin-openvswitch&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Quantum database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE quantum; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'%' IDENTIFIED BY 'quantum_pass'; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'localhost' IDENTIFIED BY 'quantum_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/quantum/quantum.conf file on all control nodes. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = quantum&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/quantum/keystone-signing&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1&lt;br /&gt;
bridge_mappings = physnet1:br-ex &lt;br /&gt;
&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the quantum server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-server restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova software packages on all Control Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-api nova-conductor nova-consoleauth nova-scheduler nova-novncproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Nova database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE nova;&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the authtoken section in the /etc/nova/api-paste.ini file on each control node to include the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = nova&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [CONTROLLER_MGT_IP] with the controller node's management IP address (i.e. control01 = 192.168.220.41). Do this on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
dhcpbridge_flagfile=/etc/nova/nova.conf&lt;br /&gt;
dhcpbridge=/usr/bin/nova-dhcpbridge&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
verbose=true&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
image_service=nova.image.glance.GlanceImageService&lt;br /&gt;
rpc_backend=nova.rpc.impl_kombu&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
service_down_time=60&lt;br /&gt;
rabbit_port=5672&lt;br /&gt;
rabbit_virtual_host=/&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
ec2_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
enabled_apis=ec2,osapi_compute&lt;br /&gt;
osapi_compute_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
novncproxy_port=6080&lt;br /&gt;
novncproxy_host=0.0.0.0&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
novncproxy_host=[CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Synchronize the Nova database (You may get a DEBUG message - You can ignore this). '''Note:''' The db sync needs to be completed on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Due to [https://bugs.launchpad.net/nova/+bug/1158958 bug 1158958], Nova API must be patched to support memcached instead of the in-process cache. First, see if Nova needs to be patched by grep'ing the file that needs to be patched. You will receive no output if the file needs to be patched. You will receive host = str(instance.get('host')) if the file does not need patching: &lt;br /&gt;
&amp;lt;pre&amp;gt;grep &amp;quot;str(instance.get('host'))&amp;quot; /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the extended_availability_zone.py file needs patching, download the patched file: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/dflorea/nova/grizzly/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the patched extended_availability_zone.py to the /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;cp extended_availability_zone.py /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure the file is owned by root:root. &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If&amp;amp;nbsp;extended_availability_zone.py is not owned by root, then change the file ownership: &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod root:root /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart nova-* services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/init.d/; for i in $( ls nova-* ); do sudo service $i restart; done&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Also check that nova-api is running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-api status&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Cinder software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-api cinder-scheduler&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Cinder MySQL database on 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE cinder;&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/api-paste.ini file on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
service_protocol = http&lt;br /&gt;
service_host = 192.168.220.40&lt;br /&gt;
service_port = 5000&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = cinder&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/cinder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf configuration file on each control node. '''Note:''' The default volume_group is being changed from cinder-volumes to nova-volumes. As mentioned in the Critical Reminders section, an LVM Volume Group named nova-volumes must exist on each Compute Node. &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30 &lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Initialize the Cinder database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;cinder-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Cinder services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-api restart&lt;br /&gt;
service cinder-scheduler restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Horizon Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Horizon software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y memcached libapache2-mod-wsgi openstack-dashboard&amp;lt;/pre&amp;gt; &lt;br /&gt;
Next, modify the /etc/openstack-dashboard/local_settings.py file as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;CACHES = {&lt;br /&gt;
    'default': {&lt;br /&gt;
        'BACKEND'&amp;amp;nbsp;: 'django.core.cache.backends.memcached.MemcachedCache',&lt;br /&gt;
        'LOCATION'&amp;amp;nbsp;: '[CONTROLLER_MGT_IP]:11211'&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
OPENSTACK_HOST = &amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
OPENSTACK_KEYSTONE_URL = &amp;quot;http://%s:5000/v2.0&amp;quot;&amp;amp;nbsp;% OPENSTACK_HOST&lt;br /&gt;
OPENSTACK_KEYSTONE_DEFAULT_ROLE = &amp;quot;Member&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the memcached listening address in /etc/memcached.conf. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;-l [CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Reload Apache and memcached on each control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service apache2 restart; service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Access Horizon by using the following URL in your web browser. Use '''admin/keystone_admin''' for your login credentials. &amp;amp;nbsp;If you have problems accessing Horizon by using the VIP (192.168.220.40), then try using a real IP address of a control node (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;http://192.168.220.40/horizon&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, if you would like to remove the Ubuntu theme: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get purge -y openstack-dashboard-ubuntu-theme&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Compute Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Follow these steps for compute01, compute02 and compute03 compute nodes. &lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum software packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install quantum-plugin-openvswitch quantum-plugin-openvswitch-agent quantum-dhcp-agent&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check the status of the Open vSwitch services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch status&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Open vSwitch services on each compute node if they are not running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Nodes require OVS bridges named &amp;quot;br-int&amp;quot; and &amp;quot;br-ex&amp;quot;, and that &amp;quot;br-ex&amp;quot; is associated with the Public Network interface (eth1 in our example): &lt;br /&gt;
&amp;lt;pre&amp;gt;ovs-vsctl add-br br-int&lt;br /&gt;
ovs-vsctl add-br br-ex&lt;br /&gt;
ovs-vsctl add-port br-ex eth1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the Quantum configuration file /etc/quantum/quantum.conf with the following. '''Note:''' Make sure the names in rabbit_hosts= resolve: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini with: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the database section&lt;br /&gt;
[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following under the OVS section. &amp;amp;nbsp; '''Note:''' 223:225 signifies the VLAN ID range used for tenant VLANs. Modify this range based on your deployment needs. These VLANs should be trunked to eth1 of Compute Nodes and you must create a gateway address (i.e. 192.168.223.1 for VLAN 223) on your upstream Layer-3 device. &lt;br /&gt;
&amp;lt;pre&amp;gt;[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1:223:225&lt;br /&gt;
bridge_mappings = physnet1:br-ex&lt;br /&gt;
&lt;br /&gt;
# Using Quantum Security Groups instead of Nova Security Groups&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Update the /etc/quantum/dhcp_agent.ini: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
# Required to run multiple Quantum DHCP agents&lt;br /&gt;
use_component_ext = True&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Quantum services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-plugin-openvswitch-agent restart&lt;br /&gt;
service quantum-dhcp-agent restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova Compute software package on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-compute&amp;lt;/pre&amp;gt; &lt;br /&gt;
The deployment uses config_drive instead of Nova Metadata. Install the genisoimage package used by config_drive: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y genisoimage&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that the authtoken section in the /etc/nova/api-paste.ini file includes the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 127.0.0.1&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name =&amp;amp;nbsp;%SERVICE_TENANT_NAME%&lt;br /&gt;
admin_user =&amp;amp;nbsp;%SERVICE_USER%&lt;br /&gt;
admin_password =&amp;amp;nbsp;%SERVICE_PASSWORD%&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
force_config_drive=true&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
verbose=true&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_host=192.168.220.40&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
vncserver_proxyclient_address=[COMPUTE_MGT_IP]&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
vncserver_listen=[COMPUTE_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Restart the nova-compute service on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-compute restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt; Create a credentials file so you can issue OpenStack client commands from the Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing Cinder software packages on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-volume&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
iscsi_ip_address=[COMPUTE_MGT_IP]&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Cinder services on all compute nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-volume restart&lt;br /&gt;
service tgt restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring OpenStack Networking (Quantum) and Deploying the First VM  ===&lt;br /&gt;
&lt;br /&gt;
Run the following commands from either a Compute Node or Controller Node. If something has to be done on a specific node it will be called out. '''Note:''' If you have an issue with a Quantum command no being found, you may need to do the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y python-pip&lt;br /&gt;
pip install -U cliff&amp;lt;/pre&amp;gt; &lt;br /&gt;
Obtain the tenant ID and create your first tenant network. Create additional networks and associated subnets as needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
quantum net-create public223 --tenant_id &amp;amp;lt;tenant-id&amp;amp;gt; --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 223&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create your first tenant subnet and associate it to the network you created in the previous step. The example below uses .10-.250 for Instance IP addresses. Modify the allocation-pool and dns_nameservers based on your deployment needs. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum subnet-create --name 223-subnet --allocation-pool start=192.168.223.10,end=192.168.223.250 public223 192.168.223.0/24 --dns_nameservers list=true 192.168.26.186&amp;lt;/pre&amp;gt; &lt;br /&gt;
If you skipped the earlier step of downloading an image and uploading it to glance, do that now: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
*'''On a Compute Node''' create an SSH keypair and add the public key to Nova. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Leave the passphrase empty when creating the keypair. If you have an issue with the Nova commands not being found, you will need to to install the nova client support:&lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install python-novaclient&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;ssh-keygen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;cd ~/.ssh/&lt;br /&gt;
nova keypair-add --pub_key id_rsa.pub &amp;amp;lt;key_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova keypair-add --pub_key id_rsa.pub net-key&amp;lt;/pre&amp;gt; &lt;br /&gt;
Before booting the instance, check for the ID of the network we created earlier. Note: the &amp;amp;lt;quantum_net_id&amp;amp;gt; value will come from the output of the &amp;quot;quantum net-list&amp;quot; command: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum net-list&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name &amp;amp;lt;key_name&amp;amp;gt; --nic net-id=&amp;amp;lt;quantum_net_id&amp;amp;gt; &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name net-key --nic net-id=f9035744-72a9-42cf-bd46-73d54c0cea06 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Watch the status of the instance: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
The instance is booted completely when the OS-EXT-STS:vm_state is &amp;quot;active&amp;quot;. Make note of the IP address of the VM. Alternatively, you can watch the complete log of the VM booting by running: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova console-log --length=25 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the default Quantum Security Group to allow ingress traffic to Instances. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Security Group rules are associated to a specific tenant. The &amp;amp;lt;tenant-id&amp;amp;gt; can be found from the output of keystone tenant-list. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
This example allows all ICMP and SSH traffic: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should now be able to ping the VM as well as SSH into it from the host that you used to create the key you associated with the VM during the boot phase.&lt;/div&gt;</summary>
		<author><name>Shmcfarl</name></author>	</entry>

	<entry>
		<id>http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide</id>
		<title>COE Grizzly Release: High-Availability Manual Installation Guide</title>
		<link rel="alternate" type="text/html" href="http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide"/>
				<updated>2013-04-24T18:56:49Z</updated>
		
		<summary type="html">&lt;p&gt;Shmcfarl: /* Configuring OpenStack Networking (Quantum) and Deploying the First VM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
There are two common ways of installing [http://docs.openstack.org/ OpenStack], manually or by using automation tools. There is much focus on the full automation of OpenStack deployments using tools such as [http://puppetlabs.com/ Puppet], [http://www.opscode.com/chef/ Chef], [https://juju.ubuntu.com/ JuJu] and others. While these tools offer great advantages over manual configuration, they do hide the OpenStack installation and configuration details. This document can be used by those interested in learning more about the OpenStack Grizzly High-Availability (HA) installation process or for those not interested in using automation tools to deploy HA. The document covers the following OpenStack software components: &lt;br /&gt;
&lt;br /&gt;
*[http://glance.openstack.org/ Glance] (Image Service) &lt;br /&gt;
*[http://keystone.openstack.org/ Keystone] (Identity Service) &lt;br /&gt;
*[http://nova.openstack.org/ Nova] (Compute Service) &lt;br /&gt;
*[http://horizon.openstack.org/ Horizon] (OpenStack Dashboard Web User Interface) &lt;br /&gt;
*[http://docs.openstack.org/developer/quantum/ Quantum] (Network Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/cinder/ Cinder] (Block Storage Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/swift/ Swift] (Object Storage Service)&lt;br /&gt;
&lt;br /&gt;
== Dependencies  ==&lt;br /&gt;
&lt;br /&gt;
=== Critical Reminders  ===&lt;br /&gt;
&lt;br /&gt;
The most common OpenStack HA deployment issues are either incorrect configuration files or not deploying the nodes in the proper order. To save you from future troubleshooting steps, ENSURE that you deploy the nodes in the order described within the document and verify the accuracy of all configuration files. You will likely be using your own IP addressing and passwords in your setup and it is critical to ensure any variations from this guide are fully understood. &lt;br /&gt;
&lt;br /&gt;
Do not configure RAID on the hard disks of Swift Storage Nodes. Swift performs better without RAID and disk redundancy is unneeded since Swift protects the data through replication. Therefore, if a RAID Controller manages the hard disks, ensure you present each of the hard disks independently. Our example uses disk /dev/sda for the Operating System installation and disks /dev/sdb-/dev/sdf for Swift storage. Please remember to modify these definitions based on your specific deployment environment. Additional Swift considerations and tuning information can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/considerations-and-tuning.html here]. &lt;br /&gt;
&lt;br /&gt;
Compute Nodes run Cinder Volume to provide block storage services to Instances. The default Cinder driver (volume_driver=nova.volume.driver.ISCSIDriver) is an iSCSI solution that employs the use of Linux Logical Volume Manager (LVM). Therefore, you must create an LVM Volume Group either during the Ubuntu Precise installation or [http://docs.openstack.org/trunk/openstack-compute/admin/content/cinder-install.html afterwards]. The name of the LVM Volume Group must match the volume_group definition in cinder.conf. Our example uses the name nova-volumes for the LVM Volume Group and associated cinder.conf volume_group name. &lt;br /&gt;
&lt;br /&gt;
The password used in our examples is keystone_admin. Every account, service and configuration file uses this one password. You will want to change this in your setup and you certainly want to use a strong password and a different password for each account/service if this system is going into production.&lt;br /&gt;
&lt;br /&gt;
=== Operating System  ===&lt;br /&gt;
&lt;br /&gt;
The operating system used for this installation is Ubuntu 12.04 LTS (Precise). &lt;br /&gt;
&lt;br /&gt;
=== Server Requirements  ===&lt;br /&gt;
&lt;br /&gt;
Our deployment uses 13 Cisco UCS C-series servers to serve the roles of Controller, Compute, Load-Balancer and Swift Proxy/Storage. The environment scales linearly, therefore individual nodes can be added to increase capacity for any particular OpenStack service. The five distinct node types used in this document are: &lt;br /&gt;
&lt;br /&gt;
*'''3 Controller Nodes-'''&amp;amp;nbsp;Runs Nova API, Nova Conductor, Nova Consoleauth, Nova Novncproxy, Nova Scheduler, NoVNC, Quantum Server, Quantum Plugin OVS, Glance API/Registry, Keystone, Cinder API, Cinder Scheduler, OpenStack Dashboard, RabbitMQ Server, MySQL Server WSREP and Galera. &lt;br /&gt;
**Provides management functionality of the OpenStack environment.&lt;br /&gt;
&lt;br /&gt;
*'''3 Compute Nodes-'''&amp;amp;nbsp;Runs Nova Compute, Quantum OVS and DHCP Agents, Cinder Volume and TGT services. &lt;br /&gt;
**Provides the hypervisor role for running Nova instances (Virtual Machines) and presents LVM volumes for Cinder block storage.&lt;br /&gt;
&lt;br /&gt;
*'''2 Load-Balancer Nodes-'''&amp;amp;nbsp;Runs HAProxy and Keepalived to load-balance traffic across Controller and Swift Proxy clusters.&lt;br /&gt;
&lt;br /&gt;
*'''2 Swift Proxy Nodes-'''&amp;amp;nbsp;The Proxy Node is responsible for tying together users and their data within the the Swift object storage system. For each request, it will look up the location of the account, container or object in the Swift ring and route the request accordingly. The public API is also exposed by Proxy Node.&lt;br /&gt;
&lt;br /&gt;
*'''3 Swift Storage Nodes-'''&amp;amp;nbsp;Each Storage Nodes contains Swift object, container, and account services. At a very high-level, these are the servers that contain the user data and perform replication among one another to keep the system in a consistent state.&lt;br /&gt;
&lt;br /&gt;
=== Networking Requirements  ===&lt;br /&gt;
&lt;br /&gt;
The OpenStack HA environment uses five separate networks. Three of the five networks are used by Tenants. Three tenant networks are being used as an example, and thus the tenant networks can be increased or decreased based on your deployment needs. Connectivity within Tenants uses Quantum with the Open vSwitch (OVS) plugin and [http://docs.openstack.org/trunk/openstack-network/admin/content/provider_networks.html Provider Network Extensions]. Provider Network Extensions allow cloud administrators to create OpenStack networks that map directly to physical networks in the data center and support local, VLAN and GRE deployment models. Our example uses the Provider VLAN networking model. The network details are as follows: &lt;br /&gt;
&lt;br /&gt;
*'''1 Management Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used to perform management functions against the node. For example, SSH'ing to the nodes to change a configuration setting. The network is also used for lights-out management using the CIMC interface of the UCS servers. Lastly, OpenStack API's and the Horizon web dashboard is associated to this network. &lt;br /&gt;
**An IP address for each node is required for this network. If using lights-out management such as CIMC, each node will require 2 addresses from this network. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]). &lt;br /&gt;
*'''3 Tenant Networks'''&amp;lt;br&amp;gt; &lt;br /&gt;
**These networks are used to provide connectivity to Instances. Since Quantum Provider Networking Extensions are being used, it is common to give tenants direct access to a &amp;quot;public&amp;quot; network that can be used to reach the Internet. &lt;br /&gt;
**Compute Nodes will have an interface attached to this network. Since the Compute Node interfaces that attach to this network are managed by OVS, they should not contain an IP address. &lt;br /&gt;
**This network typically employs publicly routable IP addressing if external NAT'ing is not used upstream towards the Internet edge ('''Note:''' in this document all IP addressing for all interfaces comes out of various private addressing blocks). &lt;br /&gt;
*'''1 Storage Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used for providing separate connectivity between Swift Proxy and Storage Nodes. This ensures storage traffic is not interfering with Instance traffic. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]) IP addressing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''[http://docwiki.cisco.com/w/images/a/a8/Grizzly-ha-network-design-details-v1.0.png Figure 1]''' is used to help visualize the network deployment and to act as a reference for configuration steps within the document. It is highly recommend to print the diagram so it can easily be referenced throughout the installation process.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;u&amp;gt;'''Figure 1:'''&amp;lt;/u&amp;gt;'''OpenStack HA Network Design Details''' &lt;br /&gt;
&lt;br /&gt;
[[Image:Grizzly-ha-network-design-details-v1.0.png|thumb|left]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''Other Network Services'''&amp;lt;br&amp;gt; &lt;br /&gt;
**'''DNS: '''In this setup an external DNS server (192.168.26.186) is used for name resolution of OpenStack nodes and external name resolution. If DNS is not being used, the /etc/hosts file should include the following for all nodes:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 127.0.0.1	localhost&lt;br /&gt;
 192.168.220.40  control.dmz-pod2.lab		control&lt;br /&gt;
 192.168.220.41  control01.dmz-pod2.lab	        control01&lt;br /&gt;
 192.168.220.42  control02.dmz-pod2.lab  	control02&lt;br /&gt;
 192.168.220.43  control03.dmz-pod2.lab  	control03&lt;br /&gt;
 192.168.220.60  swiftproxy.dmz-pod2.lab	        swiftproxy&lt;br /&gt;
 192.168.220.61  swiftproxy01.dmz-pod2.lab	swiftproxy01&lt;br /&gt;
 192.168.220.62  swiftproxy02.dmz-pod2.lab	swiftproxy02&lt;br /&gt;
 192.168.220.51  compute01.dmz-pod2.lab          compute01&lt;br /&gt;
 192.168.220.52  compute02.dmz-pod2.lab          compute02&lt;br /&gt;
 192.168.220.53  compute03.dmz-pod2.lab          compute03&lt;br /&gt;
&lt;br /&gt;
*'''NTP: '''In this setup an external NTP server(s) is used for time synchronization. &lt;br /&gt;
*'''Physical Network Switches:''' Each node in this setup is physically attached to a Cisco Nexus switch acting as a Top-of-Rack access layer device. Trunking is configured on each interface connecting to the eth0 NIC of each node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Upstream routers/aggregation layer switches will most likely be terminating the Layer-3 VLAN interfaces. If these interfaces are deployed in a redundant fashion with a First Hop Redundancy Protocol such as HSRP or VRRP, then you should be careful of the IP addresses assigned to the physical L3 switches/routers as they may conflict with the IP address of the Quantum router's public subnet (.3 by default). For example, if you are using HSRP and you have .1 as the standby IP address, .2 as the first L3 switch IP and .3 as the second L3 switch IP, you will receive a duplicate IP address error on the second L3 switch. This can be worked around by using high-order IPs on your upstream L3 device or altering the Quantum subnet configuration at the time of creation to have an IP starting range higher than the physical switches/routers are using (i.e. .4 and higher). Our example uses an IP allocation range that starts with .10 to avoid this issue.&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
The installation of the nodes should be in the following order: &lt;br /&gt;
&lt;br /&gt;
#'''Load-Balancer Nodes-''' slb01 and slb02 &lt;br /&gt;
#'''Swift Storage Nodes-''' swift01, swift02 and swift03 &lt;br /&gt;
#'''Swift Proxy Nodes-''' swiftproxy01 and swiftproxy02 &lt;br /&gt;
#'''Controller Nodes-''' control01, control02 and control03 &lt;br /&gt;
#'''Compute Nodes- '''compute01, compute02 and compute03&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Nodes  ===&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu Precise 12.04 Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Ubuntu 12.04 (AMD 64-bit) from CD/ISO or automated install (i.e. kickstart). You can reference Section 4 in the [http://docwiki.cisco.com/wiki/OpenStack:Essex_Build_Node#Starting_the_Ubuntu_Installation Build Node Guide] if you are unfamiliar with the Ubuntu Precise installation process. Use the following networking section to configure your network adapter properties for each node. As previously mentioned in the Critical Reminders Section, make sure to create an LVM Volume Group named nova-volumes for Compute Nodes and do not configure RAID for Swift Storage Nodes. Lastly, select ssh-server as the only additional package during the Ubuntu Precise installation. &lt;br /&gt;
&lt;br /&gt;
==== Grizzly Packages  ====&lt;br /&gt;
&lt;br /&gt;
The [https://launchpad.net/~openstack-ubuntu-testing/+archive/grizzly-trunk-testing Ubuntu Testers Team] manages the repository used by this document for OpenStack Grizzly packaging. Although the repository supports Ubuntu Precise and Raring releases, the document is only based on Precise. The Ubuntu Testers PPA should be used for all OpenStack nodes (i.e. not needed for Load-Balancer nodes). &lt;br /&gt;
&lt;br /&gt;
Use sudo mode or run from root account for the entire installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the Ubuntu Grizzly repository: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install python-software-properties -y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;apt-add-repository ppa:openstack-ubuntu-testing/grizzly-trunk-testing&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' Press enter when you are prompted for “[ENTER] or cancel” when adding the PPA. Update your system: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get update&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Networking  ====&lt;br /&gt;
&lt;br /&gt;
Our implementation uses VLANs for segmentation of certain networks. Make sure the VLAN package is installed and your network switches have been configured for VLANs. Otherwise, replicate the network setup using only physical interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install vlan -y&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.81&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.82&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Proxy Node swiftproxy01 /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Proxy Node swiftproxy02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.62&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.62&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.41&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.42&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.43&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.51&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.52&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.53&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart networking: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/networking restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Time Synchronization  ====&lt;br /&gt;
&lt;br /&gt;
Install NTP: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y ntp&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add your NTP server(s) by editing /etc/ntp.conf. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; OpenStack requires that clocks be synchronized. Our example uses a '''FAKE '''server called ntp.corp.com as the NTP server. Make sure you change&amp;amp;nbsp;ntp.corp.com to your real NTP server. Lastly, make sure the NTP server name resolves. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/ntp.conf&lt;br /&gt;
&lt;br /&gt;
server ntp.corp.com&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart NTP for the changes to take effect &lt;br /&gt;
&amp;lt;pre&amp;gt;service ntp restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that you are pulling time: &lt;br /&gt;
&amp;lt;pre&amp;gt;ntpq -p&lt;br /&gt;
&lt;br /&gt;
remote           refid      st t when poll reach   delay   offset  jitter&lt;br /&gt;
==============================================================================&lt;br /&gt;
*ntp.corp.       .GPS.            1 u  185  512  377   76.035    0.053   0.033&lt;br /&gt;
 cheezum.mattnor 129.7.1.66       2 u   8d 1024    0   47.731   -0.555   0.000&lt;br /&gt;
 ntp2.rescomp.be .STEP.          16 u    - 1024    0    0.000    0.000   0.000&lt;br /&gt;
 216.45.57.38    204.123.2.5      2 u  54h 1024    0   12.607    0.808   0.000&lt;br /&gt;
 lithium.constan 128.4.1.1        2 u   8d 1024    0   69.861    0.206   0.000&lt;br /&gt;
 europium.canoni 193.79.237.14    2 u  54h 1024    0  144.040   -1.455   0.000&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load Balancer Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Perform the following steps on nodes slb01 and slb02. &lt;br /&gt;
&lt;br /&gt;
==== Keepalived &amp;amp;amp; HAProxy  ====&lt;br /&gt;
&lt;br /&gt;
Edit /etc/sysctl.conf to allow Keepalived to associate a virtual IP address (VIP) that is not directly bound to an interface on the node:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;net.ipv4.ip_nonlocal_bind=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load in sysctl settings from /etc/sysctl.conf: &lt;br /&gt;
&amp;lt;pre&amp;gt;sysctl -p&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install Keepalived and HAProxy packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keepalived haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the /var/lib/haproxy directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /var/lib/haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure /var/lib/haproxy is owned by root. Change the file ownership if needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /var/lib/haproxy/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the&amp;amp;nbsp;/etc/keepalived/keepalived.conf file for slb01 with the contents below.&amp;amp;nbsp; Change&amp;amp;nbsp;[YOUR_DOMAIN_NAME] with your actual domain name.&amp;amp;nbsp; The keepalived.conf includes the following sections:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global_defs-''' Global parameters affect the whole process behavior.&amp;amp;nbsp;There may be several 'global' sections if needed, but their parameters will only be merged. &amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_script-''' Keepalived supports a VRRP scripting framework to extend base functionality.&amp;amp;nbsp; The vrrp_script named haproxy will check the status of the haproxy service every 2 seconds and add 2 points of priority if the status is running. &amp;amp;nbsp;If the haproxy service is not running, the backup HAProxy Node will become the primary and begin passing traffic for the virtual_ipaddress(es).&amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_instance-''' Is where you define configuration paramters for virtual gateway addresses.&amp;amp;nbsp; slb01 is configured as the primary gateway for 192.168.220.40 (Controller Cluster) and the backup gateway for 192.168.220.60 (Swift Proxy Cluster). Accordingly, slb02 is configured as the primary for 192.168.220.60 and the backup for 192.168.220.40.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb01&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure /etc/keepalived/keepalived.conf for slb02 with the following contents. Change [YOUR_DOMAIN_NAME] with your actual domain name. &lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb02&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb01 with the contents below. HAProxy's configuration process involves 3 major sources of parameters:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*The arguments from the command-line, which always take precedence.&amp;lt;br&amp;gt; &lt;br /&gt;
*The &amp;quot;global&amp;quot; section, which sets process-wide parameters.&amp;lt;br&amp;gt; &lt;br /&gt;
*The proxies sections which can take form of &amp;quot;defaults&amp;quot;, &amp;quot;listen&amp;quot;, &amp;quot;frontend&amp;quot; and &amp;quot;backend&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following provides additional details of the haproxy.cfg file:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global-&amp;amp;nbsp; '''Sets process-wide parameters for load-balancing traffic.&amp;amp;nbsp; Global parameters can be overriden by server-specific configurations within the''listen section ''of the haproxy.cfg file.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''defaults-''' The &amp;quot;defaults&amp;quot; section sets default parameters for all other sections following its declaration. Those default parameters are reset by the next &amp;quot;defaults&amp;quot; section. The name is optional but its use is encouraged for better readability.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''listen-''' A &amp;quot;listen&amp;quot; section defines a complete proxy with its front-end (i.e. listening VIP) and back-end (i.e. real IP of servers)&amp;amp;nbsp;parts combined in one section. Currently two major proxy modes are supported: &amp;quot;tcp&amp;quot;, also known as layer 4 and &amp;quot;http&amp;quot;, also known as layer 7. In layer 4 mode, HAProxy simply forwards bidirectional traffic between two sides. In layer 7 mode, HAProxy analyzes the protocol and can interact with it by allowing, blocking, switching, adding, modifying, or removing arbitrary content in requests or responses based on configurable criteria.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
 chroot  /var/lib/haproxy&lt;br /&gt;
 daemon  &lt;br /&gt;
 group  haproxy&lt;br /&gt;
 log  192.168.220.81 local0&lt;br /&gt;
 maxconn  4000&lt;br /&gt;
 pidfile  /var/run/haproxy.pid&lt;br /&gt;
 user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
 log  global&lt;br /&gt;
 maxconn  8000&lt;br /&gt;
 option  redispatch&lt;br /&gt;
 retries  3&lt;br /&gt;
 timeout  http-request 10s&lt;br /&gt;
 timeout  queue 1m&lt;br /&gt;
 timeout  connect 10s&lt;br /&gt;
 timeout  client 1m&lt;br /&gt;
 timeout  server 1m&lt;br /&gt;
 timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
 bind 192.168.220.40:80&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
 bind 192.168.220.40:3306&lt;br /&gt;
 balance  source&lt;br /&gt;
 mode  tcp&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9292&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
 bind 192.168.220.40:9191&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
 bind 192.168.220.40:35357&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
 bind 192.168.220.40:5000&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
 bind 192.168.220.40:11211&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
 bind 192.168.220.40:8773&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
 bind 192.168.220.40:8774&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
 bind 192.168.220.40:8775&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
 bind 192.168.220.40:8776&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
 bind 192.168.220.40:6080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9696&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
 bind 192.168.220.60:8080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb02 with the contents below. &lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
  chroot  /var/lib/haproxy&lt;br /&gt;
  daemon  &lt;br /&gt;
  group  haproxy&lt;br /&gt;
  log  192.168.220.82 local0&lt;br /&gt;
  maxconn  4000&lt;br /&gt;
  pidfile  /var/run/haproxy.pid&lt;br /&gt;
  user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
  log  global&lt;br /&gt;
  maxconn  8000&lt;br /&gt;
  option  redispatch&lt;br /&gt;
  retries  3&lt;br /&gt;
  timeout  http-request 10s&lt;br /&gt;
  timeout  queue 1m&lt;br /&gt;
  timeout  connect 10s&lt;br /&gt;
  timeout  client 1m&lt;br /&gt;
  timeout  server 1m&lt;br /&gt;
  timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
  bind 192.168.220.40:80&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
  bind 192.168.220.40:3306&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9292&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
  bind 192.168.220.40:9191&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
  bind 192.168.220.40:35357&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
  bind 192.168.220.40:5000&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
  bind 192.168.220.40:11211&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
  bind 192.168.220.40:8773&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
  bind 192.168.220.40:8774&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
  bind 192.168.220.40:8775&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
  bind 192.168.220.40:8776&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
  bind 192.168.220.40:6080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9696&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
  bind 192.168.220.60:8080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set &amp;quot;ENABLED&amp;quot; to &amp;quot;1&amp;quot; in /etc/default/haproxy &lt;br /&gt;
&amp;lt;pre&amp;gt;ENABLED=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keepalived and HAProxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/keepalived restart&lt;br /&gt;
/etc/init.d/haproxy restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Swift Nodes&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Install Swift and other basic packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift openssh-server rsync memcached python-netifaces python-xattr python-memcache &amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir -p /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration file. '''Note:''' This file should be identical on all Swift nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/swift.conf&lt;br /&gt;
&lt;br /&gt;
[swift-hash]&lt;br /&gt;
swift_hash_path_suffix = Gdr8ny7YyWqy2&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the Swift directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Storage Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Run these commands on nodes swift01, swift02 and swift03. Install the Swift Storage Node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-account swift-container swift-object xfsprogs parted&amp;lt;/pre&amp;gt; &lt;br /&gt;
For each of the hard disks other than the Ubuntu installation disk (i.e. /dev/sda), create an XFS volume with a single partition. Our example uses five hard disks (/dev/sdb - /dev/sdf) per Storage Node. Repeat this step for each disk that will be used for Swift storage: &lt;br /&gt;
&amp;lt;pre&amp;gt;parted /dev/sdb mklabel msdos&lt;br /&gt;
parted -a optimal /dev/sdb mkpart primary ext2 0% 100%&lt;br /&gt;
mkfs.xfs -i size=1024 /dev/sdb1&lt;br /&gt;
echo &amp;quot;/dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0&amp;quot; &amp;amp;gt;&amp;amp;gt; /etc/fstab&lt;br /&gt;
mkdir -p /srv/node/sdb1&lt;br /&gt;
mount /srv/node/sdb1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the mount directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /srv/node&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create an Rsync configuration file on each Storage Node. In the following example, replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/rsyncd.conf&lt;br /&gt;
&lt;br /&gt;
uid = swift&lt;br /&gt;
gid = swift&lt;br /&gt;
log file = /var/log/rsyncd.log&lt;br /&gt;
pid file = /var/run/rsyncd.pid&lt;br /&gt;
address = [STORAGE_NET_IP]&lt;br /&gt;
&lt;br /&gt;
[account]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/account.lock&lt;br /&gt;
&lt;br /&gt;
[container]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/container.lock&lt;br /&gt;
&lt;br /&gt;
[object]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/object.lock&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following line in /etc/default/rsync: &lt;br /&gt;
&amp;lt;pre&amp;gt;RSYNC_ENABLE = true&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start rsync daemon: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rsync start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/account-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/account-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = account-server&lt;br /&gt;
&lt;br /&gt;
[app:account-server]&lt;br /&gt;
use = egg:swift#account&lt;br /&gt;
&lt;br /&gt;
[account-replicator]&lt;br /&gt;
&lt;br /&gt;
[account-auditor]&lt;br /&gt;
&lt;br /&gt;
[account-reaper]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/container-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/container-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = container-server&lt;br /&gt;
&lt;br /&gt;
[app:container-server]&lt;br /&gt;
use = egg:swift#container&lt;br /&gt;
&lt;br /&gt;
[container-replicator]&lt;br /&gt;
&lt;br /&gt;
[container-updater]&lt;br /&gt;
&lt;br /&gt;
[container-auditor]&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Create /etc/swift/object-server.conf&amp;amp;nbsp;with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71):&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/object-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = object-server&lt;br /&gt;
&lt;br /&gt;
[app:object-server]&lt;br /&gt;
use = egg:swift#object&lt;br /&gt;
&lt;br /&gt;
[object-replicator]&lt;br /&gt;
&lt;br /&gt;
[object-updater]&lt;br /&gt;
&lt;br /&gt;
[object-auditor]&lt;br /&gt;
&lt;br /&gt;
[object-expirer]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the storage services. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; At this point, the ring files will not be present on the storage nodes. This will cause the *-replicator services to fail to start properly. After you create the ring files on the first proxy node (in the next section) and distribute them to the storage nodes, a service restart should allow all Swift services to start properly. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init object-server start&lt;br /&gt;
swift-init object-replicator start&lt;br /&gt;
swift-init object-updater start&lt;br /&gt;
swift-init object-auditor start&lt;br /&gt;
swift-init container-server start&lt;br /&gt;
swift-init container-replicator start&lt;br /&gt;
swift-init container-updater start&lt;br /&gt;
swift-init container-auditor start&lt;br /&gt;
swift-init account-server start&lt;br /&gt;
swift-init account-replicator start&lt;br /&gt;
swift-init account-auditor start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height: 1.5em;&amp;quot;&amp;gt;Make sure you repeat these steps for every Storage Node.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Proxy Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Ensure you have completed the previous steps in the &amp;quot;General Installation Steps for All Swift Nodes&amp;quot; section. &lt;br /&gt;
&lt;br /&gt;
Perform these steps on nodes swiftproxy01 and swiftproxy02. First, install the proxy node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-proxy memcached python-keystoneclient python-swiftclient swift-plugin-s3&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify memcached to bind to the storage network interface (192.168.222.x in our example). Edit the following line in /etc/memcached.conf, changing: &lt;br /&gt;
&amp;lt;pre&amp;gt;-l 127.0.0.1 &lt;br /&gt;
to&lt;br /&gt;
-l [STORAGE_NET_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the memcached server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
If it does not exist, create the /etc/swift/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /etc/swift/&amp;lt;/pre&amp;gt; &lt;br /&gt;
If /etc/swift and /var/cache/swift directories are not owned by the swift user and group, then change the ownership of the directories: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift/&lt;br /&gt;
chown -R swift:swift /var/cache/swift/&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create /etc/swift/proxy-server.conf with the following contents: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_port = 8080&lt;br /&gt;
workers = 32&lt;br /&gt;
user = swift&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = catch_errors healthcheck cache ratelimit authtoken keystoneauth proxy-server&lt;br /&gt;
&lt;br /&gt;
[app:proxy-server]&lt;br /&gt;
use = egg:swift#proxy&lt;br /&gt;
allow_account_management = true&lt;br /&gt;
account_autocreate = true&lt;br /&gt;
&lt;br /&gt;
[filter:keystoneauth]&lt;br /&gt;
use = egg:swift#keystoneauth&lt;br /&gt;
operator_roles = Member,admin, swiftoperator&lt;br /&gt;
&lt;br /&gt;
[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
signing_dir = /var/cache/swift&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
auth_uri = http://192.168.220.40:5000&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = swift&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
delay_auth_decision = 10&lt;br /&gt;
&lt;br /&gt;
[filter:cache]&lt;br /&gt;
use = egg:swift#memcache&lt;br /&gt;
memcache_servers = 192.168.222.61:11211,192.168.222.62:11211&lt;br /&gt;
&lt;br /&gt;
[filter:catch_errors]&lt;br /&gt;
use = egg:swift#catch_errors&lt;br /&gt;
&lt;br /&gt;
[filter:healthcheck]&lt;br /&gt;
use = egg:swift#healthcheck&lt;br /&gt;
&lt;br /&gt;
[filter:ratelimit]&lt;br /&gt;
use = egg:swift#ratelimit&lt;br /&gt;
clock_accuracy = 1000&lt;br /&gt;
max_sleep_time_seconds = 60&lt;br /&gt;
log_sleep_time_seconds = 0&lt;br /&gt;
rate_buffer_seconds = 5&lt;br /&gt;
account_ratelimit = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, create the account, container and object rings. The builder command is basically creating a builder file with a few parameters. The parameter with the value of 18 represents 2 ^ 18th, this is the value of the partition size. Set this “partition power” value based on the total amount of storage you expect your entire ring to use. The value of 3 represents the number of replicas of each object, with the last value being the number of hours to restrict moving a partition more than once. Additional information regarding Swift ring preperation can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/preparing-the-ring.html here]. &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/swift&lt;br /&gt;
&lt;br /&gt;
swift-ring-builder account.builder create 18 3 1&lt;br /&gt;
swift-ring-builder container.builder create 18 3 1&lt;br /&gt;
swift-ring-builder object.builder create 18 3 1&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, for every storage device on each storage node add entries to each ring. This example prepares the account, container and object rings for storage node swift01 (192.168.222.71) with a partition in zone 1. The mount point of this partition is /srv/node/sdb1 and the path in rsyncd.conf is /srv/node/, the DEVICE would be sdb1 and the commands would look like: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder add z1-192.168.222.71:6002/sdb1 100&lt;br /&gt;
swift-ring-builder container.builder add z1-192.168.222.71:6001/sdb1 100&lt;br /&gt;
swift-ring-builder object.builder add z1-192.168.222.71:6000/sdb1 100&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Make sure not to place all devices in the same zone (i.e. z1). It is recommended to configure the zones as high-level as possible to create the greatest amount of isolation. Some considerations can include physical location, power availability, and network connectivity. For example, in a small cluster you might decide to split the zones up by cabinet, with each cabinet having its own power and network connectivity. Since our deployment only uses 3 storage nodes, each node should be in its own zone. However, it is recommended to have a minimum of 5 zones in a production-level Swift deployment. &lt;br /&gt;
&lt;br /&gt;
Verify the ring contents for each ring: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
swift-ring-builder /etc/swift/container.builder&lt;br /&gt;
swift-ring-builder /etc/swift/object.builder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Your output should look similar to this: &lt;br /&gt;
&amp;lt;pre&amp;gt;root@swiftproxy01:~# swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
/etc/swift/account.builder, build version 15&lt;br /&gt;
262144 partitions, 3 replicas, 3 zones, 15 devices, 0.00 balance&lt;br /&gt;
The minimum number of hours before a partition can be reassigned is 1&lt;br /&gt;
Devices:    id  zone      ip address  port      name weight partitions balance meta&lt;br /&gt;
             0     3  192.168.222.73  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
             1     2  192.168.222.72  6002      sdd1   1.00      52429    0.00 &lt;br /&gt;
             2     3  192.168.222.73  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             3     2  192.168.222.72  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             4     3  192.168.222.73  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             5     1  192.168.222.71  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             6     1  192.168.222.71  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             7     2  192.168.222.72  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
             8     1  192.168.222.71  6002      sdd1   1.00      52428   -0.00 &lt;br /&gt;
             9     2  192.168.222.72  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
            10     1  192.168.222.71  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
            11     1  192.168.222.71  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            12     3  192.168.222.73  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            13     2  192.168.222.72  6002      sde1   1.00      52428   -0.00 &lt;br /&gt;
            14     3  192.168.222.73  6002      sdd1   1.00      52428   -0.00&amp;lt;/pre&amp;gt; &lt;br /&gt;
Rebalance the rings. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Rebalancing rings can take a while. You may get a message about a balance value and that you need to rebalance/push after the minimum 1 hour. If so, recheck the status after an hour. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder rebalance&lt;br /&gt;
swift-ring-builder container.builder rebalance&lt;br /&gt;
swift-ring-builder object.builder rebalance&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the account.ring.gz, container.ring.gz, and object.ring.gz files to swiftproxy02 and the 3 storage nodes in /etc/swift. &lt;br /&gt;
&lt;br /&gt;
Make sure all the config files are owned by the swift user: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Proxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init proxy start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verify the Swift Installation  ===&lt;br /&gt;
&lt;br /&gt;
You can run verification commands from the proxy server or any server with access to Keystone. Keep in mind that proxy nodes are configured to use Keystone for user authentication. As a result, you '''MUST''' complete the Controller Node Installation steps and ensure Keystone is operational before proceeding with Swift verification. &lt;br /&gt;
&lt;br /&gt;
Verify that you can successfully authenticate against Keystone using the Swift authentication credentials: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y curl&lt;br /&gt;
&lt;br /&gt;
curl -s -d &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should receive output similar to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;access&amp;quot;: {&amp;quot;token&amp;quot;: {&amp;quot;issued_at&amp;quot;: &amp;quot;2013-04-02T14:55:31.149327&amp;quot;, &amp;quot;expires&amp;quot;: &amp;quot;2013-04-03T14:55:31Z&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;bb29ef5439ce4a75bf85332bbadf6538&amp;quot;, &amp;quot;tenant&amp;quot;: {&amp;quot;description&amp;quot;: &lt;br /&gt;
null, &amp;quot;enabled&amp;quot;: true, &amp;quot;id&amp;quot;: &amp;quot;b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;services&amp;quot;}}, &amp;quot;serviceCatalog&amp;quot;: [{&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;45a336cb74e04e11ab95c0ea28b699d6&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;compute&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;nova&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;259fef5e66814f47ac1934d3cf522a3d&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;network&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;quantum&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [&lt;br /&gt;
{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;166de3790eb54c31a58237fe9ea3d301&amp;quot;, &lt;br /&gt;
&amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;image&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;glance&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;0a2c69157d5948a9ae8ecee5c65a6d2b&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;volume&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;cinder&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Admin&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &lt;br /&gt;
&amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;05f85b8aacbd4c87b680dcc2fb6da539&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;}], &lt;br /&gt;
&amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;ec2&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;ec2&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.60:8080/v1&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;4a1af526137341c0a682eb573101ddde&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;object-store&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;3e3f7b50b5bd44b7a15b3e4ae55086bf&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;identity&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;keystone&amp;quot;}], &amp;quot;user&amp;quot;: {&amp;quot;username&amp;quot;: &amp;quot;swift&amp;quot;, &amp;quot;roles_links&amp;quot;: [], &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;ed69664ac78a4b65a36d63da6b760863&amp;quot;, &amp;quot;roles&amp;quot;: [{&amp;quot;name&amp;quot;: &amp;quot;_member_&amp;quot;}, {&amp;quot;name&amp;quot;: &amp;quot;admin&amp;quot;}], &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, &amp;quot;metadata&amp;quot;: {&amp;quot;is_admin&amp;quot;: 0, &amp;quot;roles&amp;quot;: [&lt;br /&gt;
&amp;quot;9fe2ff9ee4384b1894a90878d3e92bab&amp;quot;, &amp;quot;6a553ae3be3c4f8c8fe079830d4102a5&amp;quot;]}}}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Use the swift client stat command to make sure you can view the contents of the ring.&amp;amp;nbsp;You can run these commands from the proxy server or any server with the swift client and access to Keystone. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U admin:admin -K keystone_admin stat&lt;br /&gt;
   Account: AUTH_3eccdb2a9331419c96ac9ff336110b65&lt;br /&gt;
Containers: 1&lt;br /&gt;
   Objects: 2&lt;br /&gt;
     Bytes: 0&lt;br /&gt;
Accept-Ranges: bytes&lt;br /&gt;
X-Timestamp: 1363989109.30329&lt;br /&gt;
X-Trans-Id: tx147dd9983ac54af1b71c5a561ae2aa9a&lt;br /&gt;
Content-Type: text/plain; charset=utf-8&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can see that 1 container exists. &amp;amp;nbsp;Now, lets find out the name of the container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list&lt;br /&gt;
glance&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The glance container is created after the Controller cluster is built and an image has been uploaded to Glance. &lt;br /&gt;
&lt;br /&gt;
List the contents of the Glance container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list glance&lt;br /&gt;
24164630-ba2f-436a-8bc6-43975717d5e5&lt;br /&gt;
858a11dc-ed61-4a18-a778-eabcb454ae45&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Controller Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Runs these commands on nodes control01, control02 and control03. &amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install MySQL and Galera dependencies: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y libaio1 libssl0.9.8 mysql-client-5.5 python-mysqldb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download MySQL-WSREP and Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget -O /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb http://launchpad.net/codership-mysql/5.5/5.5.23-23.6/+download/mysql-server-wsrep-5.5.23-23.6-amd64.deb --no-check-certificate&lt;br /&gt;
wget -O /tmp/galera-23.2.1-amd64.deb http://launchpad.net/galera/2.x/23.2.1/+download/galera-23.2.1-amd64.deb --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install MySQL and Galera. '''Note:''' If you are prompted to create a root password during the Galera package installation, please make note of the password you use as it will be needed when connecting to MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;dpkg -i /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb&lt;br /&gt;
dpkg -i /tmp/galera-23.2.1-amd64.deb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the MySQL bind address: &lt;br /&gt;
&amp;lt;pre&amp;gt;sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the following line to /etc/rc.local on all controllers to allow MySQL to start automatically upon reboot: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.41&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.42&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.43&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt;It is important to understand the [http://www.codership.com/wiki/doku.php?id=mysql_options_0.8 gcomm address] concept behind [http://www.codership.com/ Galera]. Only use an empty gcomm:// address when you create a NEW cluster. Never use it when your intention is to reconnect to an existing one. After the Galera cluster is established, you should change the gcomm address on control01 from gcomm:// to gcomm://192.168.220.42 or gcomm://192.168.220.43. Otherwise, control01 will not join the cluster upon reboot. Make sure to also restart the mysql service when making changes to any of the associated configuration files. &lt;br /&gt;
&lt;br /&gt;
Restart MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the Galera cluster has been established. The value should show 4 for all nodes in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | Variable_name      | Value |&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | wsrep_local_state  |    4  |&lt;br /&gt;
  +------------------------+---+&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Monitoring  ====&lt;br /&gt;
Complete each of the steps below on each control node except for when a single node is specified.&lt;br /&gt;
&lt;br /&gt;
Install xinetd: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y xinetd&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the mysqlchk service: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/mysqlchk -P /etc/xinetd.d/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' After functional testing is complete, it's recommended to secure the mysqlchk service. This can be accomplished by editing the only_from and per_source values in /etc/xinetd.d/ to the subnet used by the load-balancer nodes. &lt;br /&gt;
&lt;br /&gt;
Edit /etc/xinetd.d/mysqlchk by changing &amp;amp;lt;%= mysqlchk_script_dir&amp;amp;nbsp;%&amp;amp;gt;/galera_chk to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure root is the file owner: &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
If not, change the file permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the mysqlcheck service to /etc/services by adding the following line: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysqlchk        9200/tcp                        # MySQL Galera health check script&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the MySQL Galera health check script: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/galera_chk -P /usr/local/bin/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the file ownership and permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /usr/local/bin/galera_chk &lt;br /&gt;
chmod +x  /usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /usr/local/bin/galera_chk as follows. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41). &lt;br /&gt;
&amp;lt;pre&amp;gt;MYSQL_HOST=&amp;quot;[CONTROLLER_MGT_IP]&amp;quot;&lt;br /&gt;
MYSQL_PORT=&amp;quot;3306&amp;quot;&lt;br /&gt;
MYSQL_USERNAME=&amp;quot;mysqlchk_user&amp;quot;&lt;br /&gt;
MYSQL_PASSWORD=&amp;quot;mysqlchk_password&amp;quot;&lt;br /&gt;
MYSQL_OPTS=&amp;quot;-N -q -A&amp;quot;&lt;br /&gt;
TMP_FILE=&amp;quot;/dev/shm/mysqlchk.$$.out&amp;quot;&lt;br /&gt;
ERR_FILE=&amp;quot;/dev/shm/mysqlchk.$$.err&amp;quot;&lt;br /&gt;
FORCE_FAIL=&amp;quot;/dev/shm/proxyoff&amp;quot;&lt;br /&gt;
MYSQL_BIN=&amp;quot;/usr/bin/mysql&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart xinetsd: &lt;br /&gt;
&amp;lt;pre&amp;gt;service xinetd restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Connect to MySQL and add the mysqlchk user to each controller in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
use mysql;&lt;br /&gt;
INSERT INTO user (Host,User,Password) VALUES('%','mysqlchk_user',PASSWORD('mysqlchk_password'));&lt;br /&gt;
flush privileges;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Grant privileges for the mysqlchk user. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41).: &lt;br /&gt;
&amp;lt;pre&amp;gt;grant SUPER,PROCESS on *.* to 'mysqlchk_user'@'[CONTROLLER_MGT_IP]' IDENTIFIED BY 'mysqlchk_password';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the operational status of the MySQL Galera health check service. From slb01 or slb02, Telnet using port 9200 (health check port) and make sure you get a &amp;quot;MySQL is running&amp;quot; message: &lt;br /&gt;
&amp;lt;pre&amp;gt;telnet 192.168.220.41 9200&lt;br /&gt;
Trying 192.168.220.41...&lt;br /&gt;
Connected to 192.168.220.41.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Content-Type: text/html&lt;br /&gt;
Content-Length: 43&lt;br /&gt;
&amp;amp;lt;html&amp;amp;gt;&amp;amp;lt;body&amp;amp;gt;MySQL is running.&amp;amp;lt;/body&amp;amp;gt;&amp;amp;lt;/html&amp;amp;gt;&lt;br /&gt;
Connection closed by foreign host.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Repeat the previous step for each control node. &lt;br /&gt;
&lt;br /&gt;
Verify that you can access the MySQL database by using the Virtual IP address (VIP) of the Galera cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -umysqlchk_user -pmysqlchk_password -h192.168.220.40&amp;lt;/pre&amp;gt; &lt;br /&gt;
For informational purposes, this is the command used by the health check script. This example is for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql -N -q -A --host=192.168.220.41 --user=mysqlchk_user --password=mysqlchk_password -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RabbitMQ Installation  ====&lt;br /&gt;
Complete each of the following steps on each control node unless a specific node is called out.&lt;br /&gt;
&lt;br /&gt;
Install RabbitMQ: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y rabbitmq-server&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure RabbitMQ Clustering. First, stop the service and remove the mnesia database on all control nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server stop&lt;br /&gt;
rm -rf /var/lib/rabbitmq/mnesia&amp;lt;/pre&amp;gt; &lt;br /&gt;
Clustering requires that the nodes have the same Erlang cookie. Copy the Erlang cookie from control01 to control02 and control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.42:/var/lib/rabbitmq/.erlang.cookie&lt;br /&gt;
scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.43:/var/lib/rabbitmq/.erlang.cookie&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The above command requires root login (disabled by default in Ubuntu). If you do not have root permissions, copy the Erlang cookie from /var/lib/rabbitmq/ to the /tmp directory of control02 and control03 and then to /var/lib/rabbitmq/. Also, make sure the file permissions match on all 3 nodes. &lt;br /&gt;
&lt;br /&gt;
Now that all 3 control nodes have the same Erlang cookie, make sure that RabbitMQ will start: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server start&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' If RabbitMQ does not successfully start, do not proceed with clustering.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Clustering can be configured using rabbitmqctl commands or by modifying the RabbitMQ configuration file. Our example uses the rabbitmqctl commands since issues were experienced using the configuration file with RabbitMQ 2.7.1. You can see both approaches to configuring RabbitMQ clustering [http://www.rabbitmq.com/clustering.html#setup here]. &lt;br /&gt;
&lt;br /&gt;
In order to cluster the three control nodes, two of the nodes (i.e. rabbit@control2 and rabbit@control03) will be configured to join the cluster of the third node (rabbit@control01). '''Note:''' Joining a cluster implicitly resets the node, thus removing all resources and data that were previously present on that node. &lt;br /&gt;
&lt;br /&gt;
From control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control02 is now clustered with control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control02 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
From control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control03 is now clustered with control01 and control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control03 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02,rabbit@control03]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02,rabbit@control03]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Now that clustering is complete, secure RabbitMQ by removing the default (guest) user: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl delete_user guest&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a RabbitMQ user account that will be used by OpenStack services: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl add_user openstack_rabbit_user openstack_rabbit_password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the permissions for the new RabbitMQ user account: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl set_permissions -p / openstack_rabbit_user &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the user settings: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl list_users&lt;br /&gt;
rabbitmqctl list_user_permissions openstack_rabbit_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keystone Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Keystone on every control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keystone python-keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Remove the sqllite db: &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/keystone/keystone.db&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Keystone. The database needs to be created on only 1 control node. &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE keystone;&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'%' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'localhost' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' From other controllers in the cluster, you can see that databases are replicated by Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show databases;&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/keystone/keystone.conf file on each controller. Change [CONTROLLER_MGT_IP] to the management IP address of the control node (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
admin_token = keystone_admin_token&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
&lt;br /&gt;
[sql]&lt;br /&gt;
connection = mysql://keystone_admin:keystone_db_pass@192.168.220.40/keystone&lt;br /&gt;
&lt;br /&gt;
[ssl]&lt;br /&gt;
enable = False&lt;br /&gt;
&lt;br /&gt;
[signing]&lt;br /&gt;
token_format = UUID&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a credential file and load it so credentials are not required for every OpenStack client command. '''Note:''' This needs to be created on each node that you will run OpenStack commands from: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that MySQL is listening on the VIP for the Keystone database. If you have any problems connecting to the VIP, try the real IP address of a control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -h192.168.220.40 -ukeystone_admin -pkeystone_db_pass keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keystone: &lt;br /&gt;
&amp;lt;pre&amp;gt;service keystone restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh Keystone data script](Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;ADMIN_PASSWORD=${ADMIN_PASSWORD:-keystone_admin}&lt;br /&gt;
export SERVICE_TOKEN=&amp;quot;keystone_admin_token&amp;quot;&lt;br /&gt;
export SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0/&amp;quot;&lt;br /&gt;
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-services}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with data (users, tenants, services). '''Note:''' If you see a long timeout and errors about &amp;quot;connection timeout&amp;quot;, it may be related to your proxy setting. Remove the export of your http/https proxies and re-run the script. You will have to re-add your proxies for any other external downloads. &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://github.com/EmilienM/openstack-folsom-guide/blob/master/scripts/keystone-endpoints.sh Keystone endpoint script] (Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;# MySQL definitions&lt;br /&gt;
MYSQL_USER=keystone_admin&lt;br /&gt;
MYSQL_DATABASE=keystone&lt;br /&gt;
MYSQL_HOST=192.168.220.40&lt;br /&gt;
MYSQL_PASSWORD=keystone_db_pass&lt;br /&gt;
&lt;br /&gt;
# Keystone definitions&lt;br /&gt;
KEYSTONE_REGION=RegionOne&lt;br /&gt;
SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# other definitions&lt;br /&gt;
MASTER=&amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
SWIFT_MASTER=&amp;quot;192.168.220.60&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with service endpoints. Again, if you are using proxies then you will need remove them from your export before running this command: &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Test connectivity to Keystone by using a curl request&amp;amp;nbsp;: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install curl openssl -y&lt;br /&gt;
&lt;br /&gt;
curl -d '{&amp;quot;auth&amp;quot;: {&amp;quot;tenantName&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;passwordCredentials&amp;quot;:{&amp;quot;username&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;password&amp;quot;: &amp;quot;keystone_admin&amp;quot;}}}' -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens | python -mjson.tool&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the above command is successful, you will receive output that includes a token and a list of service endpoints.&amp;amp;nbsp;You may also want to verify the other service account credentials: &lt;br /&gt;
&lt;br /&gt;
'''Glance''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;glance\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Nova''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;nova\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Swift''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Quantum''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;quantum\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Cinder''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;cinder\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can also use the Keystone client to verify the configuration: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
keystone user-list&lt;br /&gt;
keystone role-list&lt;br /&gt;
keystone service-list&lt;br /&gt;
keystone endpoint-list&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Glance Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Glance API and Registry packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y glance-api glance-registry&amp;lt;/pre&amp;gt; &lt;br /&gt;
Delete the glance.sqlite file created in the /var/lib/glance/ directory &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/glance/glance.sqlite&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Glance on only 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE glance;&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-api.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41). Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
default_store = swift&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
registry_host = 192.168.220.40&lt;br /&gt;
swift_store_auth_address = http://192.168.220.40:5000/v2.0/&lt;br /&gt;
swift_store_user = services:swift&lt;br /&gt;
swift_store_key = keystone_admin&lt;br /&gt;
swift_store_container = glance&lt;br /&gt;
swift_store_create_container_on_put = True&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone+cachemanagement&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-registry.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41) Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the glance-api and glance-registry services: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-api restart; service glance-registry restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
The database tables are under version control and you use the following command on a new installation to prevent the Image service from breaking possible upgrades. This command is used on only one of the controllers: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage version_control 0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the glance database on one control node (You may get a message about deprecation - you can ignore): &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the services again to take into account the new modifications: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-registry restart; service glance-api restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the Cirros 0.3.1 cloud image to a controller node and then upload it to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-disk.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;cirros&amp;quot; is_public=true disk_format=qcow2 container_format=ovf &amp;amp;lt; cirros-0.3.1-x86_64-disk.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that Glance is serving the image: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance image-list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, you can add the Ubuntu Precise image to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
 &lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum Server on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y quantum-server quantum-plugin-openvswitch&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Quantum database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE quantum; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'%' IDENTIFIED BY 'quantum_pass'; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'localhost' IDENTIFIED BY 'quantum_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/quantum/quantum.conf file on all control nodes. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = quantum&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/quantum/keystone-signing&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1&lt;br /&gt;
bridge_mappings = physnet1:br-ex &lt;br /&gt;
&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the quantum server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-server restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova software packages on all Control Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-api nova-conductor nova-consoleauth nova-scheduler nova-novncproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Nova database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE nova;&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the authtoken section in the /etc/nova/api-paste.ini file on each control node to include the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = nova&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [CONTROLLER_MGT_IP] with the controller node's management IP address (i.e. control01 = 192.168.220.41). Do this on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
dhcpbridge_flagfile=/etc/nova/nova.conf&lt;br /&gt;
dhcpbridge=/usr/bin/nova-dhcpbridge&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
verbose=true&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
image_service=nova.image.glance.GlanceImageService&lt;br /&gt;
rpc_backend=nova.rpc.impl_kombu&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
service_down_time=60&lt;br /&gt;
rabbit_port=5672&lt;br /&gt;
rabbit_virtual_host=/&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
ec2_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
enabled_apis=ec2,osapi_compute&lt;br /&gt;
osapi_compute_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
novncproxy_port=6080&lt;br /&gt;
novncproxy_host=0.0.0.0&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
novncproxy_host=[CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Synchronize the Nova database (You may get a DEBUG message - You can ignore this). '''Note:''' The db sync needs to be completed on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Due to [https://bugs.launchpad.net/nova/+bug/1158958 bug 1158958], Nova API must be patched to support memcached instead of the in-process cache. First, see if Nova needs to be patched by grep'ing the file that needs to be patched. You will receive no output if the file needs to be patched. You will receive host = str(instance.get('host')) if the file does not need patching: &lt;br /&gt;
&amp;lt;pre&amp;gt;grep &amp;quot;str(instance.get('host'))&amp;quot; /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the extended_availability_zone.py file needs patching, download the patched file: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/dflorea/nova/grizzly/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the patched extended_availability_zone.py to the /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;cp extended_availability_zone.py /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure the file is owned by root:root. &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If&amp;amp;nbsp;extended_availability_zone.py is not owned by root, then change the file ownership: &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod root:root /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart nova-* services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/init.d/; for i in $( ls nova-* ); do sudo service $i restart; done&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Also check that nova-api is running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-api status&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Cinder software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-api cinder-scheduler&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Cinder MySQL database on 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE cinder;&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/api-paste.ini file on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
service_protocol = http&lt;br /&gt;
service_host = 192.168.220.40&lt;br /&gt;
service_port = 5000&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = cinder&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/cinder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf configuration file on each control node. '''Note:''' The default volume_group is being changed from cinder-volumes to nova-volumes. As mentioned in the Critical Reminders section, an LVM Volume Group named nova-volumes must exist on each Compute Node. &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30 &lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Initialize the Cinder database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;cinder-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Cinder services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-api restart&lt;br /&gt;
service cinder-scheduler restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Horizon Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Horizon software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y memcached libapache2-mod-wsgi openstack-dashboard&amp;lt;/pre&amp;gt; &lt;br /&gt;
Next, modify the /etc/openstack-dashboard/local_settings.py file as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;CACHES = {&lt;br /&gt;
    'default': {&lt;br /&gt;
        'BACKEND'&amp;amp;nbsp;: 'django.core.cache.backends.memcached.MemcachedCache',&lt;br /&gt;
        'LOCATION'&amp;amp;nbsp;: '[CONTROLLER_MGT_IP]:11211'&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
OPENSTACK_HOST = &amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
OPENSTACK_KEYSTONE_URL = &amp;quot;http://%s:5000/v2.0&amp;quot;&amp;amp;nbsp;% OPENSTACK_HOST&lt;br /&gt;
OPENSTACK_KEYSTONE_DEFAULT_ROLE = &amp;quot;Member&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the memcached listening address in /etc/memcached.conf. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;-l [CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Reload Apache and memcached on each control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service apache2 restart; service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Access Horizon by using the following URL in your web browser. Use '''admin/keystone_admin''' for your login credentials. &amp;amp;nbsp;If you have problems accessing Horizon by using the VIP (192.168.220.40), then try using a real IP address of a control node (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;http://192.168.220.40/horizon&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, if you would like to remove the Ubuntu theme: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get purge -y openstack-dashboard-ubuntu-theme&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Compute Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Follow these steps for compute01, compute02 and compute03 compute nodes. &lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum software packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install quantum-plugin-openvswitch quantum-plugin-openvswitch-agent quantum-dhcp-agent&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check the status of the Open vSwitch services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch status&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Open vSwitch services on each compute node if they are not running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Nodes require OVS bridges named &amp;quot;br-int&amp;quot; and &amp;quot;br-ex&amp;quot;, and that &amp;quot;br-ex&amp;quot; is associated with the Public Network interface (eth1 in our example): &lt;br /&gt;
&amp;lt;pre&amp;gt;ovs-vsctl add-br br-int&lt;br /&gt;
ovs-vsctl add-br br-ex&lt;br /&gt;
ovs-vsctl add-port br-ex eth1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the Quantum configuration file /etc/quantum/quantum.conf with the following. '''Note:''' Make sure the names in rabbit_hosts= resolve: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini with: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the database section&lt;br /&gt;
[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following under the OVS section. &amp;amp;nbsp; '''Note:''' 223:225 signifies the VLAN ID range used for tenant VLANs. Modify this range based on your deployment needs. These VLANs should be trunked to eth1 of Compute Nodes and you must create a gateway address (i.e. 192.168.223.1 for VLAN 223) on your upstream Layer-3 device. &lt;br /&gt;
&amp;lt;pre&amp;gt;[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1:223:225&lt;br /&gt;
bridge_mappings = physnet1:br-ex&lt;br /&gt;
&lt;br /&gt;
# Using Quantum Security Groups instead of Nova Security Groups&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Update the /etc/quantum/dhcp_agent.ini: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
# Required to run multiple Quantum DHCP agents&lt;br /&gt;
use_component_ext = True&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Quantum services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-plugin-openvswitch-agent restart&lt;br /&gt;
service quantum-dhcp-agent restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova Compute software package on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-compute&amp;lt;/pre&amp;gt; &lt;br /&gt;
The deployment uses config_drive instead of Nova Metadata. Install the genisoimage package used by config_drive: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y genisoimage&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that the authtoken section in the /etc/nova/api-paste.ini file includes the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 127.0.0.1&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name =&amp;amp;nbsp;%SERVICE_TENANT_NAME%&lt;br /&gt;
admin_user =&amp;amp;nbsp;%SERVICE_USER%&lt;br /&gt;
admin_password =&amp;amp;nbsp;%SERVICE_PASSWORD%&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
force_config_drive=true&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
verbose=true&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_host=192.168.220.40&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
vncserver_proxyclient_address=[COMPUTE_MGT_IP]&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
vncserver_listen=[COMPUTE_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Restart the nova-compute service on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-compute restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt; Create a credentials file so you can issue OpenStack client commands from the Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing Cinder software packages on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-volume&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
iscsi_ip_address=[COMPUTE_MGT_IP]&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Cinder services on all compute nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-volume restart&lt;br /&gt;
service tgt restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring OpenStack Networking (Quantum) and Deploying the First VM  ===&lt;br /&gt;
&lt;br /&gt;
Run the following commands from either a Compute Node or Controller Node. If something has to be done on a specific node it will be called out. '''Note:''' If you have an issue with a Quantum command no being found, you may need to do the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y python-pip&lt;br /&gt;
pip install -U cliff&amp;lt;/pre&amp;gt; &lt;br /&gt;
Obtain the tenant ID and create your first tenant network. Create additional networks and associated subnets as needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
quantum net-create public223 --tenant_id &amp;amp;lt;tenant-id&amp;amp;gt; --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 223&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create your first tenant subnet and associate it to the network you created in the previous step. The example below uses .10-.250 for Instance IP addresses. Modify the allocation-pool and dns_nameservers based on your deployment needs. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum subnet-create --name 223-subnet --allocation-pool start=192.168.223.10,end=192.168.223.250 public223 192.168.223.0/24 public --dns_nameservers list=true 192.168.26.186&amp;lt;/pre&amp;gt; &lt;br /&gt;
If you skipped the earlier step of downloading an image and uploading it to glance, do that now: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
*'''On a Compute Node''' create an SSH keypair and add the public key to Nova. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Leave the passphrase empty when creating the keypair. If you have an issue with the Nova commands not being found, you will need to to install the nova client support:&lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install python-novaclient&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;ssh-keygen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;cd ~/.ssh/&lt;br /&gt;
nova keypair-add --pub_key id_rsa.pub &amp;amp;lt;key_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova keypair-add --pub_key id_rsa.pub net-key&amp;lt;/pre&amp;gt; &lt;br /&gt;
Before booting the instance, check for the ID of the network we created earlier. Note: the &amp;amp;lt;quantum_net_id&amp;amp;gt; value will come from the output of the &amp;quot;quantum net-list&amp;quot; command: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum net-list&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name &amp;amp;lt;key_name&amp;amp;gt; --nic net-id=&amp;amp;lt;quantum_net_id&amp;amp;gt; &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name net-key --nic net-id=f9035744-72a9-42cf-bd46-73d54c0cea06 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Watch the status of the instance: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
The instance is booted completely when the OS-EXT-STS:vm_state is &amp;quot;active&amp;quot;. Make note of the IP address of the VM. Alternatively, you can watch the complete log of the VM booting by running: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova console-log --length=25 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the default Quantum Security Group to allow ingress traffic to Instances. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Security Group rules are associated to a specific tenant. The &amp;amp;lt;tenant-id&amp;amp;gt; can be found from the output of keystone tenant-list. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
This example allows all ICMP and SSH traffic: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should now be able to ping the VM as well as SSH into it from the host that you used to create the key you associated with the VM during the boot phase.&lt;/div&gt;</summary>
		<author><name>Shmcfarl</name></author>	</entry>

	<entry>
		<id>http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide</id>
		<title>COE Grizzly Release: High-Availability Manual Installation Guide</title>
		<link rel="alternate" type="text/html" href="http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide"/>
				<updated>2013-04-24T16:47:35Z</updated>
		
		<summary type="html">&lt;p&gt;Shmcfarl: /* Configuring OpenStack Networking (Quantum) and Deploying the First VM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
There are two common ways of installing [http://docs.openstack.org/ OpenStack], manually or by using automation tools. There is much focus on the full automation of OpenStack deployments using tools such as [http://puppetlabs.com/ Puppet], [http://www.opscode.com/chef/ Chef], [https://juju.ubuntu.com/ JuJu] and others. While these tools offer great advantages over manual configuration, they do hide the OpenStack installation and configuration details. This document can be used by those interested in learning more about the OpenStack Grizzly High-Availability (HA) installation process or for those not interested in using automation tools to deploy HA. The document covers the following OpenStack software components: &lt;br /&gt;
&lt;br /&gt;
*[http://glance.openstack.org/ Glance] (Image Service) &lt;br /&gt;
*[http://keystone.openstack.org/ Keystone] (Identity Service) &lt;br /&gt;
*[http://nova.openstack.org/ Nova] (Compute Service) &lt;br /&gt;
*[http://horizon.openstack.org/ Horizon] (OpenStack Dashboard Web User Interface) &lt;br /&gt;
*[http://docs.openstack.org/developer/quantum/ Quantum] (Network Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/cinder/ Cinder] (Block Storage Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/swift/ Swift] (Object Storage Service)&lt;br /&gt;
&lt;br /&gt;
== Dependencies  ==&lt;br /&gt;
&lt;br /&gt;
=== Critical Reminders  ===&lt;br /&gt;
&lt;br /&gt;
The most common OpenStack HA deployment issues are either incorrect configuration files or not deploying the nodes in the proper order. To save you from future troubleshooting steps, ENSURE that you deploy the nodes in the order described within the document and verify the accuracy of all configuration files. You will likely be using your own IP addressing and passwords in your setup and it is critical to ensure any variations from this guide are fully understood. &lt;br /&gt;
&lt;br /&gt;
Do not configure RAID on the hard disks of Swift Storage Nodes. Swift performs better without RAID and disk redundancy is unneeded since Swift protects the data through replication. Therefore, if a RAID Controller manages the hard disks, ensure you present each of the hard disks independently. Our example uses disk /dev/sda for the Operating System installation and disks /dev/sdb-/dev/sdf for Swift storage. Please remember to modify these definitions based on your specific deployment environment. Additional Swift considerations and tuning information can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/considerations-and-tuning.html here]. &lt;br /&gt;
&lt;br /&gt;
Compute Nodes run Cinder Volume to provide block storage services to Instances. The default Cinder driver (volume_driver=nova.volume.driver.ISCSIDriver) is an iSCSI solution that employs the use of Linux Logical Volume Manager (LVM). Therefore, you must create an LVM Volume Group either during the Ubuntu Precise installation or [http://docs.openstack.org/trunk/openstack-compute/admin/content/cinder-install.html afterwards]. The name of the LVM Volume Group must match the volume_group definition in cinder.conf. Our example uses the name nova-volumes for the LVM Volume Group and associated cinder.conf volume_group name. &lt;br /&gt;
&lt;br /&gt;
The password used in our examples is keystone_admin. Every account, service and configuration file uses this one password. You will want to change this in your setup and you certainly want to use a strong password and a different password for each account/service if this system is going into production.&lt;br /&gt;
&lt;br /&gt;
=== Operating System  ===&lt;br /&gt;
&lt;br /&gt;
The operating system used for this installation is Ubuntu 12.04 LTS (Precise). &lt;br /&gt;
&lt;br /&gt;
=== Server Requirements  ===&lt;br /&gt;
&lt;br /&gt;
Our deployment uses 13 Cisco UCS C-series servers to serve the roles of Controller, Compute, Load-Balancer and Swift Proxy/Storage. The environment scales linearly, therefore individual nodes can be added to increase capacity for any particular OpenStack service. The five distinct node types used in this document are: &lt;br /&gt;
&lt;br /&gt;
*'''3 Controller Nodes-'''&amp;amp;nbsp;Runs Nova API, Nova Conductor, Nova Consoleauth, Nova Novncproxy, Nova Scheduler, NoVNC, Quantum Server, Quantum Plugin OVS, Glance API/Registry, Keystone, Cinder API, Cinder Scheduler, OpenStack Dashboard, RabbitMQ Server, MySQL Server WSREP and Galera. &lt;br /&gt;
**Provides management functionality of the OpenStack environment.&lt;br /&gt;
&lt;br /&gt;
*'''3 Compute Nodes-'''&amp;amp;nbsp;Runs Nova Compute, Quantum OVS and DHCP Agents, Cinder Volume and TGT services. &lt;br /&gt;
**Provides the hypervisor role for running Nova instances (Virtual Machines) and presents LVM volumes for Cinder block storage.&lt;br /&gt;
&lt;br /&gt;
*'''2 Load-Balancer Nodes-'''&amp;amp;nbsp;Runs HAProxy and Keepalived to load-balance traffic across Controller and Swift Proxy clusters.&lt;br /&gt;
&lt;br /&gt;
*'''2 Swift Proxy Nodes-'''&amp;amp;nbsp;The Proxy Node is responsible for tying together users and their data within the the Swift object storage system. For each request, it will look up the location of the account, container or object in the Swift ring and route the request accordingly. The public API is also exposed by Proxy Node.&lt;br /&gt;
&lt;br /&gt;
*'''3 Swift Storage Nodes-'''&amp;amp;nbsp;Each Storage Nodes contains Swift object, container, and account services. At a very high-level, these are the servers that contain the user data and perform replication among one another to keep the system in a consistent state.&lt;br /&gt;
&lt;br /&gt;
=== Networking Requirements  ===&lt;br /&gt;
&lt;br /&gt;
The OpenStack HA environment uses five separate networks. Three of the five networks are used by Tenants. Three tenant networks are being used as an example, and thus the tenant networks can be increased or decreased based on your deployment needs. Connectivity within Tenants uses Quantum with the Open vSwitch (OVS) plugin and [http://docs.openstack.org/trunk/openstack-network/admin/content/provider_networks.html Provider Network Extensions]. Provider Network Extensions allow cloud administrators to create OpenStack networks that map directly to physical networks in the data center and support local, VLAN and GRE deployment models. Our example uses the Provider VLAN networking model. The network details are as follows: &lt;br /&gt;
&lt;br /&gt;
*'''1 Management Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used to perform management functions against the node. For example, SSH'ing to the nodes to change a configuration setting. The network is also used for lights-out management using the CIMC interface of the UCS servers. Lastly, OpenStack API's and the Horizon web dashboard is associated to this network. &lt;br /&gt;
**An IP address for each node is required for this network. If using lights-out management such as CIMC, each node will require 2 addresses from this network. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]). &lt;br /&gt;
*'''3 Tenant Networks'''&amp;lt;br&amp;gt; &lt;br /&gt;
**These networks are used to provide connectivity to Instances. Since Quantum Provider Networking Extensions are being used, it is common to give tenants direct access to a &amp;quot;public&amp;quot; network that can be used to reach the Internet. &lt;br /&gt;
**Compute Nodes will have an interface attached to this network. Since the Compute Node interfaces that attach to this network are managed by OVS, they should not contain an IP address. &lt;br /&gt;
**This network typically employs publicly routable IP addressing if external NAT'ing is not used upstream towards the Internet edge ('''Note:''' in this document all IP addressing for all interfaces comes out of various private addressing blocks). &lt;br /&gt;
*'''1 Storage Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used for providing separate connectivity between Swift Proxy and Storage Nodes. This ensures storage traffic is not interfering with Instance traffic. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]) IP addressing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''[http://docwiki.cisco.com/w/images/a/a8/Grizzly-ha-network-design-details-v1.0.png Figure 1]''' is used to help visualize the network deployment and to act as a reference for configuration steps within the document. It is highly recommend to print the diagram so it can easily be referenced throughout the installation process.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;u&amp;gt;'''Figure 1:'''&amp;lt;/u&amp;gt;'''OpenStack HA Network Design Details''' &lt;br /&gt;
&lt;br /&gt;
[[Image:Grizzly-ha-network-design-details-v1.0.png|thumb|left]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''Other Network Services'''&amp;lt;br&amp;gt; &lt;br /&gt;
**'''DNS: '''In this setup an external DNS server (192.168.26.186) is used for name resolution of OpenStack nodes and external name resolution. If DNS is not being used, the /etc/hosts file should include the following for all nodes:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 127.0.0.1	localhost&lt;br /&gt;
 192.168.220.40  control.dmz-pod2.lab		control&lt;br /&gt;
 192.168.220.41  control01.dmz-pod2.lab	        control01&lt;br /&gt;
 192.168.220.42  control02.dmz-pod2.lab  	control02&lt;br /&gt;
 192.168.220.43  control03.dmz-pod2.lab  	control03&lt;br /&gt;
 192.168.220.60  swiftproxy.dmz-pod2.lab	        swiftproxy&lt;br /&gt;
 192.168.220.61  swiftproxy01.dmz-pod2.lab	swiftproxy01&lt;br /&gt;
 192.168.220.62  swiftproxy02.dmz-pod2.lab	swiftproxy02&lt;br /&gt;
 192.168.220.51  compute01.dmz-pod2.lab          compute01&lt;br /&gt;
 192.168.220.52  compute02.dmz-pod2.lab          compute02&lt;br /&gt;
 192.168.220.53  compute03.dmz-pod2.lab          compute03&lt;br /&gt;
&lt;br /&gt;
*'''NTP: '''In this setup an external NTP server(s) is used for time synchronization. &lt;br /&gt;
*'''Physical Network Switches:''' Each node in this setup is physically attached to a Cisco Nexus switch acting as a Top-of-Rack access layer device. Trunking is configured on each interface connecting to the eth0 NIC of each node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Upstream routers/aggregation layer switches will most likely be terminating the Layer-3 VLAN interfaces. If these interfaces are deployed in a redundant fashion with a First Hop Redundancy Protocol such as HSRP or VRRP, then you should be careful of the IP addresses assigned to the physical L3 switches/routers as they may conflict with the IP address of the Quantum router's public subnet (.3 by default). For example, if you are using HSRP and you have .1 as the standby IP address, .2 as the first L3 switch IP and .3 as the second L3 switch IP, you will receive a duplicate IP address error on the second L3 switch. This can be worked around by using high-order IPs on your upstream L3 device or altering the Quantum subnet configuration at the time of creation to have an IP starting range higher than the physical switches/routers are using (i.e. .4 and higher). Our example uses an IP allocation range that starts with .10 to avoid this issue.&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
The installation of the nodes should be in the following order: &lt;br /&gt;
&lt;br /&gt;
#'''Load-Balancer Nodes-''' slb01 and slb02 &lt;br /&gt;
#'''Swift Storage Nodes-''' swift01, swift02 and swift03 &lt;br /&gt;
#'''Swift Proxy Nodes-''' swiftproxy01 and swiftproxy02 &lt;br /&gt;
#'''Controller Nodes-''' control01, control02 and control03 &lt;br /&gt;
#'''Compute Nodes- '''compute01, compute02 and compute03&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Nodes  ===&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu Precise 12.04 Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Ubuntu 12.04 (AMD 64-bit) from CD/ISO or automated install (i.e. kickstart). You can reference Section 4 in the [http://docwiki.cisco.com/wiki/OpenStack:Essex_Build_Node#Starting_the_Ubuntu_Installation Build Node Guide] if you are unfamiliar with the Ubuntu Precise installation process. Use the following networking section to configure your network adapter properties for each node. As previously mentioned in the Critical Reminders Section, make sure to create an LVM Volume Group named nova-volumes for Compute Nodes and do not configure RAID for Swift Storage Nodes. Lastly, select ssh-server as the only additional package during the Ubuntu Precise installation. &lt;br /&gt;
&lt;br /&gt;
==== Grizzly Packages  ====&lt;br /&gt;
&lt;br /&gt;
The [https://launchpad.net/~openstack-ubuntu-testing/+archive/grizzly-trunk-testing Ubuntu Testers Team] manages the repository used by this document for OpenStack Grizzly packaging. Although the repository supports Ubuntu Precise and Raring releases, the document is only based on Precise. The Ubuntu Testers PPA should be used for all OpenStack nodes (i.e. not needed for Load-Balancer nodes). &lt;br /&gt;
&lt;br /&gt;
Use sudo mode or run from root account for the entire installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the Ubuntu Grizzly repository: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install python-software-properties -y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;apt-add-repository ppa:openstack-ubuntu-testing/grizzly-trunk-testing&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' Press enter when you are prompted for “[ENTER] or cancel” when adding the PPA. Update your system: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get update&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Networking  ====&lt;br /&gt;
&lt;br /&gt;
Our implementation uses VLANs for segmentation of certain networks. Make sure the VLAN package is installed and your network switches have been configured for VLANs. Otherwise, replicate the network setup using only physical interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install vlan -y&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.81&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.82&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Proxy Node swiftproxy01 /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Proxy Node swiftproxy02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.62&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.62&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.41&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.42&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.43&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.51&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.52&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.53&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart networking: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/networking restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Time Synchronization  ====&lt;br /&gt;
&lt;br /&gt;
Install NTP: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y ntp&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add your NTP server(s) by editing /etc/ntp.conf. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; OpenStack requires that clocks be synchronized. Our example uses a '''FAKE '''server called ntp.corp.com as the NTP server. Make sure you change&amp;amp;nbsp;ntp.corp.com to your real NTP server. Lastly, make sure the NTP server name resolves. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/ntp.conf&lt;br /&gt;
&lt;br /&gt;
server ntp.corp.com&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart NTP for the changes to take effect &lt;br /&gt;
&amp;lt;pre&amp;gt;service ntp restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that you are pulling time: &lt;br /&gt;
&amp;lt;pre&amp;gt;ntpq -p&lt;br /&gt;
&lt;br /&gt;
remote           refid      st t when poll reach   delay   offset  jitter&lt;br /&gt;
==============================================================================&lt;br /&gt;
*ntp.corp.       .GPS.            1 u  185  512  377   76.035    0.053   0.033&lt;br /&gt;
 cheezum.mattnor 129.7.1.66       2 u   8d 1024    0   47.731   -0.555   0.000&lt;br /&gt;
 ntp2.rescomp.be .STEP.          16 u    - 1024    0    0.000    0.000   0.000&lt;br /&gt;
 216.45.57.38    204.123.2.5      2 u  54h 1024    0   12.607    0.808   0.000&lt;br /&gt;
 lithium.constan 128.4.1.1        2 u   8d 1024    0   69.861    0.206   0.000&lt;br /&gt;
 europium.canoni 193.79.237.14    2 u  54h 1024    0  144.040   -1.455   0.000&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load Balancer Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Perform the following steps on nodes slb01 and slb02. &lt;br /&gt;
&lt;br /&gt;
==== Keepalived &amp;amp;amp; HAProxy  ====&lt;br /&gt;
&lt;br /&gt;
Edit /etc/sysctl.conf to allow Keepalived to associate a virtual IP address (VIP) that is not directly bound to an interface on the node:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;net.ipv4.ip_nonlocal_bind=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load in sysctl settings from /etc/sysctl.conf: &lt;br /&gt;
&amp;lt;pre&amp;gt;sysctl -p&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install Keepalived and HAProxy packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keepalived haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the /var/lib/haproxy directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /var/lib/haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure /var/lib/haproxy is owned by root. Change the file ownership if needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /var/lib/haproxy/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the&amp;amp;nbsp;/etc/keepalived/keepalived.conf file for slb01 with the contents below.&amp;amp;nbsp; Change&amp;amp;nbsp;[YOUR_DOMAIN_NAME] with your actual domain name.&amp;amp;nbsp; The keepalived.conf includes the following sections:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global_defs-''' Global parameters affect the whole process behavior.&amp;amp;nbsp;There may be several 'global' sections if needed, but their parameters will only be merged. &amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_script-''' Keepalived supports a VRRP scripting framework to extend base functionality.&amp;amp;nbsp; The vrrp_script named haproxy will check the status of the haproxy service every 2 seconds and add 2 points of priority if the status is running. &amp;amp;nbsp;If the haproxy service is not running, the backup HAProxy Node will become the primary and begin passing traffic for the virtual_ipaddress(es).&amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_instance-''' Is where you define configuration paramters for virtual gateway addresses.&amp;amp;nbsp; slb01 is configured as the primary gateway for 192.168.220.40 (Controller Cluster) and the backup gateway for 192.168.220.60 (Swift Proxy Cluster). Accordingly, slb02 is configured as the primary for 192.168.220.60 and the backup for 192.168.220.40.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb01&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure /etc/keepalived/keepalived.conf for slb02 with the following contents. Change [YOUR_DOMAIN_NAME] with your actual domain name. &lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb02&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb01 with the contents below. HAProxy's configuration process involves 3 major sources of parameters:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*The arguments from the command-line, which always take precedence.&amp;lt;br&amp;gt; &lt;br /&gt;
*The &amp;quot;global&amp;quot; section, which sets process-wide parameters.&amp;lt;br&amp;gt; &lt;br /&gt;
*The proxies sections which can take form of &amp;quot;defaults&amp;quot;, &amp;quot;listen&amp;quot;, &amp;quot;frontend&amp;quot; and &amp;quot;backend&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following provides additional details of the haproxy.cfg file:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global-&amp;amp;nbsp; '''Sets process-wide parameters for load-balancing traffic.&amp;amp;nbsp; Global parameters can be overriden by server-specific configurations within the''listen section ''of the haproxy.cfg file.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''defaults-''' The &amp;quot;defaults&amp;quot; section sets default parameters for all other sections following its declaration. Those default parameters are reset by the next &amp;quot;defaults&amp;quot; section. The name is optional but its use is encouraged for better readability.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''listen-''' A &amp;quot;listen&amp;quot; section defines a complete proxy with its front-end (i.e. listening VIP) and back-end (i.e. real IP of servers)&amp;amp;nbsp;parts combined in one section. Currently two major proxy modes are supported: &amp;quot;tcp&amp;quot;, also known as layer 4 and &amp;quot;http&amp;quot;, also known as layer 7. In layer 4 mode, HAProxy simply forwards bidirectional traffic between two sides. In layer 7 mode, HAProxy analyzes the protocol and can interact with it by allowing, blocking, switching, adding, modifying, or removing arbitrary content in requests or responses based on configurable criteria.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
 chroot  /var/lib/haproxy&lt;br /&gt;
 daemon  &lt;br /&gt;
 group  haproxy&lt;br /&gt;
 log  192.168.220.81 local0&lt;br /&gt;
 maxconn  4000&lt;br /&gt;
 pidfile  /var/run/haproxy.pid&lt;br /&gt;
 user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
 log  global&lt;br /&gt;
 maxconn  8000&lt;br /&gt;
 option  redispatch&lt;br /&gt;
 retries  3&lt;br /&gt;
 timeout  http-request 10s&lt;br /&gt;
 timeout  queue 1m&lt;br /&gt;
 timeout  connect 10s&lt;br /&gt;
 timeout  client 1m&lt;br /&gt;
 timeout  server 1m&lt;br /&gt;
 timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
 bind 192.168.220.40:80&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
 bind 192.168.220.40:3306&lt;br /&gt;
 balance  source&lt;br /&gt;
 mode  tcp&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9292&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
 bind 192.168.220.40:9191&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
 bind 192.168.220.40:35357&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
 bind 192.168.220.40:5000&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
 bind 192.168.220.40:11211&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
 bind 192.168.220.40:8773&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
 bind 192.168.220.40:8774&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
 bind 192.168.220.40:8775&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
 bind 192.168.220.40:8776&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
 bind 192.168.220.40:6080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9696&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
 bind 192.168.220.60:8080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb02 with the contents below. &lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
  chroot  /var/lib/haproxy&lt;br /&gt;
  daemon  &lt;br /&gt;
  group  haproxy&lt;br /&gt;
  log  192.168.220.82 local0&lt;br /&gt;
  maxconn  4000&lt;br /&gt;
  pidfile  /var/run/haproxy.pid&lt;br /&gt;
  user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
  log  global&lt;br /&gt;
  maxconn  8000&lt;br /&gt;
  option  redispatch&lt;br /&gt;
  retries  3&lt;br /&gt;
  timeout  http-request 10s&lt;br /&gt;
  timeout  queue 1m&lt;br /&gt;
  timeout  connect 10s&lt;br /&gt;
  timeout  client 1m&lt;br /&gt;
  timeout  server 1m&lt;br /&gt;
  timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
  bind 192.168.220.40:80&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
  bind 192.168.220.40:3306&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9292&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
  bind 192.168.220.40:9191&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
  bind 192.168.220.40:35357&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
  bind 192.168.220.40:5000&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
  bind 192.168.220.40:11211&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
  bind 192.168.220.40:8773&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
  bind 192.168.220.40:8774&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
  bind 192.168.220.40:8775&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
  bind 192.168.220.40:8776&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
  bind 192.168.220.40:6080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9696&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
  bind 192.168.220.60:8080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set &amp;quot;ENABLED&amp;quot; to &amp;quot;1&amp;quot; in /etc/default/haproxy &lt;br /&gt;
&amp;lt;pre&amp;gt;ENABLED=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keepalived and HAProxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/keepalived restart&lt;br /&gt;
/etc/init.d/haproxy restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Swift Nodes&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Install Swift and other basic packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift openssh-server rsync memcached python-netifaces python-xattr python-memcache &amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir -p /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration file. '''Note:''' This file should be identical on all Swift nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/swift.conf&lt;br /&gt;
&lt;br /&gt;
[swift-hash]&lt;br /&gt;
swift_hash_path_suffix = Gdr8ny7YyWqy2&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the Swift directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Storage Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Run these commands on nodes swift01, swift02 and swift03. Install the Swift Storage Node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-account swift-container swift-object xfsprogs parted&amp;lt;/pre&amp;gt; &lt;br /&gt;
For each of the hard disks other than the Ubuntu installation disk (i.e. /dev/sda), create an XFS volume with a single partition. Our example uses five hard disks (/dev/sdb - /dev/sdf) per Storage Node. Repeat this step for each disk that will be used for Swift storage: &lt;br /&gt;
&amp;lt;pre&amp;gt;parted /dev/sdb mklabel msdos&lt;br /&gt;
parted -a optimal /dev/sdb mkpart primary ext2 0% 100%&lt;br /&gt;
mkfs.xfs -i size=1024 /dev/sdb1&lt;br /&gt;
echo &amp;quot;/dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0&amp;quot; &amp;amp;gt;&amp;amp;gt; /etc/fstab&lt;br /&gt;
mkdir -p /srv/node/sdb1&lt;br /&gt;
mount /srv/node/sdb1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the mount directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /srv/node&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create an Rsync configuration file on each Storage Node. In the following example, replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/rsyncd.conf&lt;br /&gt;
&lt;br /&gt;
uid = swift&lt;br /&gt;
gid = swift&lt;br /&gt;
log file = /var/log/rsyncd.log&lt;br /&gt;
pid file = /var/run/rsyncd.pid&lt;br /&gt;
address = [STORAGE_NET_IP]&lt;br /&gt;
&lt;br /&gt;
[account]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/account.lock&lt;br /&gt;
&lt;br /&gt;
[container]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/container.lock&lt;br /&gt;
&lt;br /&gt;
[object]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/object.lock&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following line in /etc/default/rsync: &lt;br /&gt;
&amp;lt;pre&amp;gt;RSYNC_ENABLE = true&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start rsync daemon: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rsync start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/account-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/account-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = account-server&lt;br /&gt;
&lt;br /&gt;
[app:account-server]&lt;br /&gt;
use = egg:swift#account&lt;br /&gt;
&lt;br /&gt;
[account-replicator]&lt;br /&gt;
&lt;br /&gt;
[account-auditor]&lt;br /&gt;
&lt;br /&gt;
[account-reaper]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/container-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/container-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = container-server&lt;br /&gt;
&lt;br /&gt;
[app:container-server]&lt;br /&gt;
use = egg:swift#container&lt;br /&gt;
&lt;br /&gt;
[container-replicator]&lt;br /&gt;
&lt;br /&gt;
[container-updater]&lt;br /&gt;
&lt;br /&gt;
[container-auditor]&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Create /etc/swift/object-server.conf&amp;amp;nbsp;with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71):&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/object-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = object-server&lt;br /&gt;
&lt;br /&gt;
[app:object-server]&lt;br /&gt;
use = egg:swift#object&lt;br /&gt;
&lt;br /&gt;
[object-replicator]&lt;br /&gt;
&lt;br /&gt;
[object-updater]&lt;br /&gt;
&lt;br /&gt;
[object-auditor]&lt;br /&gt;
&lt;br /&gt;
[object-expirer]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the storage services. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; At this point, the ring files will not be present on the storage nodes. This will cause the *-replicator services to fail to start properly. After you create the ring files on the first proxy node (in the next section) and distribute them to the storage nodes, a service restart should allow all Swift services to start properly. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init object-server start&lt;br /&gt;
swift-init object-replicator start&lt;br /&gt;
swift-init object-updater start&lt;br /&gt;
swift-init object-auditor start&lt;br /&gt;
swift-init container-server start&lt;br /&gt;
swift-init container-replicator start&lt;br /&gt;
swift-init container-updater start&lt;br /&gt;
swift-init container-auditor start&lt;br /&gt;
swift-init account-server start&lt;br /&gt;
swift-init account-replicator start&lt;br /&gt;
swift-init account-auditor start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height: 1.5em;&amp;quot;&amp;gt;Make sure you repeat these steps for every Storage Node.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Proxy Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Ensure you have completed the previous steps in the &amp;quot;General Installation Steps for All Swift Nodes&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
Perform these steps on nodes swiftproxy01 and swiftproxy02. First, install the proxy node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-proxy memcached python-keystoneclient python-swiftclient swift-plugin-s3&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify memcached to bind to the storage network interface (192.168.222.x in our example). Edit the following line in /etc/memcached.conf, changing: &lt;br /&gt;
&amp;lt;pre&amp;gt;-l 127.0.0.1 &lt;br /&gt;
to&lt;br /&gt;
-l [STORAGE_NET_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the memcached server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
If it does not exist, create the /etc/swift/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /etc/swift/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure the directory the /etc/swift and the /var/cache/swift directories are owned by the swift user and group: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown swift:swift /etc/swift/&lt;br /&gt;
chown -R swift:swift /var/cache/swift/&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create /etc/swift/proxy-server.conf with the following contents: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_port = 8080&lt;br /&gt;
workers = 32&lt;br /&gt;
user = swift&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = catch_errors healthcheck cache ratelimit authtoken keystoneauth proxy-server&lt;br /&gt;
&lt;br /&gt;
[app:proxy-server]&lt;br /&gt;
use = egg:swift#proxy&lt;br /&gt;
allow_account_management = true&lt;br /&gt;
account_autocreate = true&lt;br /&gt;
&lt;br /&gt;
[filter:keystoneauth]&lt;br /&gt;
use = egg:swift#keystoneauth&lt;br /&gt;
operator_roles = Member,admin, swiftoperator&lt;br /&gt;
&lt;br /&gt;
[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
signing_dir = /var/cache/swift&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
auth_uri = http://192.168.220.40:5000&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = swift&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
delay_auth_decision = 10&lt;br /&gt;
&lt;br /&gt;
[filter:cache]&lt;br /&gt;
use = egg:swift#memcache&lt;br /&gt;
memcache_servers = 192.168.222.61:11211,192.168.222.62:11211&lt;br /&gt;
&lt;br /&gt;
[filter:catch_errors]&lt;br /&gt;
use = egg:swift#catch_errors&lt;br /&gt;
&lt;br /&gt;
[filter:healthcheck]&lt;br /&gt;
use = egg:swift#healthcheck&lt;br /&gt;
&lt;br /&gt;
[filter:ratelimit]&lt;br /&gt;
use = egg:swift#ratelimit&lt;br /&gt;
clock_accuracy = 1000&lt;br /&gt;
max_sleep_time_seconds = 60&lt;br /&gt;
log_sleep_time_seconds = 0&lt;br /&gt;
rate_buffer_seconds = 5&lt;br /&gt;
account_ratelimit = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, create the account, container and object rings. The builder command is basically creating a builder file with a few parameters. The parameter with the value of 18 represents 2 ^ 18th, this is the value of the partition size. Set this “partition power” value based on the total amount of storage you expect your entire ring to use. The value of 3 represents the number of replicas of each object, with the last value being the number of hours to restrict moving a partition more than once. Additional information regarding Swift ring preperation can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/preparing-the-ring.html here]. &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/swift&lt;br /&gt;
&lt;br /&gt;
swift-ring-builder account.builder create 18 3 1&lt;br /&gt;
swift-ring-builder container.builder create 18 3 1&lt;br /&gt;
swift-ring-builder object.builder create 18 3 1&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, for every storage device on each storage node add entries to each ring. This example prepares the account, container and object rings for storage node swift01 (192.168.222.71) with a partition in zone 1. The mount point of this partition is /srv/node/sdb1 and the path in rsyncd.conf is /srv/node/, the DEVICE would be sdb1 and the commands would look like: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder add z1-192.168.222.71:6002/sdb1 100&lt;br /&gt;
swift-ring-builder container.builder add z1-192.168.222.71:6001/sdb1 100&lt;br /&gt;
swift-ring-builder object.builder add z1-192.168.222.71:6000/sdb1 100&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Make sure not to place all devices in the same zone (i.e. z1). It is recommended to configure the zones as high-level as possible to create the greatest amount of isolation. Some considerations can include physical location, power availability, and network connectivity. For example, in a small cluster you might decide to split the zones up by cabinet, with each cabinet having its own power and network connectivity. Since our deployment only uses 3 storage nodes, each node should be in its own zone. However, it is recommended to have a minimum of 5 zones in a production-level Swift deployment. &lt;br /&gt;
&lt;br /&gt;
Verify the ring contents for each ring: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
swift-ring-builder /etc/swift/container.builder&lt;br /&gt;
swift-ring-builder /etc/swift/object.builder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Your output should look similar to this: &lt;br /&gt;
&amp;lt;pre&amp;gt;root@swiftproxy01:~# swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
/etc/swift/account.builder, build version 15&lt;br /&gt;
262144 partitions, 3 replicas, 3 zones, 15 devices, 0.00 balance&lt;br /&gt;
The minimum number of hours before a partition can be reassigned is 1&lt;br /&gt;
Devices:    id  zone      ip address  port      name weight partitions balance meta&lt;br /&gt;
             0     3  192.168.222.73  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
             1     2  192.168.222.72  6002      sdd1   1.00      52429    0.00 &lt;br /&gt;
             2     3  192.168.222.73  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             3     2  192.168.222.72  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             4     3  192.168.222.73  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             5     1  192.168.222.71  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             6     1  192.168.222.71  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             7     2  192.168.222.72  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
             8     1  192.168.222.71  6002      sdd1   1.00      52428   -0.00 &lt;br /&gt;
             9     2  192.168.222.72  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
            10     1  192.168.222.71  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
            11     1  192.168.222.71  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            12     3  192.168.222.73  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            13     2  192.168.222.72  6002      sde1   1.00      52428   -0.00 &lt;br /&gt;
            14     3  192.168.222.73  6002      sdd1   1.00      52428   -0.00&amp;lt;/pre&amp;gt; &lt;br /&gt;
Repeat the command, but replace account with object and container to verify the contents of the others two Swift rings. &lt;br /&gt;
&lt;br /&gt;
Rebalance the rings. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Rebalancing rings can take a while. You may get a message about a balance value and that you need to rebalance/push after the minimum 1 hour. If so, recheck the status after an hour. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder rebalance&lt;br /&gt;
swift-ring-builder container.builder rebalance&lt;br /&gt;
swift-ring-builder object.builder rebalance&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the account.ring.gz, container.ring.gz, and object.ring.gz files to swiftproxy02 and the 3 storage nodes in /etc/swift. &lt;br /&gt;
&lt;br /&gt;
Make sure all the config files are owned by the swift user: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Proxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init proxy start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verify the Swift Installation  ===&lt;br /&gt;
&lt;br /&gt;
You can run verification commands from the proxy server or any server with access to Keystone. Keep in mind that proxy nodes are configured to use Keystone for user authentication. As a result, you '''MUST''' complete the Controller Node Installation steps and ensure Keystone is operational before proceeding with Swift verification. &lt;br /&gt;
&lt;br /&gt;
Verify that you can successfully authenticate against Keystone using the Swift authentication credentials: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y curl&lt;br /&gt;
&lt;br /&gt;
curl -s -d &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should receive output similar to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;access&amp;quot;: {&amp;quot;token&amp;quot;: {&amp;quot;issued_at&amp;quot;: &amp;quot;2013-04-02T14:55:31.149327&amp;quot;, &amp;quot;expires&amp;quot;: &amp;quot;2013-04-03T14:55:31Z&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;bb29ef5439ce4a75bf85332bbadf6538&amp;quot;, &amp;quot;tenant&amp;quot;: {&amp;quot;description&amp;quot;: &lt;br /&gt;
null, &amp;quot;enabled&amp;quot;: true, &amp;quot;id&amp;quot;: &amp;quot;b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;services&amp;quot;}}, &amp;quot;serviceCatalog&amp;quot;: [{&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;45a336cb74e04e11ab95c0ea28b699d6&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;compute&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;nova&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;259fef5e66814f47ac1934d3cf522a3d&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;network&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;quantum&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [&lt;br /&gt;
{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;166de3790eb54c31a58237fe9ea3d301&amp;quot;, &lt;br /&gt;
&amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;image&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;glance&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;0a2c69157d5948a9ae8ecee5c65a6d2b&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;volume&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;cinder&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Admin&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &lt;br /&gt;
&amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;05f85b8aacbd4c87b680dcc2fb6da539&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;}], &lt;br /&gt;
&amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;ec2&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;ec2&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.60:8080/v1&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;4a1af526137341c0a682eb573101ddde&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;object-store&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;3e3f7b50b5bd44b7a15b3e4ae55086bf&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;identity&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;keystone&amp;quot;}], &amp;quot;user&amp;quot;: {&amp;quot;username&amp;quot;: &amp;quot;swift&amp;quot;, &amp;quot;roles_links&amp;quot;: [], &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;ed69664ac78a4b65a36d63da6b760863&amp;quot;, &amp;quot;roles&amp;quot;: [{&amp;quot;name&amp;quot;: &amp;quot;_member_&amp;quot;}, {&amp;quot;name&amp;quot;: &amp;quot;admin&amp;quot;}], &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, &amp;quot;metadata&amp;quot;: {&amp;quot;is_admin&amp;quot;: 0, &amp;quot;roles&amp;quot;: [&lt;br /&gt;
&amp;quot;9fe2ff9ee4384b1894a90878d3e92bab&amp;quot;, &amp;quot;6a553ae3be3c4f8c8fe079830d4102a5&amp;quot;]}}}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Use the swift client stat command to make sure you can view the contents of the ring.&amp;amp;nbsp;You can run these commands from the proxy server or any server with the swift client and access to Keystone. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U admin:admin -K keystone_admin stat&lt;br /&gt;
   Account: AUTH_3eccdb2a9331419c96ac9ff336110b65&lt;br /&gt;
Containers: 1&lt;br /&gt;
   Objects: 2&lt;br /&gt;
     Bytes: 0&lt;br /&gt;
Accept-Ranges: bytes&lt;br /&gt;
X-Timestamp: 1363989109.30329&lt;br /&gt;
X-Trans-Id: tx147dd9983ac54af1b71c5a561ae2aa9a&lt;br /&gt;
Content-Type: text/plain; charset=utf-8&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can see that 1 container exists. &amp;amp;nbsp;Now, lets find out the name of the container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list&lt;br /&gt;
glance&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The glance container is created after the Controller cluster is built and an image has been uploaded to Glance. &lt;br /&gt;
&lt;br /&gt;
List the contents of the Glance container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list glance&lt;br /&gt;
24164630-ba2f-436a-8bc6-43975717d5e5&lt;br /&gt;
858a11dc-ed61-4a18-a778-eabcb454ae45&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Controller Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Runs these commands on nodes control01, control02 and control03. &amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install MySQL and Galera dependencies: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y libaio1 libssl0.9.8 mysql-client-5.5 python-mysqldb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download MySQL-WSREP and Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget -O /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb http://launchpad.net/codership-mysql/5.5/5.5.23-23.6/+download/mysql-server-wsrep-5.5.23-23.6-amd64.deb --no-check-certificate&lt;br /&gt;
wget -O /tmp/galera-23.2.1-amd64.deb http://launchpad.net/galera/2.x/23.2.1/+download/galera-23.2.1-amd64.deb --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install MySQL and Galera. '''Note:''' If you are prompted to create a root password during the Galera package installation, please make note of the password you use as it will be needed when connecting to MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;dpkg -i /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb&lt;br /&gt;
dpkg -i /tmp/galera-23.2.1-amd64.deb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the MySQL bind address: &lt;br /&gt;
&amp;lt;pre&amp;gt;sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the following line to /etc/rc.local on all controllers to allow MySQL to start automatically upon reboot: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.41&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.42&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.43&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt;It is important to understand the [http://www.codership.com/wiki/doku.php?id=mysql_options_0.8 gcomm address] concept behind [http://www.codership.com/ Galera]. Only use an empty gcomm:// address when you create a NEW cluster. Never use it when your intention is to reconnect to an existing one. After the Galera cluster is established, you should change the gcomm address on control01 from gcomm:// to gcomm://192.168.220.42 or gcomm://192.168.220.43. Otherwise, control01 will not join the cluster upon reboot. Make sure to also restart the mysql service when making changes to any of the associated configuration files. &lt;br /&gt;
&lt;br /&gt;
Restart MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the Galera cluster has been established. The value should show 4 for all nodes in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | Variable_name      | Value |&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | wsrep_local_state  |    4  |&lt;br /&gt;
  +------------------------+---+&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Monitoring  ====&lt;br /&gt;
Complete each of the steps below on each control node except for when a single node is specified.&lt;br /&gt;
&lt;br /&gt;
Install xinetd: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y xinetd&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the mysqlchk service: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/mysqlchk -P /etc/xinetd.d/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' After functional testing is complete, it's recommended to secure the mysqlchk service. This can be accomplished by editing the only_from and per_source values in /etc/xinetd.d/ to the subnet used by the load-balancer nodes. &lt;br /&gt;
&lt;br /&gt;
Edit /etc/xinetd.d/mysqlchk by changing &amp;amp;lt;%= mysqlchk_script_dir&amp;amp;nbsp;%&amp;amp;gt;/galera_chk to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure root is the file owner: &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
If not, change the file permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the mysqlcheck service to /etc/services by adding the following line: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysqlchk        9200/tcp                        # MySQL Galera health check script&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the MySQL Galera health check script: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/galera_chk -P /usr/local/bin/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the file ownership and permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /usr/local/bin/galera_chk &lt;br /&gt;
chmod +x  /usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /usr/local/bin/galera_chk as follows. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41). &lt;br /&gt;
&amp;lt;pre&amp;gt;MYSQL_HOST=&amp;quot;[CONTROLLER_MGT_IP]&amp;quot;&lt;br /&gt;
MYSQL_PORT=&amp;quot;3306&amp;quot;&lt;br /&gt;
MYSQL_USERNAME=&amp;quot;mysqlchk_user&amp;quot;&lt;br /&gt;
MYSQL_PASSWORD=&amp;quot;mysqlchk_password&amp;quot;&lt;br /&gt;
MYSQL_OPTS=&amp;quot;-N -q -A&amp;quot;&lt;br /&gt;
TMP_FILE=&amp;quot;/dev/shm/mysqlchk.$$.out&amp;quot;&lt;br /&gt;
ERR_FILE=&amp;quot;/dev/shm/mysqlchk.$$.err&amp;quot;&lt;br /&gt;
FORCE_FAIL=&amp;quot;/dev/shm/proxyoff&amp;quot;&lt;br /&gt;
MYSQL_BIN=&amp;quot;/usr/bin/mysql&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart xinetsd: &lt;br /&gt;
&amp;lt;pre&amp;gt;service xinetd restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Connect to MySQL and add the mysqlchk user to each controller in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
use mysql;&lt;br /&gt;
INSERT INTO user (Host,User,Password) VALUES('%','mysqlchk_user',PASSWORD('mysqlchk_password'));&lt;br /&gt;
flush privileges;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Grant privileges for the mysqlchk user. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41).: &lt;br /&gt;
&amp;lt;pre&amp;gt;grant SUPER,PROCESS on *.* to 'mysqlchk_user'@'[CONTROLLER_MGT_IP]' IDENTIFIED BY 'mysqlchk_password';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the operational status of the MySQL Galera health check service. From slb01 or slb02, Telnet using port 9200 (health check port) and make sure you get a &amp;quot;MySQL is running&amp;quot; message: &lt;br /&gt;
&amp;lt;pre&amp;gt;telnet 192.168.220.41 9200&lt;br /&gt;
Trying 192.168.220.41...&lt;br /&gt;
Connected to 192.168.220.41.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Content-Type: text/html&lt;br /&gt;
Content-Length: 43&lt;br /&gt;
&amp;amp;lt;html&amp;amp;gt;&amp;amp;lt;body&amp;amp;gt;MySQL is running.&amp;amp;lt;/body&amp;amp;gt;&amp;amp;lt;/html&amp;amp;gt;&lt;br /&gt;
Connection closed by foreign host.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Repeat the previous step for each control node. &lt;br /&gt;
&lt;br /&gt;
Verify that you can access the MySQL database by using the Virtual IP address (VIP) of the Galera cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -umysqlchk_user -pmysqlchk_password -h192.168.220.40&amp;lt;/pre&amp;gt; &lt;br /&gt;
For informational purposes, this is the command used by the health check script. This example is for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql -N -q -A --host=192.168.220.41 --user=mysqlchk_user --password=mysqlchk_password -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RabbitMQ Installation  ====&lt;br /&gt;
Complete each of the following steps on each control node unless a specific node is called out.&lt;br /&gt;
&lt;br /&gt;
Install RabbitMQ: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y rabbitmq-server&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure RabbitMQ Clustering. First, stop the service and remove the mnesia database on all control nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server stop&lt;br /&gt;
rm -rf /var/lib/rabbitmq/mnesia&amp;lt;/pre&amp;gt; &lt;br /&gt;
Clustering requires that the nodes have the same Erlang cookie. Copy the Erlang cookie from control01 to control02 and control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.42:/var/lib/rabbitmq/.erlang.cookie&lt;br /&gt;
scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.43:/var/lib/rabbitmq/.erlang.cookie&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The above command requires root login (disabled by default in Ubuntu). If you do not have root permissions, copy the Erlang cookie from /var/lib/rabbitmq/ to the /tmp directory of control02 and control03 and then to /var/lib/rabbitmq/. Also, make sure the file permissions match on all 3 nodes. &lt;br /&gt;
&lt;br /&gt;
Now that all 3 control nodes have the same Erlang cookie, make sure that RabbitMQ will start: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server start&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' If RabbitMQ does not successfully start, do not proceed with clustering.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Clustering can be configured using rabbitmqctl commands or by modifying the RabbitMQ configuration file. Our example uses the rabbitmqctl commands since issues were experienced using the configuration file with RabbitMQ 2.7.1. You can see both approaches to configuring RabbitMQ clustering [http://www.rabbitmq.com/clustering.html#setup here]. &lt;br /&gt;
&lt;br /&gt;
In order to cluster the three control nodes, two of the nodes (i.e. rabbit@control2 and rabbit@control03) will be configured to join the cluster of the third node (rabbit@control01). '''Note:''' Joining a cluster implicitly resets the node, thus removing all resources and data that were previously present on that node. &lt;br /&gt;
&lt;br /&gt;
From control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control02 is now clustered with control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control02 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
From control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control03 is now clustered with control01 and control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control03 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02,rabbit@control03]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02,rabbit@control03]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Now that clustering is complete, secure RabbitMQ by removing the default (guest) user: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl delete_user guest&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a RabbitMQ user account that will be used by OpenStack services: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl add_user openstack_rabbit_user openstack_rabbit_password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the permissions for the new RabbitMQ user account: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl set_permissions -p / openstack_rabbit_user &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the user settings: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl list_users&lt;br /&gt;
rabbitmqctl list_user_permissions openstack_rabbit_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keystone Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Keystone on every control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keystone python-keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Remove the sqllite db: &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/keystone/keystone.db&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Keystone. The database needs to be created on only 1 control node. &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE keystone;&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'%' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'localhost' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' From other controllers in the cluster, you can see that databases are replicated by Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show databases;&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/keystone/keystone.conf file on each controller. Change [CONTROLLER_MGT_IP] to the management IP address of the control node (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
admin_token = keystone_admin_token&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
&lt;br /&gt;
[sql]&lt;br /&gt;
connection = mysql://keystone_admin:keystone_db_pass@192.168.220.40/keystone&lt;br /&gt;
&lt;br /&gt;
[ssl]&lt;br /&gt;
enable = False&lt;br /&gt;
&lt;br /&gt;
[signing]&lt;br /&gt;
token_format = UUID&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a credential file and load it so credentials are not required for every OpenStack client command. '''Note:''' This needs to be created on each node that you will run OpenStack commands from: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that MySQL is listening on the VIP for the Keystone database. If you have any problems connecting to the VIP, try the real IP address of a control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -h192.168.220.40 -ukeystone_admin -pkeystone_db_pass keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keystone: &lt;br /&gt;
&amp;lt;pre&amp;gt;service keystone restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh Keystone data script](Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;ADMIN_PASSWORD=${ADMIN_PASSWORD:-keystone_admin}&lt;br /&gt;
export SERVICE_TOKEN=&amp;quot;keystone_admin_token&amp;quot;&lt;br /&gt;
export SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0/&amp;quot;&lt;br /&gt;
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-services}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with data (users, tenants, services). '''Note:''' If you see a long timeout and errors about &amp;quot;connection timeout&amp;quot;, it may be related to your proxy setting. Remove the export of your http/https proxies and re-run the script. You will have to re-add your proxies for any other external downloads. &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://github.com/EmilienM/openstack-folsom-guide/blob/master/scripts/keystone-endpoints.sh Keystone endpoint script] (Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;# MySQL definitions&lt;br /&gt;
MYSQL_USER=keystone_admin&lt;br /&gt;
MYSQL_DATABASE=keystone&lt;br /&gt;
MYSQL_HOST=192.168.220.40&lt;br /&gt;
MYSQL_PASSWORD=keystone_db_pass&lt;br /&gt;
&lt;br /&gt;
# Keystone definitions&lt;br /&gt;
KEYSTONE_REGION=RegionOne&lt;br /&gt;
SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# other definitions&lt;br /&gt;
MASTER=&amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
SWIFT_MASTER=&amp;quot;192.168.220.60&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with service endpoints. Again, if you are using proxies then you will need remove them from your export before running this command: &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Test connectivity to Keystone by using a curl request&amp;amp;nbsp;: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install curl openssl -y&lt;br /&gt;
&lt;br /&gt;
curl -d '{&amp;quot;auth&amp;quot;: {&amp;quot;tenantName&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;passwordCredentials&amp;quot;:{&amp;quot;username&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;password&amp;quot;: &amp;quot;keystone_admin&amp;quot;}}}' -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens | python -mjson.tool&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the above command is successful, you will receive output that includes a token and a list of service endpoints.&amp;amp;nbsp;You may also want to verify the other service account credentials: &lt;br /&gt;
&lt;br /&gt;
'''Glance''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;glance\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Nova''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;nova\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Swift''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Quantum''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;quantum\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Cinder''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;cinder\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can also use the Keystone client to verify the configuration: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
keystone user-list&lt;br /&gt;
keystone role-list&lt;br /&gt;
keystone service-list&lt;br /&gt;
keystone endpoint-list&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Glance Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Glance API and Registry packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y glance-api glance-registry&amp;lt;/pre&amp;gt; &lt;br /&gt;
Delete the glance.sqlite file created in the /var/lib/glance/ directory &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/glance/glance.sqlite&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Glance on only 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE glance;&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-api.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41). Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
default_store = swift&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
registry_host = 192.168.220.40&lt;br /&gt;
swift_store_auth_address = http://192.168.220.40:5000/v2.0/&lt;br /&gt;
swift_store_user = services:swift&lt;br /&gt;
swift_store_key = keystone_admin&lt;br /&gt;
swift_store_container = glance&lt;br /&gt;
swift_store_create_container_on_put = True&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone+cachemanagement&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-registry.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41) Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the glance-api and glance-registry services: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-api restart; service glance-registry restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
The database tables are under version control and you use the following command on a new installation to prevent the Image service from breaking possible upgrades. This command is used on only one of the controllers: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage version_control 0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the glance database on one control node (You may get a message about deprecation - you can ignore): &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the services again to take into account the new modifications: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-registry restart; service glance-api restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the Cirros 0.3.1 cloud image to a controller node and then upload it to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-disk.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;cirros&amp;quot; is_public=true disk_format=qcow2 container_format=ovf &amp;amp;lt; cirros-0.3.1-x86_64-disk.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that Glance is serving the image: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance image-list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, you can add the Ubuntu Precise image to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
 &lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum Server on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y quantum-server quantum-plugin-openvswitch&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Quantum database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE quantum; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'%' IDENTIFIED BY 'quantum_pass'; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'localhost' IDENTIFIED BY 'quantum_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/quantum/quantum.conf file on all control nodes. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = quantum&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/quantum/keystone-signing&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1&lt;br /&gt;
bridge_mappings = physnet1:br-ex &lt;br /&gt;
&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the quantum server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-server restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova software packages on all Control Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-api nova-conductor nova-consoleauth nova-scheduler nova-novncproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Nova database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE nova;&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the authtoken section in the /etc/nova/api-paste.ini file on each control node to include the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = nova&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [CONTROLLER_MGT_IP] with the controller node's management IP address (i.e. control01 = 192.168.220.41). Do this on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
dhcpbridge_flagfile=/etc/nova/nova.conf&lt;br /&gt;
dhcpbridge=/usr/bin/nova-dhcpbridge&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
verbose=true&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
image_service=nova.image.glance.GlanceImageService&lt;br /&gt;
rpc_backend=nova.rpc.impl_kombu&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
service_down_time=60&lt;br /&gt;
rabbit_port=5672&lt;br /&gt;
rabbit_virtual_host=/&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
ec2_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
enabled_apis=ec2,osapi_compute&lt;br /&gt;
osapi_compute_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
novncproxy_port=6080&lt;br /&gt;
novncproxy_host=0.0.0.0&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
novncproxy_host=[CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Synchronize the Nova database (You may get a DEBUG message - You can ignore this). '''Note:''' The db sync needs to be completed on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Due to [https://bugs.launchpad.net/nova/+bug/1158958 bug 1158958], Nova API must be patched to support memcached instead of the in-process cache. First, see if Nova needs to be patched by grep'ing the file that needs to be patched. You will receive no output if the file needs to be patched. You will receive host = str(instance.get('host')) if the file does not need patching: &lt;br /&gt;
&amp;lt;pre&amp;gt;grep &amp;quot;str(instance.get('host'))&amp;quot; /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the extended_availability_zone.py file needs patching, download the patched file: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/dflorea/nova/grizzly/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the patched extended_availability_zone.py to the /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;cp extended_availability_zone.py /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure the file is owned by root:root. &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If&amp;amp;nbsp;extended_availability_zone.py is not owned by root, then change the file ownership: &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod root:root /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart nova-* services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/init.d/; for i in $( ls nova-* ); do sudo service $i restart; done&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Also check that nova-api is running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-api status&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Cinder software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-api cinder-scheduler&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Cinder MySQL database on 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE cinder;&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/api-paste.ini file on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
service_protocol = http&lt;br /&gt;
service_host = 192.168.220.40&lt;br /&gt;
service_port = 5000&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = cinder&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/cinder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf configuration file on each control node. '''Note:''' The default volume_group is being changed from cinder-volumes to nova-volumes. As mentioned in the Critical Reminders section, an LVM Volume Group named nova-volumes must exist on each Compute Node. &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30 &lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Initialize the Cinder database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;cinder-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Cinder services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-api restart&lt;br /&gt;
service cinder-scheduler restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Horizon Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Horizon software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y memcached libapache2-mod-wsgi openstack-dashboard&amp;lt;/pre&amp;gt; &lt;br /&gt;
Next, modify the /etc/openstack-dashboard/local_settings.py file as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;CACHES = {&lt;br /&gt;
    'default': {&lt;br /&gt;
        'BACKEND'&amp;amp;nbsp;: 'django.core.cache.backends.memcached.MemcachedCache',&lt;br /&gt;
        'LOCATION'&amp;amp;nbsp;: '[CONTROLLER_MGT_IP]:11211'&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
OPENSTACK_HOST = &amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
OPENSTACK_KEYSTONE_URL = &amp;quot;http://%s:5000/v2.0&amp;quot;&amp;amp;nbsp;% OPENSTACK_HOST&lt;br /&gt;
OPENSTACK_KEYSTONE_DEFAULT_ROLE = &amp;quot;Member&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the memcached listening address in /etc/memcached.conf. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;-l [CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Reload Apache and memcached on each control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service apache2 restart; service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Access Horizon by using the following URL in your web browser. Use '''admin/keystone_admin''' for your login credentials. &amp;amp;nbsp;If you have problems accessing Horizon by using the VIP (192.168.220.40), then try using a real IP address of a control node (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;http://192.168.220.40/horizon&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, if you would like to remove the Ubuntu theme: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get purge -y openstack-dashboard-ubuntu-theme&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Compute Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Follow these steps for compute01, compute02 and compute03 compute nodes. &lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum software packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install quantum-plugin-openvswitch quantum-plugin-openvswitch-agent quantum-dhcp-agent&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check the status of the Open vSwitch services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch status&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Open vSwitch services on each compute node if they are not running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Nodes require OVS bridges named &amp;quot;br-int&amp;quot; and &amp;quot;br-ex&amp;quot;, and that &amp;quot;br-ex&amp;quot; is associated with the Public Network interface (eth1 in our example): &lt;br /&gt;
&amp;lt;pre&amp;gt;ovs-vsctl add-br br-int&lt;br /&gt;
ovs-vsctl add-br br-ex&lt;br /&gt;
ovs-vsctl add-port br-ex eth1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the Quantum configuration file /etc/quantum/quantum.conf with the following. '''Note:''' Make sure the names in rabbit_hosts= resolve: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini with: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the database section&lt;br /&gt;
[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following under the OVS section. &amp;amp;nbsp; '''Note:''' 223:225 signifies the VLAN ID range used for tenant VLANs. Modify this range based on your deployment needs. These VLANs should be trunked to eth1 of Compute Nodes and you must create a gateway address (i.e. 192.168.223.1 for VLAN 223) on your upstream Layer-3 device. &lt;br /&gt;
&amp;lt;pre&amp;gt;[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1:223:225&lt;br /&gt;
bridge_mappings = physnet1:br-ex&lt;br /&gt;
&lt;br /&gt;
# Using Quantum Security Groups instead of Nova Security Groups&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Update the /etc/quantum/dhcp_agent.ini: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
# Required to run multiple Quantum DHCP agents&lt;br /&gt;
use_component_ext = True&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Quantum services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-plugin-openvswitch-agent restart&lt;br /&gt;
service quantum-dhcp-agent restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova Compute software package on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-compute&amp;lt;/pre&amp;gt; &lt;br /&gt;
The deployment uses config_drive instead of Nova Metadata. Install the genisoimage package used by config_drive: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y genisoimage&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that the authtoken section in the /etc/nova/api-paste.ini file includes the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 127.0.0.1&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name =&amp;amp;nbsp;%SERVICE_TENANT_NAME%&lt;br /&gt;
admin_user =&amp;amp;nbsp;%SERVICE_USER%&lt;br /&gt;
admin_password =&amp;amp;nbsp;%SERVICE_PASSWORD%&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
force_config_drive=true&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
verbose=true&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_host=192.168.220.40&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
vncserver_proxyclient_address=[COMPUTE_MGT_IP]&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
vncserver_listen=[COMPUTE_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Restart the nova-compute service on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-compute restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt; Create a credentials file so you can issue OpenStack client commands from the Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing Cinder software packages on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-volume&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
iscsi_ip_address=[COMPUTE_MGT_IP]&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Cinder services on all compute nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-volume restart&lt;br /&gt;
service tgt restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring OpenStack Networking (Quantum) and Deploying the First VM  ===&lt;br /&gt;
&lt;br /&gt;
Run the following commands from either a Compute Node or Controller Node. If something has to be done on a specific node it will be called out. '''Note:''' If you have an issue with a Quantum command no being found, you may need to do the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y python-pip&lt;br /&gt;
pip install -U cliff&amp;lt;/pre&amp;gt; &lt;br /&gt;
Obtain the tenant ID and create your first tenant network. Create additional networks and associated subnets as needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
quantum net-create public223 --tenant_id &amp;amp;lt;tenant-id&amp;amp;gt; --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 223&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create your first tenant subnet and associate it to the network you created in the previous step. The example below uses .10-.250 for Instance IP addresses. Modify the allocation-pool and dns_nameservers based on your deployment needs. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum subnet-create --name 223-subnet --allocation-pool start=192.168.223.10,end=192.168.223.250 public223 192.168.223.0/24 --dns_nameservers list=true 192.168.26.186&amp;lt;/pre&amp;gt; &lt;br /&gt;
If you skipped the earlier step of downloading an image and uploading it to glance, do that now: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
*'''On a Compute Node''' create an SSH keypair and add the public key to Nova. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Leave the passphrase empty when creating the keypair. If you have an issue with the Nova commands not being found, you will need to to install the nova client support:&lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install python-novaclient&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;ssh-keygen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;cd ~/.ssh/&lt;br /&gt;
nova keypair-add --pub_key id_rsa.pub &amp;amp;lt;key_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova keypair-add --pub_key id_rsa.pub net-key&amp;lt;/pre&amp;gt; &lt;br /&gt;
Before booting the instance, check for the ID of the network we created earlier. Note: the &amp;amp;lt;quantum_net_id&amp;amp;gt; value will come from the output of the &amp;quot;quantum net-list&amp;quot; command: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum net-list&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name &amp;amp;lt;key_name&amp;amp;gt; --nic net-id=&amp;amp;lt;quantum_net_id&amp;amp;gt; &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name net-key --nic net-id=f9035744-72a9-42cf-bd46-73d54c0cea06 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Watch the status of the instance: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
The instance is booted completely when the OS-EXT-STS:vm_state is &amp;quot;active&amp;quot;. Make note of the IP address of the VM. Alternatively, you can watch the complete log of the VM booting by running: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova console-log --length=25 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the default Quantum Security Group to allow ingress traffic to Instances. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Security Group rules are associated to a specific tenant. The &amp;amp;lt;tenant-id&amp;amp;gt; can be found from the output of keystone tenant-list. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
This example allows all ICMP and SSH traffic: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should now be able to ping the VM as well as SSH into it from the host that you used to create the key you associated with the VM during the boot phase.&lt;/div&gt;</summary>
		<author><name>Shmcfarl</name></author>	</entry>

	<entry>
		<id>http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide</id>
		<title>COE Grizzly Release: High-Availability Manual Installation Guide</title>
		<link rel="alternate" type="text/html" href="http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide"/>
				<updated>2013-04-24T16:46:40Z</updated>
		
		<summary type="html">&lt;p&gt;Shmcfarl: /* Configuring Quantum and Deploying the First VM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
There are two common ways of installing [http://docs.openstack.org/ OpenStack], manually or by using automation tools. There is much focus on the full automation of OpenStack deployments using tools such as [http://puppetlabs.com/ Puppet], [http://www.opscode.com/chef/ Chef], [https://juju.ubuntu.com/ JuJu] and others. While these tools offer great advantages over manual configuration, they do hide the OpenStack installation and configuration details. This document can be used by those interested in learning more about the OpenStack Grizzly High-Availability (HA) installation process or for those not interested in using automation tools to deploy HA. The document covers the following OpenStack software components: &lt;br /&gt;
&lt;br /&gt;
*[http://glance.openstack.org/ Glance] (Image Service) &lt;br /&gt;
*[http://keystone.openstack.org/ Keystone] (Identity Service) &lt;br /&gt;
*[http://nova.openstack.org/ Nova] (Compute Service) &lt;br /&gt;
*[http://horizon.openstack.org/ Horizon] (OpenStack Dashboard Web User Interface) &lt;br /&gt;
*[http://docs.openstack.org/developer/quantum/ Quantum] (Network Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/cinder/ Cinder] (Block Storage Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/swift/ Swift] (Object Storage Service)&lt;br /&gt;
&lt;br /&gt;
== Dependencies  ==&lt;br /&gt;
&lt;br /&gt;
=== Critical Reminders  ===&lt;br /&gt;
&lt;br /&gt;
The most common OpenStack HA deployment issues are either incorrect configuration files or not deploying the nodes in the proper order. To save you from future troubleshooting steps, ENSURE that you deploy the nodes in the order described within the document and verify the accuracy of all configuration files. You will likely be using your own IP addressing and passwords in your setup and it is critical to ensure any variations from this guide are fully understood. &lt;br /&gt;
&lt;br /&gt;
Do not configure RAID on the hard disks of Swift Storage Nodes. Swift performs better without RAID and disk redundancy is unneeded since Swift protects the data through replication. Therefore, if a RAID Controller manages the hard disks, ensure you present each of the hard disks independently. Our example uses disk /dev/sda for the Operating System installation and disks /dev/sdb-/dev/sdf for Swift storage. Please remember to modify these definitions based on your specific deployment environment. Additional Swift considerations and tuning information can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/considerations-and-tuning.html here]. &lt;br /&gt;
&lt;br /&gt;
Compute Nodes run Cinder Volume to provide block storage services to Instances. The default Cinder driver (volume_driver=nova.volume.driver.ISCSIDriver) is an iSCSI solution that employs the use of Linux Logical Volume Manager (LVM). Therefore, you must create an LVM Volume Group either during the Ubuntu Precise installation or [http://docs.openstack.org/trunk/openstack-compute/admin/content/cinder-install.html afterwards]. The name of the LVM Volume Group must match the volume_group definition in cinder.conf. Our example uses the name nova-volumes for the LVM Volume Group and associated cinder.conf volume_group name. &lt;br /&gt;
&lt;br /&gt;
The password used in our examples is keystone_admin. Every account, service and configuration file uses this one password. You will want to change this in your setup and you certainly want to use a strong password and a different password for each account/service if this system is going into production.&lt;br /&gt;
&lt;br /&gt;
=== Operating System  ===&lt;br /&gt;
&lt;br /&gt;
The operating system used for this installation is Ubuntu 12.04 LTS (Precise). &lt;br /&gt;
&lt;br /&gt;
=== Server Requirements  ===&lt;br /&gt;
&lt;br /&gt;
Our deployment uses 13 Cisco UCS C-series servers to serve the roles of Controller, Compute, Load-Balancer and Swift Proxy/Storage. The environment scales linearly, therefore individual nodes can be added to increase capacity for any particular OpenStack service. The five distinct node types used in this document are: &lt;br /&gt;
&lt;br /&gt;
*'''3 Controller Nodes-'''&amp;amp;nbsp;Runs Nova API, Nova Conductor, Nova Consoleauth, Nova Novncproxy, Nova Scheduler, NoVNC, Quantum Server, Quantum Plugin OVS, Glance API/Registry, Keystone, Cinder API, Cinder Scheduler, OpenStack Dashboard, RabbitMQ Server, MySQL Server WSREP and Galera. &lt;br /&gt;
**Provides management functionality of the OpenStack environment.&lt;br /&gt;
&lt;br /&gt;
*'''3 Compute Nodes-'''&amp;amp;nbsp;Runs Nova Compute, Quantum OVS and DHCP Agents, Cinder Volume and TGT services. &lt;br /&gt;
**Provides the hypervisor role for running Nova instances (Virtual Machines) and presents LVM volumes for Cinder block storage.&lt;br /&gt;
&lt;br /&gt;
*'''2 Load-Balancer Nodes-'''&amp;amp;nbsp;Runs HAProxy and Keepalived to load-balance traffic across Controller and Swift Proxy clusters.&lt;br /&gt;
&lt;br /&gt;
*'''2 Swift Proxy Nodes-'''&amp;amp;nbsp;The Proxy Node is responsible for tying together users and their data within the the Swift object storage system. For each request, it will look up the location of the account, container or object in the Swift ring and route the request accordingly. The public API is also exposed by Proxy Node.&lt;br /&gt;
&lt;br /&gt;
*'''3 Swift Storage Nodes-'''&amp;amp;nbsp;Each Storage Nodes contains Swift object, container, and account services. At a very high-level, these are the servers that contain the user data and perform replication among one another to keep the system in a consistent state.&lt;br /&gt;
&lt;br /&gt;
=== Networking Requirements  ===&lt;br /&gt;
&lt;br /&gt;
The OpenStack HA environment uses five separate networks. Three of the five networks are used by Tenants. Three tenant networks are being used as an example, and thus the tenant networks can be increased or decreased based on your deployment needs. Connectivity within Tenants uses Quantum with the Open vSwitch (OVS) plugin and [http://docs.openstack.org/trunk/openstack-network/admin/content/provider_networks.html Provider Network Extensions]. Provider Network Extensions allow cloud administrators to create OpenStack networks that map directly to physical networks in the data center and support local, VLAN and GRE deployment models. Our example uses the Provider VLAN networking model. The network details are as follows: &lt;br /&gt;
&lt;br /&gt;
*'''1 Management Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used to perform management functions against the node. For example, SSH'ing to the nodes to change a configuration setting. The network is also used for lights-out management using the CIMC interface of the UCS servers. Lastly, OpenStack API's and the Horizon web dashboard is associated to this network. &lt;br /&gt;
**An IP address for each node is required for this network. If using lights-out management such as CIMC, each node will require 2 addresses from this network. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]). &lt;br /&gt;
*'''3 Tenant Networks'''&amp;lt;br&amp;gt; &lt;br /&gt;
**These networks are used to provide connectivity to Instances. Since Quantum Provider Networking Extensions are being used, it is common to give tenants direct access to a &amp;quot;public&amp;quot; network that can be used to reach the Internet. &lt;br /&gt;
**Compute Nodes will have an interface attached to this network. Since the Compute Node interfaces that attach to this network are managed by OVS, they should not contain an IP address. &lt;br /&gt;
**This network typically employs publicly routable IP addressing if external NAT'ing is not used upstream towards the Internet edge ('''Note:''' in this document all IP addressing for all interfaces comes out of various private addressing blocks). &lt;br /&gt;
*'''1 Storage Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used for providing separate connectivity between Swift Proxy and Storage Nodes. This ensures storage traffic is not interfering with Instance traffic. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]) IP addressing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''[http://docwiki.cisco.com/w/images/a/a8/Grizzly-ha-network-design-details-v1.0.png Figure 1]''' is used to help visualize the network deployment and to act as a reference for configuration steps within the document. It is highly recommend to print the diagram so it can easily be referenced throughout the installation process.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;u&amp;gt;'''Figure 1:'''&amp;lt;/u&amp;gt;'''OpenStack HA Network Design Details''' &lt;br /&gt;
&lt;br /&gt;
[[Image:Grizzly-ha-network-design-details-v1.0.png|thumb|left]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''Other Network Services'''&amp;lt;br&amp;gt; &lt;br /&gt;
**'''DNS: '''In this setup an external DNS server (192.168.26.186) is used for name resolution of OpenStack nodes and external name resolution. If DNS is not being used, the /etc/hosts file should include the following for all nodes:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 127.0.0.1	localhost&lt;br /&gt;
 192.168.220.40  control.dmz-pod2.lab		control&lt;br /&gt;
 192.168.220.41  control01.dmz-pod2.lab	        control01&lt;br /&gt;
 192.168.220.42  control02.dmz-pod2.lab  	control02&lt;br /&gt;
 192.168.220.43  control03.dmz-pod2.lab  	control03&lt;br /&gt;
 192.168.220.60  swiftproxy.dmz-pod2.lab	        swiftproxy&lt;br /&gt;
 192.168.220.61  swiftproxy01.dmz-pod2.lab	swiftproxy01&lt;br /&gt;
 192.168.220.62  swiftproxy02.dmz-pod2.lab	swiftproxy02&lt;br /&gt;
 192.168.220.51  compute01.dmz-pod2.lab          compute01&lt;br /&gt;
 192.168.220.52  compute02.dmz-pod2.lab          compute02&lt;br /&gt;
 192.168.220.53  compute03.dmz-pod2.lab          compute03&lt;br /&gt;
&lt;br /&gt;
*'''NTP: '''In this setup an external NTP server(s) is used for time synchronization. &lt;br /&gt;
*'''Physical Network Switches:''' Each node in this setup is physically attached to a Cisco Nexus switch acting as a Top-of-Rack access layer device. Trunking is configured on each interface connecting to the eth0 NIC of each node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Upstream routers/aggregation layer switches will most likely be terminating the Layer-3 VLAN interfaces. If these interfaces are deployed in a redundant fashion with a First Hop Redundancy Protocol such as HSRP or VRRP, then you should be careful of the IP addresses assigned to the physical L3 switches/routers as they may conflict with the IP address of the Quantum router's public subnet (.3 by default). For example, if you are using HSRP and you have .1 as the standby IP address, .2 as the first L3 switch IP and .3 as the second L3 switch IP, you will receive a duplicate IP address error on the second L3 switch. This can be worked around by using high-order IPs on your upstream L3 device or altering the Quantum subnet configuration at the time of creation to have an IP starting range higher than the physical switches/routers are using (i.e. .4 and higher). Our example uses an IP allocation range that starts with .10 to avoid this issue.&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
The installation of the nodes should be in the following order: &lt;br /&gt;
&lt;br /&gt;
#'''Load-Balancer Nodes-''' slb01 and slb02 &lt;br /&gt;
#'''Swift Storage Nodes-''' swift01, swift02 and swift03 &lt;br /&gt;
#'''Swift Proxy Nodes-''' swiftproxy01 and swiftproxy02 &lt;br /&gt;
#'''Controller Nodes-''' control01, control02 and control03 &lt;br /&gt;
#'''Compute Nodes- '''compute01, compute02 and compute03&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Nodes  ===&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu Precise 12.04 Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Ubuntu 12.04 (AMD 64-bit) from CD/ISO or automated install (i.e. kickstart). You can reference Section 4 in the [http://docwiki.cisco.com/wiki/OpenStack:Essex_Build_Node#Starting_the_Ubuntu_Installation Build Node Guide] if you are unfamiliar with the Ubuntu Precise installation process. Use the following networking section to configure your network adapter properties for each node. As previously mentioned in the Critical Reminders Section, make sure to create an LVM Volume Group named nova-volumes for Compute Nodes and do not configure RAID for Swift Storage Nodes. Lastly, select ssh-server as the only additional package during the Ubuntu Precise installation. &lt;br /&gt;
&lt;br /&gt;
==== Grizzly Packages  ====&lt;br /&gt;
&lt;br /&gt;
The [https://launchpad.net/~openstack-ubuntu-testing/+archive/grizzly-trunk-testing Ubuntu Testers Team] manages the repository used by this document for OpenStack Grizzly packaging. Although the repository supports Ubuntu Precise and Raring releases, the document is only based on Precise. The Ubuntu Testers PPA should be used for all OpenStack nodes (i.e. not needed for Load-Balancer nodes). &lt;br /&gt;
&lt;br /&gt;
Use sudo mode or run from root account for the entire installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the Ubuntu Grizzly repository: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install python-software-properties -y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;apt-add-repository ppa:openstack-ubuntu-testing/grizzly-trunk-testing&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' Press enter when you are prompted for “[ENTER] or cancel” when adding the PPA. Update your system: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get update&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Networking  ====&lt;br /&gt;
&lt;br /&gt;
Our implementation uses VLANs for segmentation of certain networks. Make sure the VLAN package is installed and your network switches have been configured for VLANs. Otherwise, replicate the network setup using only physical interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install vlan -y&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.81&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.82&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Proxy Node swiftproxy01 /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Proxy Node swiftproxy02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.62&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.62&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.41&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.42&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.43&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.51&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.52&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.53&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart networking: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/networking restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Time Synchronization  ====&lt;br /&gt;
&lt;br /&gt;
Install NTP: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y ntp&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add your NTP server(s) by editing /etc/ntp.conf. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; OpenStack requires that clocks be synchronized. Our example uses a '''FAKE '''server called ntp.corp.com as the NTP server. Make sure you change&amp;amp;nbsp;ntp.corp.com to your real NTP server. Lastly, make sure the NTP server name resolves. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/ntp.conf&lt;br /&gt;
&lt;br /&gt;
server ntp.corp.com&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart NTP for the changes to take effect &lt;br /&gt;
&amp;lt;pre&amp;gt;service ntp restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that you are pulling time: &lt;br /&gt;
&amp;lt;pre&amp;gt;ntpq -p&lt;br /&gt;
&lt;br /&gt;
remote           refid      st t when poll reach   delay   offset  jitter&lt;br /&gt;
==============================================================================&lt;br /&gt;
*ntp.corp.       .GPS.            1 u  185  512  377   76.035    0.053   0.033&lt;br /&gt;
 cheezum.mattnor 129.7.1.66       2 u   8d 1024    0   47.731   -0.555   0.000&lt;br /&gt;
 ntp2.rescomp.be .STEP.          16 u    - 1024    0    0.000    0.000   0.000&lt;br /&gt;
 216.45.57.38    204.123.2.5      2 u  54h 1024    0   12.607    0.808   0.000&lt;br /&gt;
 lithium.constan 128.4.1.1        2 u   8d 1024    0   69.861    0.206   0.000&lt;br /&gt;
 europium.canoni 193.79.237.14    2 u  54h 1024    0  144.040   -1.455   0.000&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load Balancer Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Perform the following steps on nodes slb01 and slb02. &lt;br /&gt;
&lt;br /&gt;
==== Keepalived &amp;amp;amp; HAProxy  ====&lt;br /&gt;
&lt;br /&gt;
Edit /etc/sysctl.conf to allow Keepalived to associate a virtual IP address (VIP) that is not directly bound to an interface on the node:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;net.ipv4.ip_nonlocal_bind=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load in sysctl settings from /etc/sysctl.conf: &lt;br /&gt;
&amp;lt;pre&amp;gt;sysctl -p&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install Keepalived and HAProxy packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keepalived haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the /var/lib/haproxy directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /var/lib/haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure /var/lib/haproxy is owned by root. Change the file ownership if needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /var/lib/haproxy/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the&amp;amp;nbsp;/etc/keepalived/keepalived.conf file for slb01 with the contents below.&amp;amp;nbsp; Change&amp;amp;nbsp;[YOUR_DOMAIN_NAME] with your actual domain name.&amp;amp;nbsp; The keepalived.conf includes the following sections:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global_defs-''' Global parameters affect the whole process behavior.&amp;amp;nbsp;There may be several 'global' sections if needed, but their parameters will only be merged. &amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_script-''' Keepalived supports a VRRP scripting framework to extend base functionality.&amp;amp;nbsp; The vrrp_script named haproxy will check the status of the haproxy service every 2 seconds and add 2 points of priority if the status is running. &amp;amp;nbsp;If the haproxy service is not running, the backup HAProxy Node will become the primary and begin passing traffic for the virtual_ipaddress(es).&amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_instance-''' Is where you define configuration paramters for virtual gateway addresses.&amp;amp;nbsp; slb01 is configured as the primary gateway for 192.168.220.40 (Controller Cluster) and the backup gateway for 192.168.220.60 (Swift Proxy Cluster). Accordingly, slb02 is configured as the primary for 192.168.220.60 and the backup for 192.168.220.40.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb01&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure /etc/keepalived/keepalived.conf for slb02 with the following contents. Change [YOUR_DOMAIN_NAME] with your actual domain name. &lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb02&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb01 with the contents below. HAProxy's configuration process involves 3 major sources of parameters:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*The arguments from the command-line, which always take precedence.&amp;lt;br&amp;gt; &lt;br /&gt;
*The &amp;quot;global&amp;quot; section, which sets process-wide parameters.&amp;lt;br&amp;gt; &lt;br /&gt;
*The proxies sections which can take form of &amp;quot;defaults&amp;quot;, &amp;quot;listen&amp;quot;, &amp;quot;frontend&amp;quot; and &amp;quot;backend&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following provides additional details of the haproxy.cfg file:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global-&amp;amp;nbsp; '''Sets process-wide parameters for load-balancing traffic.&amp;amp;nbsp; Global parameters can be overriden by server-specific configurations within the''listen section ''of the haproxy.cfg file.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''defaults-''' The &amp;quot;defaults&amp;quot; section sets default parameters for all other sections following its declaration. Those default parameters are reset by the next &amp;quot;defaults&amp;quot; section. The name is optional but its use is encouraged for better readability.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''listen-''' A &amp;quot;listen&amp;quot; section defines a complete proxy with its front-end (i.e. listening VIP) and back-end (i.e. real IP of servers)&amp;amp;nbsp;parts combined in one section. Currently two major proxy modes are supported: &amp;quot;tcp&amp;quot;, also known as layer 4 and &amp;quot;http&amp;quot;, also known as layer 7. In layer 4 mode, HAProxy simply forwards bidirectional traffic between two sides. In layer 7 mode, HAProxy analyzes the protocol and can interact with it by allowing, blocking, switching, adding, modifying, or removing arbitrary content in requests or responses based on configurable criteria.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
 chroot  /var/lib/haproxy&lt;br /&gt;
 daemon  &lt;br /&gt;
 group  haproxy&lt;br /&gt;
 log  192.168.220.81 local0&lt;br /&gt;
 maxconn  4000&lt;br /&gt;
 pidfile  /var/run/haproxy.pid&lt;br /&gt;
 user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
 log  global&lt;br /&gt;
 maxconn  8000&lt;br /&gt;
 option  redispatch&lt;br /&gt;
 retries  3&lt;br /&gt;
 timeout  http-request 10s&lt;br /&gt;
 timeout  queue 1m&lt;br /&gt;
 timeout  connect 10s&lt;br /&gt;
 timeout  client 1m&lt;br /&gt;
 timeout  server 1m&lt;br /&gt;
 timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
 bind 192.168.220.40:80&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
 bind 192.168.220.40:3306&lt;br /&gt;
 balance  source&lt;br /&gt;
 mode  tcp&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9292&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
 bind 192.168.220.40:9191&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
 bind 192.168.220.40:35357&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
 bind 192.168.220.40:5000&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
 bind 192.168.220.40:11211&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
 bind 192.168.220.40:8773&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
 bind 192.168.220.40:8774&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
 bind 192.168.220.40:8775&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
 bind 192.168.220.40:8776&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
 bind 192.168.220.40:6080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9696&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
 bind 192.168.220.60:8080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb02 with the contents below. &lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
  chroot  /var/lib/haproxy&lt;br /&gt;
  daemon  &lt;br /&gt;
  group  haproxy&lt;br /&gt;
  log  192.168.220.82 local0&lt;br /&gt;
  maxconn  4000&lt;br /&gt;
  pidfile  /var/run/haproxy.pid&lt;br /&gt;
  user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
  log  global&lt;br /&gt;
  maxconn  8000&lt;br /&gt;
  option  redispatch&lt;br /&gt;
  retries  3&lt;br /&gt;
  timeout  http-request 10s&lt;br /&gt;
  timeout  queue 1m&lt;br /&gt;
  timeout  connect 10s&lt;br /&gt;
  timeout  client 1m&lt;br /&gt;
  timeout  server 1m&lt;br /&gt;
  timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
  bind 192.168.220.40:80&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
  bind 192.168.220.40:3306&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9292&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
  bind 192.168.220.40:9191&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
  bind 192.168.220.40:35357&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
  bind 192.168.220.40:5000&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
  bind 192.168.220.40:11211&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
  bind 192.168.220.40:8773&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
  bind 192.168.220.40:8774&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
  bind 192.168.220.40:8775&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
  bind 192.168.220.40:8776&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
  bind 192.168.220.40:6080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9696&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
  bind 192.168.220.60:8080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set &amp;quot;ENABLED&amp;quot; to &amp;quot;1&amp;quot; in /etc/default/haproxy &lt;br /&gt;
&amp;lt;pre&amp;gt;ENABLED=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keepalived and HAProxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/keepalived restart&lt;br /&gt;
/etc/init.d/haproxy restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Swift Nodes&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Install Swift and other basic packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift openssh-server rsync memcached python-netifaces python-xattr python-memcache &amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir -p /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration file. '''Note:''' This file should be identical on all Swift nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/swift.conf&lt;br /&gt;
&lt;br /&gt;
[swift-hash]&lt;br /&gt;
swift_hash_path_suffix = Gdr8ny7YyWqy2&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the Swift directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Storage Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Run these commands on nodes swift01, swift02 and swift03. Install the Swift Storage Node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-account swift-container swift-object xfsprogs parted&amp;lt;/pre&amp;gt; &lt;br /&gt;
For each of the hard disks other than the Ubuntu installation disk (i.e. /dev/sda), create an XFS volume with a single partition. Our example uses five hard disks (/dev/sdb - /dev/sdf) per Storage Node. Repeat this step for each disk that will be used for Swift storage: &lt;br /&gt;
&amp;lt;pre&amp;gt;parted /dev/sdb mklabel msdos&lt;br /&gt;
parted -a optimal /dev/sdb mkpart primary ext2 0% 100%&lt;br /&gt;
mkfs.xfs -i size=1024 /dev/sdb1&lt;br /&gt;
echo &amp;quot;/dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0&amp;quot; &amp;amp;gt;&amp;amp;gt; /etc/fstab&lt;br /&gt;
mkdir -p /srv/node/sdb1&lt;br /&gt;
mount /srv/node/sdb1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the mount directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /srv/node&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create an Rsync configuration file on each Storage Node. In the following example, replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/rsyncd.conf&lt;br /&gt;
&lt;br /&gt;
uid = swift&lt;br /&gt;
gid = swift&lt;br /&gt;
log file = /var/log/rsyncd.log&lt;br /&gt;
pid file = /var/run/rsyncd.pid&lt;br /&gt;
address = [STORAGE_NET_IP]&lt;br /&gt;
&lt;br /&gt;
[account]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/account.lock&lt;br /&gt;
&lt;br /&gt;
[container]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/container.lock&lt;br /&gt;
&lt;br /&gt;
[object]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/object.lock&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following line in /etc/default/rsync: &lt;br /&gt;
&amp;lt;pre&amp;gt;RSYNC_ENABLE = true&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start rsync daemon: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rsync start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/account-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/account-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = account-server&lt;br /&gt;
&lt;br /&gt;
[app:account-server]&lt;br /&gt;
use = egg:swift#account&lt;br /&gt;
&lt;br /&gt;
[account-replicator]&lt;br /&gt;
&lt;br /&gt;
[account-auditor]&lt;br /&gt;
&lt;br /&gt;
[account-reaper]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/container-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/container-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = container-server&lt;br /&gt;
&lt;br /&gt;
[app:container-server]&lt;br /&gt;
use = egg:swift#container&lt;br /&gt;
&lt;br /&gt;
[container-replicator]&lt;br /&gt;
&lt;br /&gt;
[container-updater]&lt;br /&gt;
&lt;br /&gt;
[container-auditor]&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Create /etc/swift/object-server.conf&amp;amp;nbsp;with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71):&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/object-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = object-server&lt;br /&gt;
&lt;br /&gt;
[app:object-server]&lt;br /&gt;
use = egg:swift#object&lt;br /&gt;
&lt;br /&gt;
[object-replicator]&lt;br /&gt;
&lt;br /&gt;
[object-updater]&lt;br /&gt;
&lt;br /&gt;
[object-auditor]&lt;br /&gt;
&lt;br /&gt;
[object-expirer]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the storage services. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; At this point, the ring files will not be present on the storage nodes. This will cause the *-replicator services to fail to start properly. After you create the ring files on the first proxy node (in the next section) and distribute them to the storage nodes, a service restart should allow all Swift services to start properly. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init object-server start&lt;br /&gt;
swift-init object-replicator start&lt;br /&gt;
swift-init object-updater start&lt;br /&gt;
swift-init object-auditor start&lt;br /&gt;
swift-init container-server start&lt;br /&gt;
swift-init container-replicator start&lt;br /&gt;
swift-init container-updater start&lt;br /&gt;
swift-init container-auditor start&lt;br /&gt;
swift-init account-server start&lt;br /&gt;
swift-init account-replicator start&lt;br /&gt;
swift-init account-auditor start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height: 1.5em;&amp;quot;&amp;gt;Make sure you repeat these steps for every Storage Node.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Proxy Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Ensure you have completed the previous steps in the &amp;quot;General Installation Steps for All Swift Nodes&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
Perform these steps on nodes swiftproxy01 and swiftproxy02. First, install the proxy node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-proxy memcached python-keystoneclient python-swiftclient swift-plugin-s3&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify memcached to bind to the storage network interface (192.168.222.x in our example). Edit the following line in /etc/memcached.conf, changing: &lt;br /&gt;
&amp;lt;pre&amp;gt;-l 127.0.0.1 &lt;br /&gt;
to&lt;br /&gt;
-l [STORAGE_NET_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the memcached server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
If it does not exist, create the /etc/swift/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /etc/swift/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure the directory the /etc/swift and the /var/cache/swift directories are owned by the swift user and group: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown swift:swift /etc/swift/&lt;br /&gt;
chown -R swift:swift /var/cache/swift/&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create /etc/swift/proxy-server.conf with the following contents: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_port = 8080&lt;br /&gt;
workers = 32&lt;br /&gt;
user = swift&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = catch_errors healthcheck cache ratelimit authtoken keystoneauth proxy-server&lt;br /&gt;
&lt;br /&gt;
[app:proxy-server]&lt;br /&gt;
use = egg:swift#proxy&lt;br /&gt;
allow_account_management = true&lt;br /&gt;
account_autocreate = true&lt;br /&gt;
&lt;br /&gt;
[filter:keystoneauth]&lt;br /&gt;
use = egg:swift#keystoneauth&lt;br /&gt;
operator_roles = Member,admin, swiftoperator&lt;br /&gt;
&lt;br /&gt;
[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
signing_dir = /var/cache/swift&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
auth_uri = http://192.168.220.40:5000&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = swift&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
delay_auth_decision = 10&lt;br /&gt;
&lt;br /&gt;
[filter:cache]&lt;br /&gt;
use = egg:swift#memcache&lt;br /&gt;
memcache_servers = 192.168.222.61:11211,192.168.222.62:11211&lt;br /&gt;
&lt;br /&gt;
[filter:catch_errors]&lt;br /&gt;
use = egg:swift#catch_errors&lt;br /&gt;
&lt;br /&gt;
[filter:healthcheck]&lt;br /&gt;
use = egg:swift#healthcheck&lt;br /&gt;
&lt;br /&gt;
[filter:ratelimit]&lt;br /&gt;
use = egg:swift#ratelimit&lt;br /&gt;
clock_accuracy = 1000&lt;br /&gt;
max_sleep_time_seconds = 60&lt;br /&gt;
log_sleep_time_seconds = 0&lt;br /&gt;
rate_buffer_seconds = 5&lt;br /&gt;
account_ratelimit = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, create the account, container and object rings. The builder command is basically creating a builder file with a few parameters. The parameter with the value of 18 represents 2 ^ 18th, this is the value of the partition size. Set this “partition power” value based on the total amount of storage you expect your entire ring to use. The value of 3 represents the number of replicas of each object, with the last value being the number of hours to restrict moving a partition more than once. Additional information regarding Swift ring preperation can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/preparing-the-ring.html here]. &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/swift&lt;br /&gt;
&lt;br /&gt;
swift-ring-builder account.builder create 18 3 1&lt;br /&gt;
swift-ring-builder container.builder create 18 3 1&lt;br /&gt;
swift-ring-builder object.builder create 18 3 1&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, for every storage device on each storage node add entries to each ring. This example prepares the account, container and object rings for storage node swift01 (192.168.222.71) with a partition in zone 1. The mount point of this partition is /srv/node/sdb1 and the path in rsyncd.conf is /srv/node/, the DEVICE would be sdb1 and the commands would look like: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder add z1-192.168.222.71:6002/sdb1 100&lt;br /&gt;
swift-ring-builder container.builder add z1-192.168.222.71:6001/sdb1 100&lt;br /&gt;
swift-ring-builder object.builder add z1-192.168.222.71:6000/sdb1 100&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Make sure not to place all devices in the same zone (i.e. z1). It is recommended to configure the zones as high-level as possible to create the greatest amount of isolation. Some considerations can include physical location, power availability, and network connectivity. For example, in a small cluster you might decide to split the zones up by cabinet, with each cabinet having its own power and network connectivity. Since our deployment only uses 3 storage nodes, each node should be in its own zone. However, it is recommended to have a minimum of 5 zones in a production-level Swift deployment. &lt;br /&gt;
&lt;br /&gt;
Verify the ring contents for each ring: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
swift-ring-builder /etc/swift/container.builder&lt;br /&gt;
swift-ring-builder /etc/swift/object.builder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Your output should look similar to this: &lt;br /&gt;
&amp;lt;pre&amp;gt;root@swiftproxy01:~# swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
/etc/swift/account.builder, build version 15&lt;br /&gt;
262144 partitions, 3 replicas, 3 zones, 15 devices, 0.00 balance&lt;br /&gt;
The minimum number of hours before a partition can be reassigned is 1&lt;br /&gt;
Devices:    id  zone      ip address  port      name weight partitions balance meta&lt;br /&gt;
             0     3  192.168.222.73  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
             1     2  192.168.222.72  6002      sdd1   1.00      52429    0.00 &lt;br /&gt;
             2     3  192.168.222.73  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             3     2  192.168.222.72  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             4     3  192.168.222.73  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             5     1  192.168.222.71  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             6     1  192.168.222.71  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             7     2  192.168.222.72  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
             8     1  192.168.222.71  6002      sdd1   1.00      52428   -0.00 &lt;br /&gt;
             9     2  192.168.222.72  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
            10     1  192.168.222.71  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
            11     1  192.168.222.71  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            12     3  192.168.222.73  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            13     2  192.168.222.72  6002      sde1   1.00      52428   -0.00 &lt;br /&gt;
            14     3  192.168.222.73  6002      sdd1   1.00      52428   -0.00&amp;lt;/pre&amp;gt; &lt;br /&gt;
Repeat the command, but replace account with object and container to verify the contents of the others two Swift rings. &lt;br /&gt;
&lt;br /&gt;
Rebalance the rings. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Rebalancing rings can take a while. You may get a message about a balance value and that you need to rebalance/push after the minimum 1 hour. If so, recheck the status after an hour. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder rebalance&lt;br /&gt;
swift-ring-builder container.builder rebalance&lt;br /&gt;
swift-ring-builder object.builder rebalance&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the account.ring.gz, container.ring.gz, and object.ring.gz files to swiftproxy02 and the 3 storage nodes in /etc/swift. &lt;br /&gt;
&lt;br /&gt;
Make sure all the config files are owned by the swift user: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Proxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init proxy start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verify the Swift Installation  ===&lt;br /&gt;
&lt;br /&gt;
You can run verification commands from the proxy server or any server with access to Keystone. Keep in mind that proxy nodes are configured to use Keystone for user authentication. As a result, you '''MUST''' complete the Controller Node Installation steps and ensure Keystone is operational before proceeding with Swift verification. &lt;br /&gt;
&lt;br /&gt;
Verify that you can successfully authenticate against Keystone using the Swift authentication credentials: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y curl&lt;br /&gt;
&lt;br /&gt;
curl -s -d &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should receive output similar to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;access&amp;quot;: {&amp;quot;token&amp;quot;: {&amp;quot;issued_at&amp;quot;: &amp;quot;2013-04-02T14:55:31.149327&amp;quot;, &amp;quot;expires&amp;quot;: &amp;quot;2013-04-03T14:55:31Z&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;bb29ef5439ce4a75bf85332bbadf6538&amp;quot;, &amp;quot;tenant&amp;quot;: {&amp;quot;description&amp;quot;: &lt;br /&gt;
null, &amp;quot;enabled&amp;quot;: true, &amp;quot;id&amp;quot;: &amp;quot;b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;services&amp;quot;}}, &amp;quot;serviceCatalog&amp;quot;: [{&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;45a336cb74e04e11ab95c0ea28b699d6&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;compute&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;nova&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;259fef5e66814f47ac1934d3cf522a3d&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;network&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;quantum&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [&lt;br /&gt;
{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;166de3790eb54c31a58237fe9ea3d301&amp;quot;, &lt;br /&gt;
&amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;image&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;glance&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;0a2c69157d5948a9ae8ecee5c65a6d2b&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;volume&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;cinder&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Admin&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &lt;br /&gt;
&amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;05f85b8aacbd4c87b680dcc2fb6da539&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;}], &lt;br /&gt;
&amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;ec2&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;ec2&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.60:8080/v1&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;4a1af526137341c0a682eb573101ddde&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;object-store&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;3e3f7b50b5bd44b7a15b3e4ae55086bf&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;identity&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;keystone&amp;quot;}], &amp;quot;user&amp;quot;: {&amp;quot;username&amp;quot;: &amp;quot;swift&amp;quot;, &amp;quot;roles_links&amp;quot;: [], &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;ed69664ac78a4b65a36d63da6b760863&amp;quot;, &amp;quot;roles&amp;quot;: [{&amp;quot;name&amp;quot;: &amp;quot;_member_&amp;quot;}, {&amp;quot;name&amp;quot;: &amp;quot;admin&amp;quot;}], &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, &amp;quot;metadata&amp;quot;: {&amp;quot;is_admin&amp;quot;: 0, &amp;quot;roles&amp;quot;: [&lt;br /&gt;
&amp;quot;9fe2ff9ee4384b1894a90878d3e92bab&amp;quot;, &amp;quot;6a553ae3be3c4f8c8fe079830d4102a5&amp;quot;]}}}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Use the swift client stat command to make sure you can view the contents of the ring.&amp;amp;nbsp;You can run these commands from the proxy server or any server with the swift client and access to Keystone. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U admin:admin -K keystone_admin stat&lt;br /&gt;
   Account: AUTH_3eccdb2a9331419c96ac9ff336110b65&lt;br /&gt;
Containers: 1&lt;br /&gt;
   Objects: 2&lt;br /&gt;
     Bytes: 0&lt;br /&gt;
Accept-Ranges: bytes&lt;br /&gt;
X-Timestamp: 1363989109.30329&lt;br /&gt;
X-Trans-Id: tx147dd9983ac54af1b71c5a561ae2aa9a&lt;br /&gt;
Content-Type: text/plain; charset=utf-8&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can see that 1 container exists. &amp;amp;nbsp;Now, lets find out the name of the container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list&lt;br /&gt;
glance&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The glance container is created after the Controller cluster is built and an image has been uploaded to Glance. &lt;br /&gt;
&lt;br /&gt;
List the contents of the Glance container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list glance&lt;br /&gt;
24164630-ba2f-436a-8bc6-43975717d5e5&lt;br /&gt;
858a11dc-ed61-4a18-a778-eabcb454ae45&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Controller Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Runs these commands on nodes control01, control02 and control03. &amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install MySQL and Galera dependencies: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y libaio1 libssl0.9.8 mysql-client-5.5 python-mysqldb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download MySQL-WSREP and Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget -O /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb http://launchpad.net/codership-mysql/5.5/5.5.23-23.6/+download/mysql-server-wsrep-5.5.23-23.6-amd64.deb --no-check-certificate&lt;br /&gt;
wget -O /tmp/galera-23.2.1-amd64.deb http://launchpad.net/galera/2.x/23.2.1/+download/galera-23.2.1-amd64.deb --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install MySQL and Galera. '''Note:''' If you are prompted to create a root password during the Galera package installation, please make note of the password you use as it will be needed when connecting to MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;dpkg -i /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb&lt;br /&gt;
dpkg -i /tmp/galera-23.2.1-amd64.deb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the MySQL bind address: &lt;br /&gt;
&amp;lt;pre&amp;gt;sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the following line to /etc/rc.local on all controllers to allow MySQL to start automatically upon reboot: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.41&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.42&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.43&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt;It is important to understand the [http://www.codership.com/wiki/doku.php?id=mysql_options_0.8 gcomm address] concept behind [http://www.codership.com/ Galera]. Only use an empty gcomm:// address when you create a NEW cluster. Never use it when your intention is to reconnect to an existing one. After the Galera cluster is established, you should change the gcomm address on control01 from gcomm:// to gcomm://192.168.220.42 or gcomm://192.168.220.43. Otherwise, control01 will not join the cluster upon reboot. Make sure to also restart the mysql service when making changes to any of the associated configuration files. &lt;br /&gt;
&lt;br /&gt;
Restart MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the Galera cluster has been established. The value should show 4 for all nodes in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | Variable_name      | Value |&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | wsrep_local_state  |    4  |&lt;br /&gt;
  +------------------------+---+&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Monitoring  ====&lt;br /&gt;
Complete each of the steps below on each control node except for when a single node is specified.&lt;br /&gt;
&lt;br /&gt;
Install xinetd: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y xinetd&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the mysqlchk service: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/mysqlchk -P /etc/xinetd.d/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' After functional testing is complete, it's recommended to secure the mysqlchk service. This can be accomplished by editing the only_from and per_source values in /etc/xinetd.d/ to the subnet used by the load-balancer nodes. &lt;br /&gt;
&lt;br /&gt;
Edit /etc/xinetd.d/mysqlchk by changing &amp;amp;lt;%= mysqlchk_script_dir&amp;amp;nbsp;%&amp;amp;gt;/galera_chk to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure root is the file owner: &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
If not, change the file permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the mysqlcheck service to /etc/services by adding the following line: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysqlchk        9200/tcp                        # MySQL Galera health check script&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the MySQL Galera health check script: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/galera_chk -P /usr/local/bin/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the file ownership and permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /usr/local/bin/galera_chk &lt;br /&gt;
chmod +x  /usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /usr/local/bin/galera_chk as follows. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41). &lt;br /&gt;
&amp;lt;pre&amp;gt;MYSQL_HOST=&amp;quot;[CONTROLLER_MGT_IP]&amp;quot;&lt;br /&gt;
MYSQL_PORT=&amp;quot;3306&amp;quot;&lt;br /&gt;
MYSQL_USERNAME=&amp;quot;mysqlchk_user&amp;quot;&lt;br /&gt;
MYSQL_PASSWORD=&amp;quot;mysqlchk_password&amp;quot;&lt;br /&gt;
MYSQL_OPTS=&amp;quot;-N -q -A&amp;quot;&lt;br /&gt;
TMP_FILE=&amp;quot;/dev/shm/mysqlchk.$$.out&amp;quot;&lt;br /&gt;
ERR_FILE=&amp;quot;/dev/shm/mysqlchk.$$.err&amp;quot;&lt;br /&gt;
FORCE_FAIL=&amp;quot;/dev/shm/proxyoff&amp;quot;&lt;br /&gt;
MYSQL_BIN=&amp;quot;/usr/bin/mysql&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart xinetsd: &lt;br /&gt;
&amp;lt;pre&amp;gt;service xinetd restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Connect to MySQL and add the mysqlchk user to each controller in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
use mysql;&lt;br /&gt;
INSERT INTO user (Host,User,Password) VALUES('%','mysqlchk_user',PASSWORD('mysqlchk_password'));&lt;br /&gt;
flush privileges;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Grant privileges for the mysqlchk user. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41).: &lt;br /&gt;
&amp;lt;pre&amp;gt;grant SUPER,PROCESS on *.* to 'mysqlchk_user'@'[CONTROLLER_MGT_IP]' IDENTIFIED BY 'mysqlchk_password';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the operational status of the MySQL Galera health check service. From slb01 or slb02, Telnet using port 9200 (health check port) and make sure you get a &amp;quot;MySQL is running&amp;quot; message: &lt;br /&gt;
&amp;lt;pre&amp;gt;telnet 192.168.220.41 9200&lt;br /&gt;
Trying 192.168.220.41...&lt;br /&gt;
Connected to 192.168.220.41.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Content-Type: text/html&lt;br /&gt;
Content-Length: 43&lt;br /&gt;
&amp;amp;lt;html&amp;amp;gt;&amp;amp;lt;body&amp;amp;gt;MySQL is running.&amp;amp;lt;/body&amp;amp;gt;&amp;amp;lt;/html&amp;amp;gt;&lt;br /&gt;
Connection closed by foreign host.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Repeat the previous step for each control node. &lt;br /&gt;
&lt;br /&gt;
Verify that you can access the MySQL database by using the Virtual IP address (VIP) of the Galera cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -umysqlchk_user -pmysqlchk_password -h192.168.220.40&amp;lt;/pre&amp;gt; &lt;br /&gt;
For informational purposes, this is the command used by the health check script. This example is for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql -N -q -A --host=192.168.220.41 --user=mysqlchk_user --password=mysqlchk_password -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RabbitMQ Installation  ====&lt;br /&gt;
Complete each of the following steps on each control node unless a specific node is called out.&lt;br /&gt;
&lt;br /&gt;
Install RabbitMQ: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y rabbitmq-server&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure RabbitMQ Clustering. First, stop the service and remove the mnesia database on all control nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server stop&lt;br /&gt;
rm -rf /var/lib/rabbitmq/mnesia&amp;lt;/pre&amp;gt; &lt;br /&gt;
Clustering requires that the nodes have the same Erlang cookie. Copy the Erlang cookie from control01 to control02 and control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.42:/var/lib/rabbitmq/.erlang.cookie&lt;br /&gt;
scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.43:/var/lib/rabbitmq/.erlang.cookie&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The above command requires root login (disabled by default in Ubuntu). If you do not have root permissions, copy the Erlang cookie from /var/lib/rabbitmq/ to the /tmp directory of control02 and control03 and then to /var/lib/rabbitmq/. Also, make sure the file permissions match on all 3 nodes. &lt;br /&gt;
&lt;br /&gt;
Now that all 3 control nodes have the same Erlang cookie, make sure that RabbitMQ will start: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server start&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' If RabbitMQ does not successfully start, do not proceed with clustering.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Clustering can be configured using rabbitmqctl commands or by modifying the RabbitMQ configuration file. Our example uses the rabbitmqctl commands since issues were experienced using the configuration file with RabbitMQ 2.7.1. You can see both approaches to configuring RabbitMQ clustering [http://www.rabbitmq.com/clustering.html#setup here]. &lt;br /&gt;
&lt;br /&gt;
In order to cluster the three control nodes, two of the nodes (i.e. rabbit@control2 and rabbit@control03) will be configured to join the cluster of the third node (rabbit@control01). '''Note:''' Joining a cluster implicitly resets the node, thus removing all resources and data that were previously present on that node. &lt;br /&gt;
&lt;br /&gt;
From control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control02 is now clustered with control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control02 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
From control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control03 is now clustered with control01 and control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control03 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02,rabbit@control03]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02,rabbit@control03]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Now that clustering is complete, secure RabbitMQ by removing the default (guest) user: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl delete_user guest&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a RabbitMQ user account that will be used by OpenStack services: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl add_user openstack_rabbit_user openstack_rabbit_password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the permissions for the new RabbitMQ user account: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl set_permissions -p / openstack_rabbit_user &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the user settings: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl list_users&lt;br /&gt;
rabbitmqctl list_user_permissions openstack_rabbit_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keystone Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Keystone on every control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keystone python-keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Remove the sqllite db: &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/keystone/keystone.db&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Keystone. The database needs to be created on only 1 control node. &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE keystone;&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'%' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'localhost' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' From other controllers in the cluster, you can see that databases are replicated by Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show databases;&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/keystone/keystone.conf file on each controller. Change [CONTROLLER_MGT_IP] to the management IP address of the control node (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
admin_token = keystone_admin_token&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
&lt;br /&gt;
[sql]&lt;br /&gt;
connection = mysql://keystone_admin:keystone_db_pass@192.168.220.40/keystone&lt;br /&gt;
&lt;br /&gt;
[ssl]&lt;br /&gt;
enable = False&lt;br /&gt;
&lt;br /&gt;
[signing]&lt;br /&gt;
token_format = UUID&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a credential file and load it so credentials are not required for every OpenStack client command. '''Note:''' This needs to be created on each node that you will run OpenStack commands from: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that MySQL is listening on the VIP for the Keystone database. If you have any problems connecting to the VIP, try the real IP address of a control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -h192.168.220.40 -ukeystone_admin -pkeystone_db_pass keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keystone: &lt;br /&gt;
&amp;lt;pre&amp;gt;service keystone restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh Keystone data script](Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;ADMIN_PASSWORD=${ADMIN_PASSWORD:-keystone_admin}&lt;br /&gt;
export SERVICE_TOKEN=&amp;quot;keystone_admin_token&amp;quot;&lt;br /&gt;
export SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0/&amp;quot;&lt;br /&gt;
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-services}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with data (users, tenants, services). '''Note:''' If you see a long timeout and errors about &amp;quot;connection timeout&amp;quot;, it may be related to your proxy setting. Remove the export of your http/https proxies and re-run the script. You will have to re-add your proxies for any other external downloads. &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://github.com/EmilienM/openstack-folsom-guide/blob/master/scripts/keystone-endpoints.sh Keystone endpoint script] (Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;# MySQL definitions&lt;br /&gt;
MYSQL_USER=keystone_admin&lt;br /&gt;
MYSQL_DATABASE=keystone&lt;br /&gt;
MYSQL_HOST=192.168.220.40&lt;br /&gt;
MYSQL_PASSWORD=keystone_db_pass&lt;br /&gt;
&lt;br /&gt;
# Keystone definitions&lt;br /&gt;
KEYSTONE_REGION=RegionOne&lt;br /&gt;
SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# other definitions&lt;br /&gt;
MASTER=&amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
SWIFT_MASTER=&amp;quot;192.168.220.60&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with service endpoints. Again, if you are using proxies then you will need remove them from your export before running this command: &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Test connectivity to Keystone by using a curl request&amp;amp;nbsp;: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install curl openssl -y&lt;br /&gt;
&lt;br /&gt;
curl -d '{&amp;quot;auth&amp;quot;: {&amp;quot;tenantName&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;passwordCredentials&amp;quot;:{&amp;quot;username&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;password&amp;quot;: &amp;quot;keystone_admin&amp;quot;}}}' -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens | python -mjson.tool&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the above command is successful, you will receive output that includes a token and a list of service endpoints.&amp;amp;nbsp;You may also want to verify the other service account credentials: &lt;br /&gt;
&lt;br /&gt;
'''Glance''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;glance\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Nova''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;nova\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Swift''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Quantum''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;quantum\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Cinder''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;cinder\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can also use the Keystone client to verify the configuration: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
keystone user-list&lt;br /&gt;
keystone role-list&lt;br /&gt;
keystone service-list&lt;br /&gt;
keystone endpoint-list&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Glance Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Glance API and Registry packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y glance-api glance-registry&amp;lt;/pre&amp;gt; &lt;br /&gt;
Delete the glance.sqlite file created in the /var/lib/glance/ directory &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/glance/glance.sqlite&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Glance on only 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE glance;&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-api.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41). Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
default_store = swift&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
registry_host = 192.168.220.40&lt;br /&gt;
swift_store_auth_address = http://192.168.220.40:5000/v2.0/&lt;br /&gt;
swift_store_user = services:swift&lt;br /&gt;
swift_store_key = keystone_admin&lt;br /&gt;
swift_store_container = glance&lt;br /&gt;
swift_store_create_container_on_put = True&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone+cachemanagement&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-registry.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41) Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the glance-api and glance-registry services: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-api restart; service glance-registry restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
The database tables are under version control and you use the following command on a new installation to prevent the Image service from breaking possible upgrades. This command is used on only one of the controllers: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage version_control 0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the glance database on one control node (You may get a message about deprecation - you can ignore): &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the services again to take into account the new modifications: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-registry restart; service glance-api restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the Cirros 0.3.1 cloud image to a controller node and then upload it to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-disk.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;cirros&amp;quot; is_public=true disk_format=qcow2 container_format=ovf &amp;amp;lt; cirros-0.3.1-x86_64-disk.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that Glance is serving the image: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance image-list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, you can add the Ubuntu Precise image to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
 &lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum Server on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y quantum-server quantum-plugin-openvswitch&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Quantum database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE quantum; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'%' IDENTIFIED BY 'quantum_pass'; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'localhost' IDENTIFIED BY 'quantum_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/quantum/quantum.conf file on all control nodes. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = quantum&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/quantum/keystone-signing&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1&lt;br /&gt;
bridge_mappings = physnet1:br-ex &lt;br /&gt;
&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the quantum server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-server restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova software packages on all Control Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-api nova-conductor nova-consoleauth nova-scheduler nova-novncproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Nova database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE nova;&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the authtoken section in the /etc/nova/api-paste.ini file on each control node to include the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = nova&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [CONTROLLER_MGT_IP] with the controller node's management IP address (i.e. control01 = 192.168.220.41). Do this on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
dhcpbridge_flagfile=/etc/nova/nova.conf&lt;br /&gt;
dhcpbridge=/usr/bin/nova-dhcpbridge&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
verbose=true&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
image_service=nova.image.glance.GlanceImageService&lt;br /&gt;
rpc_backend=nova.rpc.impl_kombu&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
service_down_time=60&lt;br /&gt;
rabbit_port=5672&lt;br /&gt;
rabbit_virtual_host=/&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
ec2_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
enabled_apis=ec2,osapi_compute&lt;br /&gt;
osapi_compute_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
novncproxy_port=6080&lt;br /&gt;
novncproxy_host=0.0.0.0&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
novncproxy_host=[CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Synchronize the Nova database (You may get a DEBUG message - You can ignore this). '''Note:''' The db sync needs to be completed on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Due to [https://bugs.launchpad.net/nova/+bug/1158958 bug 1158958], Nova API must be patched to support memcached instead of the in-process cache. First, see if Nova needs to be patched by grep'ing the file that needs to be patched. You will receive no output if the file needs to be patched. You will receive host = str(instance.get('host')) if the file does not need patching: &lt;br /&gt;
&amp;lt;pre&amp;gt;grep &amp;quot;str(instance.get('host'))&amp;quot; /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the extended_availability_zone.py file needs patching, download the patched file: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/dflorea/nova/grizzly/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the patched extended_availability_zone.py to the /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;cp extended_availability_zone.py /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure the file is owned by root:root. &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If&amp;amp;nbsp;extended_availability_zone.py is not owned by root, then change the file ownership: &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod root:root /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart nova-* services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/init.d/; for i in $( ls nova-* ); do sudo service $i restart; done&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Also check that nova-api is running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-api status&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Cinder software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-api cinder-scheduler&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Cinder MySQL database on 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE cinder;&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/api-paste.ini file on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
service_protocol = http&lt;br /&gt;
service_host = 192.168.220.40&lt;br /&gt;
service_port = 5000&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = cinder&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/cinder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf configuration file on each control node. '''Note:''' The default volume_group is being changed from cinder-volumes to nova-volumes. As mentioned in the Critical Reminders section, an LVM Volume Group named nova-volumes must exist on each Compute Node. &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30 &lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Initialize the Cinder database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;cinder-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Cinder services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-api restart&lt;br /&gt;
service cinder-scheduler restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Horizon Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Horizon software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y memcached libapache2-mod-wsgi openstack-dashboard&amp;lt;/pre&amp;gt; &lt;br /&gt;
Next, modify the /etc/openstack-dashboard/local_settings.py file as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;CACHES = {&lt;br /&gt;
    'default': {&lt;br /&gt;
        'BACKEND'&amp;amp;nbsp;: 'django.core.cache.backends.memcached.MemcachedCache',&lt;br /&gt;
        'LOCATION'&amp;amp;nbsp;: '[CONTROLLER_MGT_IP]:11211'&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
OPENSTACK_HOST = &amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
OPENSTACK_KEYSTONE_URL = &amp;quot;http://%s:5000/v2.0&amp;quot;&amp;amp;nbsp;% OPENSTACK_HOST&lt;br /&gt;
OPENSTACK_KEYSTONE_DEFAULT_ROLE = &amp;quot;Member&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the memcached listening address in /etc/memcached.conf. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;-l [CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Reload Apache and memcached on each control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service apache2 restart; service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Access Horizon by using the following URL in your web browser. Use '''admin/keystone_admin''' for your login credentials. &amp;amp;nbsp;If you have problems accessing Horizon by using the VIP (192.168.220.40), then try using a real IP address of a control node (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;http://192.168.220.40/horizon&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, if you would like to remove the Ubuntu theme: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get purge -y openstack-dashboard-ubuntu-theme&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Compute Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Follow these steps for compute01, compute02 and compute03 compute nodes. &lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum software packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install quantum-plugin-openvswitch quantum-plugin-openvswitch-agent quantum-dhcp-agent&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check the status of the Open vSwitch services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch status&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Open vSwitch services on each compute node if they are not running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Nodes require OVS bridges named &amp;quot;br-int&amp;quot; and &amp;quot;br-ex&amp;quot;, and that &amp;quot;br-ex&amp;quot; is associated with the Public Network interface (eth1 in our example): &lt;br /&gt;
&amp;lt;pre&amp;gt;ovs-vsctl add-br br-int&lt;br /&gt;
ovs-vsctl add-br br-ex&lt;br /&gt;
ovs-vsctl add-port br-ex eth1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the Quantum configuration file /etc/quantum/quantum.conf with the following. '''Note:''' Make sure the names in rabbit_hosts= resolve: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini with: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the database section&lt;br /&gt;
[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following under the OVS section. &amp;amp;nbsp; '''Note:''' 223:225 signifies the VLAN ID range used for tenant VLANs. Modify this range based on your deployment needs. These VLANs should be trunked to eth1 of Compute Nodes and you must create a gateway address (i.e. 192.168.223.1 for VLAN 223) on your upstream Layer-3 device. &lt;br /&gt;
&amp;lt;pre&amp;gt;[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1:223:225&lt;br /&gt;
bridge_mappings = physnet1:br-ex&lt;br /&gt;
&lt;br /&gt;
# Using Quantum Security Groups instead of Nova Security Groups&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Update the /etc/quantum/dhcp_agent.ini: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
# Required to run multiple Quantum DHCP agents&lt;br /&gt;
use_component_ext = True&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Quantum services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-plugin-openvswitch-agent restart&lt;br /&gt;
service quantum-dhcp-agent restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova Compute software package on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-compute&amp;lt;/pre&amp;gt; &lt;br /&gt;
The deployment uses config_drive instead of Nova Metadata. Install the genisoimage package used by config_drive: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y genisoimage&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that the authtoken section in the /etc/nova/api-paste.ini file includes the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 127.0.0.1&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name =&amp;amp;nbsp;%SERVICE_TENANT_NAME%&lt;br /&gt;
admin_user =&amp;amp;nbsp;%SERVICE_USER%&lt;br /&gt;
admin_password =&amp;amp;nbsp;%SERVICE_PASSWORD%&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
force_config_drive=true&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
verbose=true&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_host=192.168.220.40&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
vncserver_proxyclient_address=[COMPUTE_MGT_IP]&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
vncserver_listen=[COMPUTE_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Restart the nova-compute service on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-compute restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt; Create a credentials file so you can issue OpenStack client commands from the Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing Cinder software packages on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-volume&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
iscsi_ip_address=[COMPUTE_MGT_IP]&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Cinder services on all compute nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-volume restart&lt;br /&gt;
service tgt restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring OpenStack Networking (Quantum) and Deploying the First VM  ===&lt;br /&gt;
&lt;br /&gt;
Run the following commands from either a Compute Node or Controller Node. If something has to be done on a specific node it will be called out. '''Note:''' If you have an issue with a Quantum command no being found, you may need to do the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y python-pip&lt;br /&gt;
pip install -U cliff&amp;lt;/pre&amp;gt; &lt;br /&gt;
Obtain the tenant ID and create your first tenant network. Create additional networks and associated subnets as needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
quantum net-create public223 --tenant_id &amp;amp;lt;tenant-id&amp;amp;gt; --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 223&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create your first tenant subnet and associate it to the network you created in the previous step. The example below uses .10-.250 for Instance IP addresses. Modify the allocation-pool and dns_nameservers based on your deployment needs. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum subnet-create --name 223-subnet --allocation-pool start=192.168.223.10,end=192.168.223.250 public223 192.168.223.0/24 --dns_nameservers list=true 192.168.26.186&amp;lt;/pre&amp;gt; &lt;br /&gt;
If you skipped the earlier step of downloading an image and uploading it to glance, do that now: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
*'''On a Compute Node''' create an SSH keypair and add the public key to Nova. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Leave the passphrase empty when creating the keypair. You will need to to install the nova client support:&lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install python-novaclient&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;ssh-keygen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;cd ~/.ssh/&lt;br /&gt;
nova keypair-add --pub_key id_rsa.pub &amp;amp;lt;key_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova keypair-add --pub_key id_rsa.pub net-key&amp;lt;/pre&amp;gt; &lt;br /&gt;
Before booting the instance, check for the ID of the network we created earlier. Note: the &amp;amp;lt;quantum_net_id&amp;amp;gt; value will come from the output of the &amp;quot;quantum net-list&amp;quot; command: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum net-list&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name &amp;amp;lt;key_name&amp;amp;gt; --nic net-id=&amp;amp;lt;quantum_net_id&amp;amp;gt; &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name net-key --nic net-id=f9035744-72a9-42cf-bd46-73d54c0cea06 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Watch the status of the instance: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
The instance is booted completely when the OS-EXT-STS:vm_state is &amp;quot;active&amp;quot;. Make note of the IP address of the VM. Alternatively, you can watch the complete log of the VM booting by running: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova console-log --length=25 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the default Quantum Security Group to allow ingress traffic to Instances. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Security Group rules are associated to a specific tenant. The &amp;amp;lt;tenant-id&amp;amp;gt; can be found from the output of keystone tenant-list. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
This example allows all ICMP and SSH traffic: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should now be able to ping the VM as well as SSH into it from the host that you used to create the key you associated with the VM during the boot phase.&lt;/div&gt;</summary>
		<author><name>Shmcfarl</name></author>	</entry>

	<entry>
		<id>http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide</id>
		<title>COE Grizzly Release: High-Availability Manual Installation Guide</title>
		<link rel="alternate" type="text/html" href="http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide"/>
				<updated>2013-04-24T16:46:17Z</updated>
		
		<summary type="html">&lt;p&gt;Shmcfarl: /* Configuring Quantum and Deploying the First VM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
There are two common ways of installing [http://docs.openstack.org/ OpenStack], manually or by using automation tools. There is much focus on the full automation of OpenStack deployments using tools such as [http://puppetlabs.com/ Puppet], [http://www.opscode.com/chef/ Chef], [https://juju.ubuntu.com/ JuJu] and others. While these tools offer great advantages over manual configuration, they do hide the OpenStack installation and configuration details. This document can be used by those interested in learning more about the OpenStack Grizzly High-Availability (HA) installation process or for those not interested in using automation tools to deploy HA. The document covers the following OpenStack software components: &lt;br /&gt;
&lt;br /&gt;
*[http://glance.openstack.org/ Glance] (Image Service) &lt;br /&gt;
*[http://keystone.openstack.org/ Keystone] (Identity Service) &lt;br /&gt;
*[http://nova.openstack.org/ Nova] (Compute Service) &lt;br /&gt;
*[http://horizon.openstack.org/ Horizon] (OpenStack Dashboard Web User Interface) &lt;br /&gt;
*[http://docs.openstack.org/developer/quantum/ Quantum] (Network Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/cinder/ Cinder] (Block Storage Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/swift/ Swift] (Object Storage Service)&lt;br /&gt;
&lt;br /&gt;
== Dependencies  ==&lt;br /&gt;
&lt;br /&gt;
=== Critical Reminders  ===&lt;br /&gt;
&lt;br /&gt;
The most common OpenStack HA deployment issues are either incorrect configuration files or not deploying the nodes in the proper order. To save you from future troubleshooting steps, ENSURE that you deploy the nodes in the order described within the document and verify the accuracy of all configuration files. You will likely be using your own IP addressing and passwords in your setup and it is critical to ensure any variations from this guide are fully understood. &lt;br /&gt;
&lt;br /&gt;
Do not configure RAID on the hard disks of Swift Storage Nodes. Swift performs better without RAID and disk redundancy is unneeded since Swift protects the data through replication. Therefore, if a RAID Controller manages the hard disks, ensure you present each of the hard disks independently. Our example uses disk /dev/sda for the Operating System installation and disks /dev/sdb-/dev/sdf for Swift storage. Please remember to modify these definitions based on your specific deployment environment. Additional Swift considerations and tuning information can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/considerations-and-tuning.html here]. &lt;br /&gt;
&lt;br /&gt;
Compute Nodes run Cinder Volume to provide block storage services to Instances. The default Cinder driver (volume_driver=nova.volume.driver.ISCSIDriver) is an iSCSI solution that employs the use of Linux Logical Volume Manager (LVM). Therefore, you must create an LVM Volume Group either during the Ubuntu Precise installation or [http://docs.openstack.org/trunk/openstack-compute/admin/content/cinder-install.html afterwards]. The name of the LVM Volume Group must match the volume_group definition in cinder.conf. Our example uses the name nova-volumes for the LVM Volume Group and associated cinder.conf volume_group name. &lt;br /&gt;
&lt;br /&gt;
The password used in our examples is keystone_admin. Every account, service and configuration file uses this one password. You will want to change this in your setup and you certainly want to use a strong password and a different password for each account/service if this system is going into production.&lt;br /&gt;
&lt;br /&gt;
=== Operating System  ===&lt;br /&gt;
&lt;br /&gt;
The operating system used for this installation is Ubuntu 12.04 LTS (Precise). &lt;br /&gt;
&lt;br /&gt;
=== Server Requirements  ===&lt;br /&gt;
&lt;br /&gt;
Our deployment uses 13 Cisco UCS C-series servers to serve the roles of Controller, Compute, Load-Balancer and Swift Proxy/Storage. The environment scales linearly, therefore individual nodes can be added to increase capacity for any particular OpenStack service. The five distinct node types used in this document are: &lt;br /&gt;
&lt;br /&gt;
*'''3 Controller Nodes-'''&amp;amp;nbsp;Runs Nova API, Nova Conductor, Nova Consoleauth, Nova Novncproxy, Nova Scheduler, NoVNC, Quantum Server, Quantum Plugin OVS, Glance API/Registry, Keystone, Cinder API, Cinder Scheduler, OpenStack Dashboard, RabbitMQ Server, MySQL Server WSREP and Galera. &lt;br /&gt;
**Provides management functionality of the OpenStack environment.&lt;br /&gt;
&lt;br /&gt;
*'''3 Compute Nodes-'''&amp;amp;nbsp;Runs Nova Compute, Quantum OVS and DHCP Agents, Cinder Volume and TGT services. &lt;br /&gt;
**Provides the hypervisor role for running Nova instances (Virtual Machines) and presents LVM volumes for Cinder block storage.&lt;br /&gt;
&lt;br /&gt;
*'''2 Load-Balancer Nodes-'''&amp;amp;nbsp;Runs HAProxy and Keepalived to load-balance traffic across Controller and Swift Proxy clusters.&lt;br /&gt;
&lt;br /&gt;
*'''2 Swift Proxy Nodes-'''&amp;amp;nbsp;The Proxy Node is responsible for tying together users and their data within the the Swift object storage system. For each request, it will look up the location of the account, container or object in the Swift ring and route the request accordingly. The public API is also exposed by Proxy Node.&lt;br /&gt;
&lt;br /&gt;
*'''3 Swift Storage Nodes-'''&amp;amp;nbsp;Each Storage Nodes contains Swift object, container, and account services. At a very high-level, these are the servers that contain the user data and perform replication among one another to keep the system in a consistent state.&lt;br /&gt;
&lt;br /&gt;
=== Networking Requirements  ===&lt;br /&gt;
&lt;br /&gt;
The OpenStack HA environment uses five separate networks. Three of the five networks are used by Tenants. Three tenant networks are being used as an example, and thus the tenant networks can be increased or decreased based on your deployment needs. Connectivity within Tenants uses Quantum with the Open vSwitch (OVS) plugin and [http://docs.openstack.org/trunk/openstack-network/admin/content/provider_networks.html Provider Network Extensions]. Provider Network Extensions allow cloud administrators to create OpenStack networks that map directly to physical networks in the data center and support local, VLAN and GRE deployment models. Our example uses the Provider VLAN networking model. The network details are as follows: &lt;br /&gt;
&lt;br /&gt;
*'''1 Management Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used to perform management functions against the node. For example, SSH'ing to the nodes to change a configuration setting. The network is also used for lights-out management using the CIMC interface of the UCS servers. Lastly, OpenStack API's and the Horizon web dashboard is associated to this network. &lt;br /&gt;
**An IP address for each node is required for this network. If using lights-out management such as CIMC, each node will require 2 addresses from this network. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]). &lt;br /&gt;
*'''3 Tenant Networks'''&amp;lt;br&amp;gt; &lt;br /&gt;
**These networks are used to provide connectivity to Instances. Since Quantum Provider Networking Extensions are being used, it is common to give tenants direct access to a &amp;quot;public&amp;quot; network that can be used to reach the Internet. &lt;br /&gt;
**Compute Nodes will have an interface attached to this network. Since the Compute Node interfaces that attach to this network are managed by OVS, they should not contain an IP address. &lt;br /&gt;
**This network typically employs publicly routable IP addressing if external NAT'ing is not used upstream towards the Internet edge ('''Note:''' in this document all IP addressing for all interfaces comes out of various private addressing blocks). &lt;br /&gt;
*'''1 Storage Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used for providing separate connectivity between Swift Proxy and Storage Nodes. This ensures storage traffic is not interfering with Instance traffic. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]) IP addressing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''[http://docwiki.cisco.com/w/images/a/a8/Grizzly-ha-network-design-details-v1.0.png Figure 1]''' is used to help visualize the network deployment and to act as a reference for configuration steps within the document. It is highly recommend to print the diagram so it can easily be referenced throughout the installation process.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;u&amp;gt;'''Figure 1:'''&amp;lt;/u&amp;gt;'''OpenStack HA Network Design Details''' &lt;br /&gt;
&lt;br /&gt;
[[Image:Grizzly-ha-network-design-details-v1.0.png|thumb|left]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''Other Network Services'''&amp;lt;br&amp;gt; &lt;br /&gt;
**'''DNS: '''In this setup an external DNS server (192.168.26.186) is used for name resolution of OpenStack nodes and external name resolution. If DNS is not being used, the /etc/hosts file should include the following for all nodes:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 127.0.0.1	localhost&lt;br /&gt;
 192.168.220.40  control.dmz-pod2.lab		control&lt;br /&gt;
 192.168.220.41  control01.dmz-pod2.lab	        control01&lt;br /&gt;
 192.168.220.42  control02.dmz-pod2.lab  	control02&lt;br /&gt;
 192.168.220.43  control03.dmz-pod2.lab  	control03&lt;br /&gt;
 192.168.220.60  swiftproxy.dmz-pod2.lab	        swiftproxy&lt;br /&gt;
 192.168.220.61  swiftproxy01.dmz-pod2.lab	swiftproxy01&lt;br /&gt;
 192.168.220.62  swiftproxy02.dmz-pod2.lab	swiftproxy02&lt;br /&gt;
 192.168.220.51  compute01.dmz-pod2.lab          compute01&lt;br /&gt;
 192.168.220.52  compute02.dmz-pod2.lab          compute02&lt;br /&gt;
 192.168.220.53  compute03.dmz-pod2.lab          compute03&lt;br /&gt;
&lt;br /&gt;
*'''NTP: '''In this setup an external NTP server(s) is used for time synchronization. &lt;br /&gt;
*'''Physical Network Switches:''' Each node in this setup is physically attached to a Cisco Nexus switch acting as a Top-of-Rack access layer device. Trunking is configured on each interface connecting to the eth0 NIC of each node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Upstream routers/aggregation layer switches will most likely be terminating the Layer-3 VLAN interfaces. If these interfaces are deployed in a redundant fashion with a First Hop Redundancy Protocol such as HSRP or VRRP, then you should be careful of the IP addresses assigned to the physical L3 switches/routers as they may conflict with the IP address of the Quantum router's public subnet (.3 by default). For example, if you are using HSRP and you have .1 as the standby IP address, .2 as the first L3 switch IP and .3 as the second L3 switch IP, you will receive a duplicate IP address error on the second L3 switch. This can be worked around by using high-order IPs on your upstream L3 device or altering the Quantum subnet configuration at the time of creation to have an IP starting range higher than the physical switches/routers are using (i.e. .4 and higher). Our example uses an IP allocation range that starts with .10 to avoid this issue.&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
The installation of the nodes should be in the following order: &lt;br /&gt;
&lt;br /&gt;
#'''Load-Balancer Nodes-''' slb01 and slb02 &lt;br /&gt;
#'''Swift Storage Nodes-''' swift01, swift02 and swift03 &lt;br /&gt;
#'''Swift Proxy Nodes-''' swiftproxy01 and swiftproxy02 &lt;br /&gt;
#'''Controller Nodes-''' control01, control02 and control03 &lt;br /&gt;
#'''Compute Nodes- '''compute01, compute02 and compute03&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Nodes  ===&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu Precise 12.04 Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Ubuntu 12.04 (AMD 64-bit) from CD/ISO or automated install (i.e. kickstart). You can reference Section 4 in the [http://docwiki.cisco.com/wiki/OpenStack:Essex_Build_Node#Starting_the_Ubuntu_Installation Build Node Guide] if you are unfamiliar with the Ubuntu Precise installation process. Use the following networking section to configure your network adapter properties for each node. As previously mentioned in the Critical Reminders Section, make sure to create an LVM Volume Group named nova-volumes for Compute Nodes and do not configure RAID for Swift Storage Nodes. Lastly, select ssh-server as the only additional package during the Ubuntu Precise installation. &lt;br /&gt;
&lt;br /&gt;
==== Grizzly Packages  ====&lt;br /&gt;
&lt;br /&gt;
The [https://launchpad.net/~openstack-ubuntu-testing/+archive/grizzly-trunk-testing Ubuntu Testers Team] manages the repository used by this document for OpenStack Grizzly packaging. Although the repository supports Ubuntu Precise and Raring releases, the document is only based on Precise. The Ubuntu Testers PPA should be used for all OpenStack nodes (i.e. not needed for Load-Balancer nodes). &lt;br /&gt;
&lt;br /&gt;
Use sudo mode or run from root account for the entire installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the Ubuntu Grizzly repository: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install python-software-properties -y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;apt-add-repository ppa:openstack-ubuntu-testing/grizzly-trunk-testing&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' Press enter when you are prompted for “[ENTER] or cancel” when adding the PPA. Update your system: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get update&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Networking  ====&lt;br /&gt;
&lt;br /&gt;
Our implementation uses VLANs for segmentation of certain networks. Make sure the VLAN package is installed and your network switches have been configured for VLANs. Otherwise, replicate the network setup using only physical interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install vlan -y&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.81&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.82&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Proxy Node swiftproxy01 /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Proxy Node swiftproxy02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.62&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.62&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.41&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.42&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.43&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.51&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.52&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.53&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart networking: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/networking restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Time Synchronization  ====&lt;br /&gt;
&lt;br /&gt;
Install NTP: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y ntp&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add your NTP server(s) by editing /etc/ntp.conf. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; OpenStack requires that clocks be synchronized. Our example uses a '''FAKE '''server called ntp.corp.com as the NTP server. Make sure you change&amp;amp;nbsp;ntp.corp.com to your real NTP server. Lastly, make sure the NTP server name resolves. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/ntp.conf&lt;br /&gt;
&lt;br /&gt;
server ntp.corp.com&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart NTP for the changes to take effect &lt;br /&gt;
&amp;lt;pre&amp;gt;service ntp restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that you are pulling time: &lt;br /&gt;
&amp;lt;pre&amp;gt;ntpq -p&lt;br /&gt;
&lt;br /&gt;
remote           refid      st t when poll reach   delay   offset  jitter&lt;br /&gt;
==============================================================================&lt;br /&gt;
*ntp.corp.       .GPS.            1 u  185  512  377   76.035    0.053   0.033&lt;br /&gt;
 cheezum.mattnor 129.7.1.66       2 u   8d 1024    0   47.731   -0.555   0.000&lt;br /&gt;
 ntp2.rescomp.be .STEP.          16 u    - 1024    0    0.000    0.000   0.000&lt;br /&gt;
 216.45.57.38    204.123.2.5      2 u  54h 1024    0   12.607    0.808   0.000&lt;br /&gt;
 lithium.constan 128.4.1.1        2 u   8d 1024    0   69.861    0.206   0.000&lt;br /&gt;
 europium.canoni 193.79.237.14    2 u  54h 1024    0  144.040   -1.455   0.000&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load Balancer Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Perform the following steps on nodes slb01 and slb02. &lt;br /&gt;
&lt;br /&gt;
==== Keepalived &amp;amp;amp; HAProxy  ====&lt;br /&gt;
&lt;br /&gt;
Edit /etc/sysctl.conf to allow Keepalived to associate a virtual IP address (VIP) that is not directly bound to an interface on the node:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;net.ipv4.ip_nonlocal_bind=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load in sysctl settings from /etc/sysctl.conf: &lt;br /&gt;
&amp;lt;pre&amp;gt;sysctl -p&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install Keepalived and HAProxy packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keepalived haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the /var/lib/haproxy directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /var/lib/haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure /var/lib/haproxy is owned by root. Change the file ownership if needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /var/lib/haproxy/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the&amp;amp;nbsp;/etc/keepalived/keepalived.conf file for slb01 with the contents below.&amp;amp;nbsp; Change&amp;amp;nbsp;[YOUR_DOMAIN_NAME] with your actual domain name.&amp;amp;nbsp; The keepalived.conf includes the following sections:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global_defs-''' Global parameters affect the whole process behavior.&amp;amp;nbsp;There may be several 'global' sections if needed, but their parameters will only be merged. &amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_script-''' Keepalived supports a VRRP scripting framework to extend base functionality.&amp;amp;nbsp; The vrrp_script named haproxy will check the status of the haproxy service every 2 seconds and add 2 points of priority if the status is running. &amp;amp;nbsp;If the haproxy service is not running, the backup HAProxy Node will become the primary and begin passing traffic for the virtual_ipaddress(es).&amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_instance-''' Is where you define configuration paramters for virtual gateway addresses.&amp;amp;nbsp; slb01 is configured as the primary gateway for 192.168.220.40 (Controller Cluster) and the backup gateway for 192.168.220.60 (Swift Proxy Cluster). Accordingly, slb02 is configured as the primary for 192.168.220.60 and the backup for 192.168.220.40.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb01&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure /etc/keepalived/keepalived.conf for slb02 with the following contents. Change [YOUR_DOMAIN_NAME] with your actual domain name. &lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb02&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb01 with the contents below. HAProxy's configuration process involves 3 major sources of parameters:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*The arguments from the command-line, which always take precedence.&amp;lt;br&amp;gt; &lt;br /&gt;
*The &amp;quot;global&amp;quot; section, which sets process-wide parameters.&amp;lt;br&amp;gt; &lt;br /&gt;
*The proxies sections which can take form of &amp;quot;defaults&amp;quot;, &amp;quot;listen&amp;quot;, &amp;quot;frontend&amp;quot; and &amp;quot;backend&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following provides additional details of the haproxy.cfg file:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global-&amp;amp;nbsp; '''Sets process-wide parameters for load-balancing traffic.&amp;amp;nbsp; Global parameters can be overriden by server-specific configurations within the''listen section ''of the haproxy.cfg file.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''defaults-''' The &amp;quot;defaults&amp;quot; section sets default parameters for all other sections following its declaration. Those default parameters are reset by the next &amp;quot;defaults&amp;quot; section. The name is optional but its use is encouraged for better readability.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''listen-''' A &amp;quot;listen&amp;quot; section defines a complete proxy with its front-end (i.e. listening VIP) and back-end (i.e. real IP of servers)&amp;amp;nbsp;parts combined in one section. Currently two major proxy modes are supported: &amp;quot;tcp&amp;quot;, also known as layer 4 and &amp;quot;http&amp;quot;, also known as layer 7. In layer 4 mode, HAProxy simply forwards bidirectional traffic between two sides. In layer 7 mode, HAProxy analyzes the protocol and can interact with it by allowing, blocking, switching, adding, modifying, or removing arbitrary content in requests or responses based on configurable criteria.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
 chroot  /var/lib/haproxy&lt;br /&gt;
 daemon  &lt;br /&gt;
 group  haproxy&lt;br /&gt;
 log  192.168.220.81 local0&lt;br /&gt;
 maxconn  4000&lt;br /&gt;
 pidfile  /var/run/haproxy.pid&lt;br /&gt;
 user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
 log  global&lt;br /&gt;
 maxconn  8000&lt;br /&gt;
 option  redispatch&lt;br /&gt;
 retries  3&lt;br /&gt;
 timeout  http-request 10s&lt;br /&gt;
 timeout  queue 1m&lt;br /&gt;
 timeout  connect 10s&lt;br /&gt;
 timeout  client 1m&lt;br /&gt;
 timeout  server 1m&lt;br /&gt;
 timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
 bind 192.168.220.40:80&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
 bind 192.168.220.40:3306&lt;br /&gt;
 balance  source&lt;br /&gt;
 mode  tcp&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9292&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
 bind 192.168.220.40:9191&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
 bind 192.168.220.40:35357&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
 bind 192.168.220.40:5000&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
 bind 192.168.220.40:11211&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
 bind 192.168.220.40:8773&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
 bind 192.168.220.40:8774&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
 bind 192.168.220.40:8775&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
 bind 192.168.220.40:8776&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
 bind 192.168.220.40:6080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9696&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
 bind 192.168.220.60:8080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb02 with the contents below. &lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
  chroot  /var/lib/haproxy&lt;br /&gt;
  daemon  &lt;br /&gt;
  group  haproxy&lt;br /&gt;
  log  192.168.220.82 local0&lt;br /&gt;
  maxconn  4000&lt;br /&gt;
  pidfile  /var/run/haproxy.pid&lt;br /&gt;
  user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
  log  global&lt;br /&gt;
  maxconn  8000&lt;br /&gt;
  option  redispatch&lt;br /&gt;
  retries  3&lt;br /&gt;
  timeout  http-request 10s&lt;br /&gt;
  timeout  queue 1m&lt;br /&gt;
  timeout  connect 10s&lt;br /&gt;
  timeout  client 1m&lt;br /&gt;
  timeout  server 1m&lt;br /&gt;
  timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
  bind 192.168.220.40:80&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
  bind 192.168.220.40:3306&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9292&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
  bind 192.168.220.40:9191&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
  bind 192.168.220.40:35357&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
  bind 192.168.220.40:5000&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
  bind 192.168.220.40:11211&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
  bind 192.168.220.40:8773&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
  bind 192.168.220.40:8774&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
  bind 192.168.220.40:8775&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
  bind 192.168.220.40:8776&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
  bind 192.168.220.40:6080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9696&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
  bind 192.168.220.60:8080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set &amp;quot;ENABLED&amp;quot; to &amp;quot;1&amp;quot; in /etc/default/haproxy &lt;br /&gt;
&amp;lt;pre&amp;gt;ENABLED=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keepalived and HAProxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/keepalived restart&lt;br /&gt;
/etc/init.d/haproxy restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Swift Nodes&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Install Swift and other basic packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift openssh-server rsync memcached python-netifaces python-xattr python-memcache &amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir -p /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration file. '''Note:''' This file should be identical on all Swift nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/swift.conf&lt;br /&gt;
&lt;br /&gt;
[swift-hash]&lt;br /&gt;
swift_hash_path_suffix = Gdr8ny7YyWqy2&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the Swift directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Storage Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Run these commands on nodes swift01, swift02 and swift03. Install the Swift Storage Node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-account swift-container swift-object xfsprogs parted&amp;lt;/pre&amp;gt; &lt;br /&gt;
For each of the hard disks other than the Ubuntu installation disk (i.e. /dev/sda), create an XFS volume with a single partition. Our example uses five hard disks (/dev/sdb - /dev/sdf) per Storage Node. Repeat this step for each disk that will be used for Swift storage: &lt;br /&gt;
&amp;lt;pre&amp;gt;parted /dev/sdb mklabel msdos&lt;br /&gt;
parted -a optimal /dev/sdb mkpart primary ext2 0% 100%&lt;br /&gt;
mkfs.xfs -i size=1024 /dev/sdb1&lt;br /&gt;
echo &amp;quot;/dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0&amp;quot; &amp;amp;gt;&amp;amp;gt; /etc/fstab&lt;br /&gt;
mkdir -p /srv/node/sdb1&lt;br /&gt;
mount /srv/node/sdb1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the mount directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /srv/node&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create an Rsync configuration file on each Storage Node. In the following example, replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/rsyncd.conf&lt;br /&gt;
&lt;br /&gt;
uid = swift&lt;br /&gt;
gid = swift&lt;br /&gt;
log file = /var/log/rsyncd.log&lt;br /&gt;
pid file = /var/run/rsyncd.pid&lt;br /&gt;
address = [STORAGE_NET_IP]&lt;br /&gt;
&lt;br /&gt;
[account]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/account.lock&lt;br /&gt;
&lt;br /&gt;
[container]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/container.lock&lt;br /&gt;
&lt;br /&gt;
[object]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/object.lock&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following line in /etc/default/rsync: &lt;br /&gt;
&amp;lt;pre&amp;gt;RSYNC_ENABLE = true&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start rsync daemon: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rsync start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/account-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/account-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = account-server&lt;br /&gt;
&lt;br /&gt;
[app:account-server]&lt;br /&gt;
use = egg:swift#account&lt;br /&gt;
&lt;br /&gt;
[account-replicator]&lt;br /&gt;
&lt;br /&gt;
[account-auditor]&lt;br /&gt;
&lt;br /&gt;
[account-reaper]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/container-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/container-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = container-server&lt;br /&gt;
&lt;br /&gt;
[app:container-server]&lt;br /&gt;
use = egg:swift#container&lt;br /&gt;
&lt;br /&gt;
[container-replicator]&lt;br /&gt;
&lt;br /&gt;
[container-updater]&lt;br /&gt;
&lt;br /&gt;
[container-auditor]&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Create /etc/swift/object-server.conf&amp;amp;nbsp;with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71):&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/object-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = object-server&lt;br /&gt;
&lt;br /&gt;
[app:object-server]&lt;br /&gt;
use = egg:swift#object&lt;br /&gt;
&lt;br /&gt;
[object-replicator]&lt;br /&gt;
&lt;br /&gt;
[object-updater]&lt;br /&gt;
&lt;br /&gt;
[object-auditor]&lt;br /&gt;
&lt;br /&gt;
[object-expirer]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the storage services. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; At this point, the ring files will not be present on the storage nodes. This will cause the *-replicator services to fail to start properly. After you create the ring files on the first proxy node (in the next section) and distribute them to the storage nodes, a service restart should allow all Swift services to start properly. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init object-server start&lt;br /&gt;
swift-init object-replicator start&lt;br /&gt;
swift-init object-updater start&lt;br /&gt;
swift-init object-auditor start&lt;br /&gt;
swift-init container-server start&lt;br /&gt;
swift-init container-replicator start&lt;br /&gt;
swift-init container-updater start&lt;br /&gt;
swift-init container-auditor start&lt;br /&gt;
swift-init account-server start&lt;br /&gt;
swift-init account-replicator start&lt;br /&gt;
swift-init account-auditor start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height: 1.5em;&amp;quot;&amp;gt;Make sure you repeat these steps for every Storage Node.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Proxy Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Ensure you have completed the previous steps in the &amp;quot;General Installation Steps for All Swift Nodes&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
Perform these steps on nodes swiftproxy01 and swiftproxy02. First, install the proxy node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-proxy memcached python-keystoneclient python-swiftclient swift-plugin-s3&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify memcached to bind to the storage network interface (192.168.222.x in our example). Edit the following line in /etc/memcached.conf, changing: &lt;br /&gt;
&amp;lt;pre&amp;gt;-l 127.0.0.1 &lt;br /&gt;
to&lt;br /&gt;
-l [STORAGE_NET_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the memcached server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
If it does not exist, create the /etc/swift/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /etc/swift/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure the directory the /etc/swift and the /var/cache/swift directories are owned by the swift user and group: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown swift:swift /etc/swift/&lt;br /&gt;
chown -R swift:swift /var/cache/swift/&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create /etc/swift/proxy-server.conf with the following contents: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_port = 8080&lt;br /&gt;
workers = 32&lt;br /&gt;
user = swift&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = catch_errors healthcheck cache ratelimit authtoken keystoneauth proxy-server&lt;br /&gt;
&lt;br /&gt;
[app:proxy-server]&lt;br /&gt;
use = egg:swift#proxy&lt;br /&gt;
allow_account_management = true&lt;br /&gt;
account_autocreate = true&lt;br /&gt;
&lt;br /&gt;
[filter:keystoneauth]&lt;br /&gt;
use = egg:swift#keystoneauth&lt;br /&gt;
operator_roles = Member,admin, swiftoperator&lt;br /&gt;
&lt;br /&gt;
[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
signing_dir = /var/cache/swift&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
auth_uri = http://192.168.220.40:5000&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = swift&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
delay_auth_decision = 10&lt;br /&gt;
&lt;br /&gt;
[filter:cache]&lt;br /&gt;
use = egg:swift#memcache&lt;br /&gt;
memcache_servers = 192.168.222.61:11211,192.168.222.62:11211&lt;br /&gt;
&lt;br /&gt;
[filter:catch_errors]&lt;br /&gt;
use = egg:swift#catch_errors&lt;br /&gt;
&lt;br /&gt;
[filter:healthcheck]&lt;br /&gt;
use = egg:swift#healthcheck&lt;br /&gt;
&lt;br /&gt;
[filter:ratelimit]&lt;br /&gt;
use = egg:swift#ratelimit&lt;br /&gt;
clock_accuracy = 1000&lt;br /&gt;
max_sleep_time_seconds = 60&lt;br /&gt;
log_sleep_time_seconds = 0&lt;br /&gt;
rate_buffer_seconds = 5&lt;br /&gt;
account_ratelimit = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, create the account, container and object rings. The builder command is basically creating a builder file with a few parameters. The parameter with the value of 18 represents 2 ^ 18th, this is the value of the partition size. Set this “partition power” value based on the total amount of storage you expect your entire ring to use. The value of 3 represents the number of replicas of each object, with the last value being the number of hours to restrict moving a partition more than once. Additional information regarding Swift ring preperation can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/preparing-the-ring.html here]. &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/swift&lt;br /&gt;
&lt;br /&gt;
swift-ring-builder account.builder create 18 3 1&lt;br /&gt;
swift-ring-builder container.builder create 18 3 1&lt;br /&gt;
swift-ring-builder object.builder create 18 3 1&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, for every storage device on each storage node add entries to each ring. This example prepares the account, container and object rings for storage node swift01 (192.168.222.71) with a partition in zone 1. The mount point of this partition is /srv/node/sdb1 and the path in rsyncd.conf is /srv/node/, the DEVICE would be sdb1 and the commands would look like: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder add z1-192.168.222.71:6002/sdb1 100&lt;br /&gt;
swift-ring-builder container.builder add z1-192.168.222.71:6001/sdb1 100&lt;br /&gt;
swift-ring-builder object.builder add z1-192.168.222.71:6000/sdb1 100&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Make sure not to place all devices in the same zone (i.e. z1). It is recommended to configure the zones as high-level as possible to create the greatest amount of isolation. Some considerations can include physical location, power availability, and network connectivity. For example, in a small cluster you might decide to split the zones up by cabinet, with each cabinet having its own power and network connectivity. Since our deployment only uses 3 storage nodes, each node should be in its own zone. However, it is recommended to have a minimum of 5 zones in a production-level Swift deployment. &lt;br /&gt;
&lt;br /&gt;
Verify the ring contents for each ring: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
swift-ring-builder /etc/swift/container.builder&lt;br /&gt;
swift-ring-builder /etc/swift/object.builder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Your output should look similar to this: &lt;br /&gt;
&amp;lt;pre&amp;gt;root@swiftproxy01:~# swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
/etc/swift/account.builder, build version 15&lt;br /&gt;
262144 partitions, 3 replicas, 3 zones, 15 devices, 0.00 balance&lt;br /&gt;
The minimum number of hours before a partition can be reassigned is 1&lt;br /&gt;
Devices:    id  zone      ip address  port      name weight partitions balance meta&lt;br /&gt;
             0     3  192.168.222.73  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
             1     2  192.168.222.72  6002      sdd1   1.00      52429    0.00 &lt;br /&gt;
             2     3  192.168.222.73  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             3     2  192.168.222.72  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             4     3  192.168.222.73  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             5     1  192.168.222.71  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             6     1  192.168.222.71  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             7     2  192.168.222.72  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
             8     1  192.168.222.71  6002      sdd1   1.00      52428   -0.00 &lt;br /&gt;
             9     2  192.168.222.72  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
            10     1  192.168.222.71  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
            11     1  192.168.222.71  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            12     3  192.168.222.73  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            13     2  192.168.222.72  6002      sde1   1.00      52428   -0.00 &lt;br /&gt;
            14     3  192.168.222.73  6002      sdd1   1.00      52428   -0.00&amp;lt;/pre&amp;gt; &lt;br /&gt;
Repeat the command, but replace account with object and container to verify the contents of the others two Swift rings. &lt;br /&gt;
&lt;br /&gt;
Rebalance the rings. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Rebalancing rings can take a while. You may get a message about a balance value and that you need to rebalance/push after the minimum 1 hour. If so, recheck the status after an hour. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder rebalance&lt;br /&gt;
swift-ring-builder container.builder rebalance&lt;br /&gt;
swift-ring-builder object.builder rebalance&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the account.ring.gz, container.ring.gz, and object.ring.gz files to swiftproxy02 and the 3 storage nodes in /etc/swift. &lt;br /&gt;
&lt;br /&gt;
Make sure all the config files are owned by the swift user: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Proxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init proxy start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verify the Swift Installation  ===&lt;br /&gt;
&lt;br /&gt;
You can run verification commands from the proxy server or any server with access to Keystone. Keep in mind that proxy nodes are configured to use Keystone for user authentication. As a result, you '''MUST''' complete the Controller Node Installation steps and ensure Keystone is operational before proceeding with Swift verification. &lt;br /&gt;
&lt;br /&gt;
Verify that you can successfully authenticate against Keystone using the Swift authentication credentials: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y curl&lt;br /&gt;
&lt;br /&gt;
curl -s -d &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should receive output similar to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;access&amp;quot;: {&amp;quot;token&amp;quot;: {&amp;quot;issued_at&amp;quot;: &amp;quot;2013-04-02T14:55:31.149327&amp;quot;, &amp;quot;expires&amp;quot;: &amp;quot;2013-04-03T14:55:31Z&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;bb29ef5439ce4a75bf85332bbadf6538&amp;quot;, &amp;quot;tenant&amp;quot;: {&amp;quot;description&amp;quot;: &lt;br /&gt;
null, &amp;quot;enabled&amp;quot;: true, &amp;quot;id&amp;quot;: &amp;quot;b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;services&amp;quot;}}, &amp;quot;serviceCatalog&amp;quot;: [{&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;45a336cb74e04e11ab95c0ea28b699d6&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;compute&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;nova&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;259fef5e66814f47ac1934d3cf522a3d&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;network&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;quantum&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [&lt;br /&gt;
{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;166de3790eb54c31a58237fe9ea3d301&amp;quot;, &lt;br /&gt;
&amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;image&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;glance&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;0a2c69157d5948a9ae8ecee5c65a6d2b&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;volume&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;cinder&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Admin&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &lt;br /&gt;
&amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;05f85b8aacbd4c87b680dcc2fb6da539&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;}], &lt;br /&gt;
&amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;ec2&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;ec2&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.60:8080/v1&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;4a1af526137341c0a682eb573101ddde&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;object-store&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;3e3f7b50b5bd44b7a15b3e4ae55086bf&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;identity&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;keystone&amp;quot;}], &amp;quot;user&amp;quot;: {&amp;quot;username&amp;quot;: &amp;quot;swift&amp;quot;, &amp;quot;roles_links&amp;quot;: [], &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;ed69664ac78a4b65a36d63da6b760863&amp;quot;, &amp;quot;roles&amp;quot;: [{&amp;quot;name&amp;quot;: &amp;quot;_member_&amp;quot;}, {&amp;quot;name&amp;quot;: &amp;quot;admin&amp;quot;}], &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, &amp;quot;metadata&amp;quot;: {&amp;quot;is_admin&amp;quot;: 0, &amp;quot;roles&amp;quot;: [&lt;br /&gt;
&amp;quot;9fe2ff9ee4384b1894a90878d3e92bab&amp;quot;, &amp;quot;6a553ae3be3c4f8c8fe079830d4102a5&amp;quot;]}}}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Use the swift client stat command to make sure you can view the contents of the ring.&amp;amp;nbsp;You can run these commands from the proxy server or any server with the swift client and access to Keystone. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U admin:admin -K keystone_admin stat&lt;br /&gt;
   Account: AUTH_3eccdb2a9331419c96ac9ff336110b65&lt;br /&gt;
Containers: 1&lt;br /&gt;
   Objects: 2&lt;br /&gt;
     Bytes: 0&lt;br /&gt;
Accept-Ranges: bytes&lt;br /&gt;
X-Timestamp: 1363989109.30329&lt;br /&gt;
X-Trans-Id: tx147dd9983ac54af1b71c5a561ae2aa9a&lt;br /&gt;
Content-Type: text/plain; charset=utf-8&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can see that 1 container exists. &amp;amp;nbsp;Now, lets find out the name of the container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list&lt;br /&gt;
glance&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The glance container is created after the Controller cluster is built and an image has been uploaded to Glance. &lt;br /&gt;
&lt;br /&gt;
List the contents of the Glance container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list glance&lt;br /&gt;
24164630-ba2f-436a-8bc6-43975717d5e5&lt;br /&gt;
858a11dc-ed61-4a18-a778-eabcb454ae45&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Controller Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Runs these commands on nodes control01, control02 and control03. &amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install MySQL and Galera dependencies: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y libaio1 libssl0.9.8 mysql-client-5.5 python-mysqldb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download MySQL-WSREP and Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget -O /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb http://launchpad.net/codership-mysql/5.5/5.5.23-23.6/+download/mysql-server-wsrep-5.5.23-23.6-amd64.deb --no-check-certificate&lt;br /&gt;
wget -O /tmp/galera-23.2.1-amd64.deb http://launchpad.net/galera/2.x/23.2.1/+download/galera-23.2.1-amd64.deb --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install MySQL and Galera. '''Note:''' If you are prompted to create a root password during the Galera package installation, please make note of the password you use as it will be needed when connecting to MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;dpkg -i /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb&lt;br /&gt;
dpkg -i /tmp/galera-23.2.1-amd64.deb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the MySQL bind address: &lt;br /&gt;
&amp;lt;pre&amp;gt;sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the following line to /etc/rc.local on all controllers to allow MySQL to start automatically upon reboot: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.41&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.42&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.43&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt;It is important to understand the [http://www.codership.com/wiki/doku.php?id=mysql_options_0.8 gcomm address] concept behind [http://www.codership.com/ Galera]. Only use an empty gcomm:// address when you create a NEW cluster. Never use it when your intention is to reconnect to an existing one. After the Galera cluster is established, you should change the gcomm address on control01 from gcomm:// to gcomm://192.168.220.42 or gcomm://192.168.220.43. Otherwise, control01 will not join the cluster upon reboot. Make sure to also restart the mysql service when making changes to any of the associated configuration files. &lt;br /&gt;
&lt;br /&gt;
Restart MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the Galera cluster has been established. The value should show 4 for all nodes in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | Variable_name      | Value |&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | wsrep_local_state  |    4  |&lt;br /&gt;
  +------------------------+---+&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Monitoring  ====&lt;br /&gt;
Complete each of the steps below on each control node except for when a single node is specified.&lt;br /&gt;
&lt;br /&gt;
Install xinetd: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y xinetd&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the mysqlchk service: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/mysqlchk -P /etc/xinetd.d/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' After functional testing is complete, it's recommended to secure the mysqlchk service. This can be accomplished by editing the only_from and per_source values in /etc/xinetd.d/ to the subnet used by the load-balancer nodes. &lt;br /&gt;
&lt;br /&gt;
Edit /etc/xinetd.d/mysqlchk by changing &amp;amp;lt;%= mysqlchk_script_dir&amp;amp;nbsp;%&amp;amp;gt;/galera_chk to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure root is the file owner: &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
If not, change the file permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the mysqlcheck service to /etc/services by adding the following line: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysqlchk        9200/tcp                        # MySQL Galera health check script&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the MySQL Galera health check script: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/galera_chk -P /usr/local/bin/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the file ownership and permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /usr/local/bin/galera_chk &lt;br /&gt;
chmod +x  /usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /usr/local/bin/galera_chk as follows. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41). &lt;br /&gt;
&amp;lt;pre&amp;gt;MYSQL_HOST=&amp;quot;[CONTROLLER_MGT_IP]&amp;quot;&lt;br /&gt;
MYSQL_PORT=&amp;quot;3306&amp;quot;&lt;br /&gt;
MYSQL_USERNAME=&amp;quot;mysqlchk_user&amp;quot;&lt;br /&gt;
MYSQL_PASSWORD=&amp;quot;mysqlchk_password&amp;quot;&lt;br /&gt;
MYSQL_OPTS=&amp;quot;-N -q -A&amp;quot;&lt;br /&gt;
TMP_FILE=&amp;quot;/dev/shm/mysqlchk.$$.out&amp;quot;&lt;br /&gt;
ERR_FILE=&amp;quot;/dev/shm/mysqlchk.$$.err&amp;quot;&lt;br /&gt;
FORCE_FAIL=&amp;quot;/dev/shm/proxyoff&amp;quot;&lt;br /&gt;
MYSQL_BIN=&amp;quot;/usr/bin/mysql&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart xinetsd: &lt;br /&gt;
&amp;lt;pre&amp;gt;service xinetd restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Connect to MySQL and add the mysqlchk user to each controller in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
use mysql;&lt;br /&gt;
INSERT INTO user (Host,User,Password) VALUES('%','mysqlchk_user',PASSWORD('mysqlchk_password'));&lt;br /&gt;
flush privileges;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Grant privileges for the mysqlchk user. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41).: &lt;br /&gt;
&amp;lt;pre&amp;gt;grant SUPER,PROCESS on *.* to 'mysqlchk_user'@'[CONTROLLER_MGT_IP]' IDENTIFIED BY 'mysqlchk_password';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the operational status of the MySQL Galera health check service. From slb01 or slb02, Telnet using port 9200 (health check port) and make sure you get a &amp;quot;MySQL is running&amp;quot; message: &lt;br /&gt;
&amp;lt;pre&amp;gt;telnet 192.168.220.41 9200&lt;br /&gt;
Trying 192.168.220.41...&lt;br /&gt;
Connected to 192.168.220.41.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Content-Type: text/html&lt;br /&gt;
Content-Length: 43&lt;br /&gt;
&amp;amp;lt;html&amp;amp;gt;&amp;amp;lt;body&amp;amp;gt;MySQL is running.&amp;amp;lt;/body&amp;amp;gt;&amp;amp;lt;/html&amp;amp;gt;&lt;br /&gt;
Connection closed by foreign host.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Repeat the previous step for each control node. &lt;br /&gt;
&lt;br /&gt;
Verify that you can access the MySQL database by using the Virtual IP address (VIP) of the Galera cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -umysqlchk_user -pmysqlchk_password -h192.168.220.40&amp;lt;/pre&amp;gt; &lt;br /&gt;
For informational purposes, this is the command used by the health check script. This example is for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql -N -q -A --host=192.168.220.41 --user=mysqlchk_user --password=mysqlchk_password -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RabbitMQ Installation  ====&lt;br /&gt;
Complete each of the following steps on each control node unless a specific node is called out.&lt;br /&gt;
&lt;br /&gt;
Install RabbitMQ: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y rabbitmq-server&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure RabbitMQ Clustering. First, stop the service and remove the mnesia database on all control nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server stop&lt;br /&gt;
rm -rf /var/lib/rabbitmq/mnesia&amp;lt;/pre&amp;gt; &lt;br /&gt;
Clustering requires that the nodes have the same Erlang cookie. Copy the Erlang cookie from control01 to control02 and control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.42:/var/lib/rabbitmq/.erlang.cookie&lt;br /&gt;
scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.43:/var/lib/rabbitmq/.erlang.cookie&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The above command requires root login (disabled by default in Ubuntu). If you do not have root permissions, copy the Erlang cookie from /var/lib/rabbitmq/ to the /tmp directory of control02 and control03 and then to /var/lib/rabbitmq/. Also, make sure the file permissions match on all 3 nodes. &lt;br /&gt;
&lt;br /&gt;
Now that all 3 control nodes have the same Erlang cookie, make sure that RabbitMQ will start: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server start&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' If RabbitMQ does not successfully start, do not proceed with clustering.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Clustering can be configured using rabbitmqctl commands or by modifying the RabbitMQ configuration file. Our example uses the rabbitmqctl commands since issues were experienced using the configuration file with RabbitMQ 2.7.1. You can see both approaches to configuring RabbitMQ clustering [http://www.rabbitmq.com/clustering.html#setup here]. &lt;br /&gt;
&lt;br /&gt;
In order to cluster the three control nodes, two of the nodes (i.e. rabbit@control2 and rabbit@control03) will be configured to join the cluster of the third node (rabbit@control01). '''Note:''' Joining a cluster implicitly resets the node, thus removing all resources and data that were previously present on that node. &lt;br /&gt;
&lt;br /&gt;
From control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control02 is now clustered with control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control02 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
From control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control03 is now clustered with control01 and control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control03 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02,rabbit@control03]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02,rabbit@control03]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Now that clustering is complete, secure RabbitMQ by removing the default (guest) user: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl delete_user guest&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a RabbitMQ user account that will be used by OpenStack services: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl add_user openstack_rabbit_user openstack_rabbit_password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the permissions for the new RabbitMQ user account: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl set_permissions -p / openstack_rabbit_user &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the user settings: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl list_users&lt;br /&gt;
rabbitmqctl list_user_permissions openstack_rabbit_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keystone Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Keystone on every control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keystone python-keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Remove the sqllite db: &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/keystone/keystone.db&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Keystone. The database needs to be created on only 1 control node. &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE keystone;&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'%' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'localhost' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' From other controllers in the cluster, you can see that databases are replicated by Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show databases;&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/keystone/keystone.conf file on each controller. Change [CONTROLLER_MGT_IP] to the management IP address of the control node (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
admin_token = keystone_admin_token&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
&lt;br /&gt;
[sql]&lt;br /&gt;
connection = mysql://keystone_admin:keystone_db_pass@192.168.220.40/keystone&lt;br /&gt;
&lt;br /&gt;
[ssl]&lt;br /&gt;
enable = False&lt;br /&gt;
&lt;br /&gt;
[signing]&lt;br /&gt;
token_format = UUID&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a credential file and load it so credentials are not required for every OpenStack client command. '''Note:''' This needs to be created on each node that you will run OpenStack commands from: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that MySQL is listening on the VIP for the Keystone database. If you have any problems connecting to the VIP, try the real IP address of a control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -h192.168.220.40 -ukeystone_admin -pkeystone_db_pass keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keystone: &lt;br /&gt;
&amp;lt;pre&amp;gt;service keystone restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh Keystone data script](Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;ADMIN_PASSWORD=${ADMIN_PASSWORD:-keystone_admin}&lt;br /&gt;
export SERVICE_TOKEN=&amp;quot;keystone_admin_token&amp;quot;&lt;br /&gt;
export SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0/&amp;quot;&lt;br /&gt;
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-services}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with data (users, tenants, services). '''Note:''' If you see a long timeout and errors about &amp;quot;connection timeout&amp;quot;, it may be related to your proxy setting. Remove the export of your http/https proxies and re-run the script. You will have to re-add your proxies for any other external downloads. &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://github.com/EmilienM/openstack-folsom-guide/blob/master/scripts/keystone-endpoints.sh Keystone endpoint script] (Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;# MySQL definitions&lt;br /&gt;
MYSQL_USER=keystone_admin&lt;br /&gt;
MYSQL_DATABASE=keystone&lt;br /&gt;
MYSQL_HOST=192.168.220.40&lt;br /&gt;
MYSQL_PASSWORD=keystone_db_pass&lt;br /&gt;
&lt;br /&gt;
# Keystone definitions&lt;br /&gt;
KEYSTONE_REGION=RegionOne&lt;br /&gt;
SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# other definitions&lt;br /&gt;
MASTER=&amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
SWIFT_MASTER=&amp;quot;192.168.220.60&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with service endpoints. Again, if you are using proxies then you will need remove them from your export before running this command: &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Test connectivity to Keystone by using a curl request&amp;amp;nbsp;: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install curl openssl -y&lt;br /&gt;
&lt;br /&gt;
curl -d '{&amp;quot;auth&amp;quot;: {&amp;quot;tenantName&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;passwordCredentials&amp;quot;:{&amp;quot;username&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;password&amp;quot;: &amp;quot;keystone_admin&amp;quot;}}}' -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens | python -mjson.tool&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the above command is successful, you will receive output that includes a token and a list of service endpoints.&amp;amp;nbsp;You may also want to verify the other service account credentials: &lt;br /&gt;
&lt;br /&gt;
'''Glance''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;glance\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Nova''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;nova\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Swift''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Quantum''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;quantum\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Cinder''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;cinder\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can also use the Keystone client to verify the configuration: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
keystone user-list&lt;br /&gt;
keystone role-list&lt;br /&gt;
keystone service-list&lt;br /&gt;
keystone endpoint-list&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Glance Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Glance API and Registry packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y glance-api glance-registry&amp;lt;/pre&amp;gt; &lt;br /&gt;
Delete the glance.sqlite file created in the /var/lib/glance/ directory &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/glance/glance.sqlite&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Glance on only 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE glance;&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-api.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41). Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
default_store = swift&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
registry_host = 192.168.220.40&lt;br /&gt;
swift_store_auth_address = http://192.168.220.40:5000/v2.0/&lt;br /&gt;
swift_store_user = services:swift&lt;br /&gt;
swift_store_key = keystone_admin&lt;br /&gt;
swift_store_container = glance&lt;br /&gt;
swift_store_create_container_on_put = True&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone+cachemanagement&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-registry.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41) Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the glance-api and glance-registry services: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-api restart; service glance-registry restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
The database tables are under version control and you use the following command on a new installation to prevent the Image service from breaking possible upgrades. This command is used on only one of the controllers: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage version_control 0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the glance database on one control node (You may get a message about deprecation - you can ignore): &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the services again to take into account the new modifications: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-registry restart; service glance-api restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the Cirros 0.3.1 cloud image to a controller node and then upload it to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-disk.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;cirros&amp;quot; is_public=true disk_format=qcow2 container_format=ovf &amp;amp;lt; cirros-0.3.1-x86_64-disk.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that Glance is serving the image: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance image-list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, you can add the Ubuntu Precise image to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
 &lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum Server on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y quantum-server quantum-plugin-openvswitch&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Quantum database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE quantum; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'%' IDENTIFIED BY 'quantum_pass'; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'localhost' IDENTIFIED BY 'quantum_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/quantum/quantum.conf file on all control nodes. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = quantum&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/quantum/keystone-signing&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1&lt;br /&gt;
bridge_mappings = physnet1:br-ex &lt;br /&gt;
&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the quantum server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-server restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova software packages on all Control Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-api nova-conductor nova-consoleauth nova-scheduler nova-novncproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Nova database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE nova;&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the authtoken section in the /etc/nova/api-paste.ini file on each control node to include the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = nova&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [CONTROLLER_MGT_IP] with the controller node's management IP address (i.e. control01 = 192.168.220.41). Do this on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
dhcpbridge_flagfile=/etc/nova/nova.conf&lt;br /&gt;
dhcpbridge=/usr/bin/nova-dhcpbridge&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
verbose=true&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
image_service=nova.image.glance.GlanceImageService&lt;br /&gt;
rpc_backend=nova.rpc.impl_kombu&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
service_down_time=60&lt;br /&gt;
rabbit_port=5672&lt;br /&gt;
rabbit_virtual_host=/&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
ec2_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
enabled_apis=ec2,osapi_compute&lt;br /&gt;
osapi_compute_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
novncproxy_port=6080&lt;br /&gt;
novncproxy_host=0.0.0.0&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
novncproxy_host=[CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Synchronize the Nova database (You may get a DEBUG message - You can ignore this). '''Note:''' The db sync needs to be completed on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Due to [https://bugs.launchpad.net/nova/+bug/1158958 bug 1158958], Nova API must be patched to support memcached instead of the in-process cache. First, see if Nova needs to be patched by grep'ing the file that needs to be patched. You will receive no output if the file needs to be patched. You will receive host = str(instance.get('host')) if the file does not need patching: &lt;br /&gt;
&amp;lt;pre&amp;gt;grep &amp;quot;str(instance.get('host'))&amp;quot; /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the extended_availability_zone.py file needs patching, download the patched file: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/dflorea/nova/grizzly/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the patched extended_availability_zone.py to the /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;cp extended_availability_zone.py /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure the file is owned by root:root. &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If&amp;amp;nbsp;extended_availability_zone.py is not owned by root, then change the file ownership: &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod root:root /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart nova-* services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/init.d/; for i in $( ls nova-* ); do sudo service $i restart; done&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Also check that nova-api is running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-api status&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Cinder software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-api cinder-scheduler&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Cinder MySQL database on 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE cinder;&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/api-paste.ini file on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
service_protocol = http&lt;br /&gt;
service_host = 192.168.220.40&lt;br /&gt;
service_port = 5000&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = cinder&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/cinder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf configuration file on each control node. '''Note:''' The default volume_group is being changed from cinder-volumes to nova-volumes. As mentioned in the Critical Reminders section, an LVM Volume Group named nova-volumes must exist on each Compute Node. &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30 &lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Initialize the Cinder database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;cinder-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Cinder services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-api restart&lt;br /&gt;
service cinder-scheduler restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Horizon Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Horizon software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y memcached libapache2-mod-wsgi openstack-dashboard&amp;lt;/pre&amp;gt; &lt;br /&gt;
Next, modify the /etc/openstack-dashboard/local_settings.py file as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;CACHES = {&lt;br /&gt;
    'default': {&lt;br /&gt;
        'BACKEND'&amp;amp;nbsp;: 'django.core.cache.backends.memcached.MemcachedCache',&lt;br /&gt;
        'LOCATION'&amp;amp;nbsp;: '[CONTROLLER_MGT_IP]:11211'&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
OPENSTACK_HOST = &amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
OPENSTACK_KEYSTONE_URL = &amp;quot;http://%s:5000/v2.0&amp;quot;&amp;amp;nbsp;% OPENSTACK_HOST&lt;br /&gt;
OPENSTACK_KEYSTONE_DEFAULT_ROLE = &amp;quot;Member&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the memcached listening address in /etc/memcached.conf. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;-l [CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Reload Apache and memcached on each control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service apache2 restart; service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Access Horizon by using the following URL in your web browser. Use '''admin/keystone_admin''' for your login credentials. &amp;amp;nbsp;If you have problems accessing Horizon by using the VIP (192.168.220.40), then try using a real IP address of a control node (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;http://192.168.220.40/horizon&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, if you would like to remove the Ubuntu theme: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get purge -y openstack-dashboard-ubuntu-theme&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Compute Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Follow these steps for compute01, compute02 and compute03 compute nodes. &lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum software packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install quantum-plugin-openvswitch quantum-plugin-openvswitch-agent quantum-dhcp-agent&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check the status of the Open vSwitch services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch status&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Open vSwitch services on each compute node if they are not running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Nodes require OVS bridges named &amp;quot;br-int&amp;quot; and &amp;quot;br-ex&amp;quot;, and that &amp;quot;br-ex&amp;quot; is associated with the Public Network interface (eth1 in our example): &lt;br /&gt;
&amp;lt;pre&amp;gt;ovs-vsctl add-br br-int&lt;br /&gt;
ovs-vsctl add-br br-ex&lt;br /&gt;
ovs-vsctl add-port br-ex eth1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the Quantum configuration file /etc/quantum/quantum.conf with the following. '''Note:''' Make sure the names in rabbit_hosts= resolve: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini with: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the database section&lt;br /&gt;
[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following under the OVS section. &amp;amp;nbsp; '''Note:''' 223:225 signifies the VLAN ID range used for tenant VLANs. Modify this range based on your deployment needs. These VLANs should be trunked to eth1 of Compute Nodes and you must create a gateway address (i.e. 192.168.223.1 for VLAN 223) on your upstream Layer-3 device. &lt;br /&gt;
&amp;lt;pre&amp;gt;[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1:223:225&lt;br /&gt;
bridge_mappings = physnet1:br-ex&lt;br /&gt;
&lt;br /&gt;
# Using Quantum Security Groups instead of Nova Security Groups&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Update the /etc/quantum/dhcp_agent.ini: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
# Required to run multiple Quantum DHCP agents&lt;br /&gt;
use_component_ext = True&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Quantum services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-plugin-openvswitch-agent restart&lt;br /&gt;
service quantum-dhcp-agent restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova Compute software package on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-compute&amp;lt;/pre&amp;gt; &lt;br /&gt;
The deployment uses config_drive instead of Nova Metadata. Install the genisoimage package used by config_drive: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y genisoimage&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that the authtoken section in the /etc/nova/api-paste.ini file includes the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 127.0.0.1&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name =&amp;amp;nbsp;%SERVICE_TENANT_NAME%&lt;br /&gt;
admin_user =&amp;amp;nbsp;%SERVICE_USER%&lt;br /&gt;
admin_password =&amp;amp;nbsp;%SERVICE_PASSWORD%&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
force_config_drive=true&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
verbose=true&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_host=192.168.220.40&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
vncserver_proxyclient_address=[COMPUTE_MGT_IP]&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
vncserver_listen=[COMPUTE_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Restart the nova-compute service on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-compute restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt; Create a credentials file so you can issue OpenStack client commands from the Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing Cinder software packages on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-volume&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
iscsi_ip_address=[COMPUTE_MGT_IP]&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Cinder services on all compute nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-volume restart&lt;br /&gt;
service tgt restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring Quantum and Deploying the First VM  ===&lt;br /&gt;
&lt;br /&gt;
Run the following commands from either a Compute Node or Controller Node. If something has to be done on a specific node it will be called out. '''Note:''' If you have an issue with a Quantum command no being found, you may need to do the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y python-pip&lt;br /&gt;
pip install -U cliff&amp;lt;/pre&amp;gt; &lt;br /&gt;
Obtain the tenant ID and create your first tenant network. Create additional networks and associated subnets as needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
quantum net-create public223 --tenant_id &amp;amp;lt;tenant-id&amp;amp;gt; --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 223&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create your first tenant subnet and associate it to the network you created in the previous step. The example below uses .10-.250 for Instance IP addresses. Modify the allocation-pool and dns_nameservers based on your deployment needs. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum subnet-create --name 223-subnet --allocation-pool start=192.168.223.10,end=192.168.223.250 public223 192.168.223.0/24 --dns_nameservers list=true 192.168.26.186&amp;lt;/pre&amp;gt; &lt;br /&gt;
If you skipped the earlier step of downloading an image and uploading it to glance, do that now: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
*'''On a Compute Node''' create an SSH keypair and add the public key to Nova. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Leave the passphrase empty when creating the keypair. You will need to to install the nova client support:&lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install python-novaclient&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;ssh-keygen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;cd ~/.ssh/&lt;br /&gt;
nova keypair-add --pub_key id_rsa.pub &amp;amp;lt;key_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova keypair-add --pub_key id_rsa.pub net-key&amp;lt;/pre&amp;gt; &lt;br /&gt;
Before booting the instance, check for the ID of the network we created earlier. Note: the &amp;amp;lt;quantum_net_id&amp;amp;gt; value will come from the output of the &amp;quot;quantum net-list&amp;quot; command: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum net-list&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name &amp;amp;lt;key_name&amp;amp;gt; --nic net-id=&amp;amp;lt;quantum_net_id&amp;amp;gt; &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name net-key --nic net-id=f9035744-72a9-42cf-bd46-73d54c0cea06 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Watch the status of the instance: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
The instance is booted completely when the OS-EXT-STS:vm_state is &amp;quot;active&amp;quot;. Make note of the IP address of the VM. Alternatively, you can watch the complete log of the VM booting by running: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova console-log --length=25 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the default Quantum Security Group to allow ingress traffic to Instances. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Security Group rules are associated to a specific tenant. The &amp;amp;lt;tenant-id&amp;amp;gt; can be found from the output of keystone tenant-list. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
This example allows all ICMP and SSH traffic: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should now be able to ping the VM as well as SSH into it from the host that you used to create the key you associated with the VM during the boot phase.&lt;/div&gt;</summary>
		<author><name>Shmcfarl</name></author>	</entry>

	<entry>
		<id>http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide</id>
		<title>COE Grizzly Release: High-Availability Manual Installation Guide</title>
		<link rel="alternate" type="text/html" href="http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide"/>
				<updated>2013-04-24T16:45:07Z</updated>
		
		<summary type="html">&lt;p&gt;Shmcfarl: /* Configuring Quantum and Deploying the First VM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
There are two common ways of installing [http://docs.openstack.org/ OpenStack], manually or by using automation tools. There is much focus on the full automation of OpenStack deployments using tools such as [http://puppetlabs.com/ Puppet], [http://www.opscode.com/chef/ Chef], [https://juju.ubuntu.com/ JuJu] and others. While these tools offer great advantages over manual configuration, they do hide the OpenStack installation and configuration details. This document can be used by those interested in learning more about the OpenStack Grizzly High-Availability (HA) installation process or for those not interested in using automation tools to deploy HA. The document covers the following OpenStack software components: &lt;br /&gt;
&lt;br /&gt;
*[http://glance.openstack.org/ Glance] (Image Service) &lt;br /&gt;
*[http://keystone.openstack.org/ Keystone] (Identity Service) &lt;br /&gt;
*[http://nova.openstack.org/ Nova] (Compute Service) &lt;br /&gt;
*[http://horizon.openstack.org/ Horizon] (OpenStack Dashboard Web User Interface) &lt;br /&gt;
*[http://docs.openstack.org/developer/quantum/ Quantum] (Network Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/cinder/ Cinder] (Block Storage Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/swift/ Swift] (Object Storage Service)&lt;br /&gt;
&lt;br /&gt;
== Dependencies  ==&lt;br /&gt;
&lt;br /&gt;
=== Critical Reminders  ===&lt;br /&gt;
&lt;br /&gt;
The most common OpenStack HA deployment issues are either incorrect configuration files or not deploying the nodes in the proper order. To save you from future troubleshooting steps, ENSURE that you deploy the nodes in the order described within the document and verify the accuracy of all configuration files. You will likely be using your own IP addressing and passwords in your setup and it is critical to ensure any variations from this guide are fully understood. &lt;br /&gt;
&lt;br /&gt;
Do not configure RAID on the hard disks of Swift Storage Nodes. Swift performs better without RAID and disk redundancy is unneeded since Swift protects the data through replication. Therefore, if a RAID Controller manages the hard disks, ensure you present each of the hard disks independently. Our example uses disk /dev/sda for the Operating System installation and disks /dev/sdb-/dev/sdf for Swift storage. Please remember to modify these definitions based on your specific deployment environment. Additional Swift considerations and tuning information can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/considerations-and-tuning.html here]. &lt;br /&gt;
&lt;br /&gt;
Compute Nodes run Cinder Volume to provide block storage services to Instances. The default Cinder driver (volume_driver=nova.volume.driver.ISCSIDriver) is an iSCSI solution that employs the use of Linux Logical Volume Manager (LVM). Therefore, you must create an LVM Volume Group either during the Ubuntu Precise installation or [http://docs.openstack.org/trunk/openstack-compute/admin/content/cinder-install.html afterwards]. The name of the LVM Volume Group must match the volume_group definition in cinder.conf. Our example uses the name nova-volumes for the LVM Volume Group and associated cinder.conf volume_group name. &lt;br /&gt;
&lt;br /&gt;
The password used in our examples is keystone_admin. Every account, service and configuration file uses this one password. You will want to change this in your setup and you certainly want to use a strong password and a different password for each account/service if this system is going into production.&lt;br /&gt;
&lt;br /&gt;
=== Operating System  ===&lt;br /&gt;
&lt;br /&gt;
The operating system used for this installation is Ubuntu 12.04 LTS (Precise). &lt;br /&gt;
&lt;br /&gt;
=== Server Requirements  ===&lt;br /&gt;
&lt;br /&gt;
Our deployment uses 13 Cisco UCS C-series servers to serve the roles of Controller, Compute, Load-Balancer and Swift Proxy/Storage. The environment scales linearly, therefore individual nodes can be added to increase capacity for any particular OpenStack service. The five distinct node types used in this document are: &lt;br /&gt;
&lt;br /&gt;
*'''3 Controller Nodes-'''&amp;amp;nbsp;Runs Nova API, Nova Conductor, Nova Consoleauth, Nova Novncproxy, Nova Scheduler, NoVNC, Quantum Server, Quantum Plugin OVS, Glance API/Registry, Keystone, Cinder API, Cinder Scheduler, OpenStack Dashboard, RabbitMQ Server, MySQL Server WSREP and Galera. &lt;br /&gt;
**Provides management functionality of the OpenStack environment.&lt;br /&gt;
&lt;br /&gt;
*'''3 Compute Nodes-'''&amp;amp;nbsp;Runs Nova Compute, Quantum OVS and DHCP Agents, Cinder Volume and TGT services. &lt;br /&gt;
**Provides the hypervisor role for running Nova instances (Virtual Machines) and presents LVM volumes for Cinder block storage.&lt;br /&gt;
&lt;br /&gt;
*'''2 Load-Balancer Nodes-'''&amp;amp;nbsp;Runs HAProxy and Keepalived to load-balance traffic across Controller and Swift Proxy clusters.&lt;br /&gt;
&lt;br /&gt;
*'''2 Swift Proxy Nodes-'''&amp;amp;nbsp;The Proxy Node is responsible for tying together users and their data within the the Swift object storage system. For each request, it will look up the location of the account, container or object in the Swift ring and route the request accordingly. The public API is also exposed by Proxy Node.&lt;br /&gt;
&lt;br /&gt;
*'''3 Swift Storage Nodes-'''&amp;amp;nbsp;Each Storage Nodes contains Swift object, container, and account services. At a very high-level, these are the servers that contain the user data and perform replication among one another to keep the system in a consistent state.&lt;br /&gt;
&lt;br /&gt;
=== Networking Requirements  ===&lt;br /&gt;
&lt;br /&gt;
The OpenStack HA environment uses five separate networks. Three of the five networks are used by Tenants. Three tenant networks are being used as an example, and thus the tenant networks can be increased or decreased based on your deployment needs. Connectivity within Tenants uses Quantum with the Open vSwitch (OVS) plugin and [http://docs.openstack.org/trunk/openstack-network/admin/content/provider_networks.html Provider Network Extensions]. Provider Network Extensions allow cloud administrators to create OpenStack networks that map directly to physical networks in the data center and support local, VLAN and GRE deployment models. Our example uses the Provider VLAN networking model. The network details are as follows: &lt;br /&gt;
&lt;br /&gt;
*'''1 Management Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used to perform management functions against the node. For example, SSH'ing to the nodes to change a configuration setting. The network is also used for lights-out management using the CIMC interface of the UCS servers. Lastly, OpenStack API's and the Horizon web dashboard is associated to this network. &lt;br /&gt;
**An IP address for each node is required for this network. If using lights-out management such as CIMC, each node will require 2 addresses from this network. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]). &lt;br /&gt;
*'''3 Tenant Networks'''&amp;lt;br&amp;gt; &lt;br /&gt;
**These networks are used to provide connectivity to Instances. Since Quantum Provider Networking Extensions are being used, it is common to give tenants direct access to a &amp;quot;public&amp;quot; network that can be used to reach the Internet. &lt;br /&gt;
**Compute Nodes will have an interface attached to this network. Since the Compute Node interfaces that attach to this network are managed by OVS, they should not contain an IP address. &lt;br /&gt;
**This network typically employs publicly routable IP addressing if external NAT'ing is not used upstream towards the Internet edge ('''Note:''' in this document all IP addressing for all interfaces comes out of various private addressing blocks). &lt;br /&gt;
*'''1 Storage Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used for providing separate connectivity between Swift Proxy and Storage Nodes. This ensures storage traffic is not interfering with Instance traffic. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]) IP addressing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''[http://docwiki.cisco.com/w/images/a/a8/Grizzly-ha-network-design-details-v1.0.png Figure 1]''' is used to help visualize the network deployment and to act as a reference for configuration steps within the document. It is highly recommend to print the diagram so it can easily be referenced throughout the installation process.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;u&amp;gt;'''Figure 1:'''&amp;lt;/u&amp;gt;'''OpenStack HA Network Design Details''' &lt;br /&gt;
&lt;br /&gt;
[[Image:Grizzly-ha-network-design-details-v1.0.png|thumb|left]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''Other Network Services'''&amp;lt;br&amp;gt; &lt;br /&gt;
**'''DNS: '''In this setup an external DNS server (192.168.26.186) is used for name resolution of OpenStack nodes and external name resolution. If DNS is not being used, the /etc/hosts file should include the following for all nodes:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 127.0.0.1	localhost&lt;br /&gt;
 192.168.220.40  control.dmz-pod2.lab		control&lt;br /&gt;
 192.168.220.41  control01.dmz-pod2.lab	        control01&lt;br /&gt;
 192.168.220.42  control02.dmz-pod2.lab  	control02&lt;br /&gt;
 192.168.220.43  control03.dmz-pod2.lab  	control03&lt;br /&gt;
 192.168.220.60  swiftproxy.dmz-pod2.lab	        swiftproxy&lt;br /&gt;
 192.168.220.61  swiftproxy01.dmz-pod2.lab	swiftproxy01&lt;br /&gt;
 192.168.220.62  swiftproxy02.dmz-pod2.lab	swiftproxy02&lt;br /&gt;
 192.168.220.51  compute01.dmz-pod2.lab          compute01&lt;br /&gt;
 192.168.220.52  compute02.dmz-pod2.lab          compute02&lt;br /&gt;
 192.168.220.53  compute03.dmz-pod2.lab          compute03&lt;br /&gt;
&lt;br /&gt;
*'''NTP: '''In this setup an external NTP server(s) is used for time synchronization. &lt;br /&gt;
*'''Physical Network Switches:''' Each node in this setup is physically attached to a Cisco Nexus switch acting as a Top-of-Rack access layer device. Trunking is configured on each interface connecting to the eth0 NIC of each node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Upstream routers/aggregation layer switches will most likely be terminating the Layer-3 VLAN interfaces. If these interfaces are deployed in a redundant fashion with a First Hop Redundancy Protocol such as HSRP or VRRP, then you should be careful of the IP addresses assigned to the physical L3 switches/routers as they may conflict with the IP address of the Quantum router's public subnet (.3 by default). For example, if you are using HSRP and you have .1 as the standby IP address, .2 as the first L3 switch IP and .3 as the second L3 switch IP, you will receive a duplicate IP address error on the second L3 switch. This can be worked around by using high-order IPs on your upstream L3 device or altering the Quantum subnet configuration at the time of creation to have an IP starting range higher than the physical switches/routers are using (i.e. .4 and higher). Our example uses an IP allocation range that starts with .10 to avoid this issue.&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
The installation of the nodes should be in the following order: &lt;br /&gt;
&lt;br /&gt;
#'''Load-Balancer Nodes-''' slb01 and slb02 &lt;br /&gt;
#'''Swift Storage Nodes-''' swift01, swift02 and swift03 &lt;br /&gt;
#'''Swift Proxy Nodes-''' swiftproxy01 and swiftproxy02 &lt;br /&gt;
#'''Controller Nodes-''' control01, control02 and control03 &lt;br /&gt;
#'''Compute Nodes- '''compute01, compute02 and compute03&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Nodes  ===&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu Precise 12.04 Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Ubuntu 12.04 (AMD 64-bit) from CD/ISO or automated install (i.e. kickstart). You can reference Section 4 in the [http://docwiki.cisco.com/wiki/OpenStack:Essex_Build_Node#Starting_the_Ubuntu_Installation Build Node Guide] if you are unfamiliar with the Ubuntu Precise installation process. Use the following networking section to configure your network adapter properties for each node. As previously mentioned in the Critical Reminders Section, make sure to create an LVM Volume Group named nova-volumes for Compute Nodes and do not configure RAID for Swift Storage Nodes. Lastly, select ssh-server as the only additional package during the Ubuntu Precise installation. &lt;br /&gt;
&lt;br /&gt;
==== Grizzly Packages  ====&lt;br /&gt;
&lt;br /&gt;
The [https://launchpad.net/~openstack-ubuntu-testing/+archive/grizzly-trunk-testing Ubuntu Testers Team] manages the repository used by this document for OpenStack Grizzly packaging. Although the repository supports Ubuntu Precise and Raring releases, the document is only based on Precise. The Ubuntu Testers PPA should be used for all OpenStack nodes (i.e. not needed for Load-Balancer nodes). &lt;br /&gt;
&lt;br /&gt;
Use sudo mode or run from root account for the entire installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the Ubuntu Grizzly repository: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install python-software-properties -y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;apt-add-repository ppa:openstack-ubuntu-testing/grizzly-trunk-testing&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' Press enter when you are prompted for “[ENTER] or cancel” when adding the PPA. Update your system: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get update&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Networking  ====&lt;br /&gt;
&lt;br /&gt;
Our implementation uses VLANs for segmentation of certain networks. Make sure the VLAN package is installed and your network switches have been configured for VLANs. Otherwise, replicate the network setup using only physical interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install vlan -y&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.81&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.82&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Proxy Node swiftproxy01 /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Proxy Node swiftproxy02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.62&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.62&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.41&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.42&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.43&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.51&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.52&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.53&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart networking: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/networking restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Time Synchronization  ====&lt;br /&gt;
&lt;br /&gt;
Install NTP: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y ntp&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add your NTP server(s) by editing /etc/ntp.conf. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; OpenStack requires that clocks be synchronized. Our example uses a '''FAKE '''server called ntp.corp.com as the NTP server. Make sure you change&amp;amp;nbsp;ntp.corp.com to your real NTP server. Lastly, make sure the NTP server name resolves. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/ntp.conf&lt;br /&gt;
&lt;br /&gt;
server ntp.corp.com&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart NTP for the changes to take effect &lt;br /&gt;
&amp;lt;pre&amp;gt;service ntp restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that you are pulling time: &lt;br /&gt;
&amp;lt;pre&amp;gt;ntpq -p&lt;br /&gt;
&lt;br /&gt;
remote           refid      st t when poll reach   delay   offset  jitter&lt;br /&gt;
==============================================================================&lt;br /&gt;
*ntp.corp.       .GPS.            1 u  185  512  377   76.035    0.053   0.033&lt;br /&gt;
 cheezum.mattnor 129.7.1.66       2 u   8d 1024    0   47.731   -0.555   0.000&lt;br /&gt;
 ntp2.rescomp.be .STEP.          16 u    - 1024    0    0.000    0.000   0.000&lt;br /&gt;
 216.45.57.38    204.123.2.5      2 u  54h 1024    0   12.607    0.808   0.000&lt;br /&gt;
 lithium.constan 128.4.1.1        2 u   8d 1024    0   69.861    0.206   0.000&lt;br /&gt;
 europium.canoni 193.79.237.14    2 u  54h 1024    0  144.040   -1.455   0.000&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load Balancer Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Perform the following steps on nodes slb01 and slb02. &lt;br /&gt;
&lt;br /&gt;
==== Keepalived &amp;amp;amp; HAProxy  ====&lt;br /&gt;
&lt;br /&gt;
Edit /etc/sysctl.conf to allow Keepalived to associate a virtual IP address (VIP) that is not directly bound to an interface on the node:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;net.ipv4.ip_nonlocal_bind=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load in sysctl settings from /etc/sysctl.conf: &lt;br /&gt;
&amp;lt;pre&amp;gt;sysctl -p&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install Keepalived and HAProxy packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keepalived haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the /var/lib/haproxy directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /var/lib/haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure /var/lib/haproxy is owned by root. Change the file ownership if needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /var/lib/haproxy/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the&amp;amp;nbsp;/etc/keepalived/keepalived.conf file for slb01 with the contents below.&amp;amp;nbsp; Change&amp;amp;nbsp;[YOUR_DOMAIN_NAME] with your actual domain name.&amp;amp;nbsp; The keepalived.conf includes the following sections:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global_defs-''' Global parameters affect the whole process behavior.&amp;amp;nbsp;There may be several 'global' sections if needed, but their parameters will only be merged. &amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_script-''' Keepalived supports a VRRP scripting framework to extend base functionality.&amp;amp;nbsp; The vrrp_script named haproxy will check the status of the haproxy service every 2 seconds and add 2 points of priority if the status is running. &amp;amp;nbsp;If the haproxy service is not running, the backup HAProxy Node will become the primary and begin passing traffic for the virtual_ipaddress(es).&amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_instance-''' Is where you define configuration paramters for virtual gateway addresses.&amp;amp;nbsp; slb01 is configured as the primary gateway for 192.168.220.40 (Controller Cluster) and the backup gateway for 192.168.220.60 (Swift Proxy Cluster). Accordingly, slb02 is configured as the primary for 192.168.220.60 and the backup for 192.168.220.40.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb01&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure /etc/keepalived/keepalived.conf for slb02 with the following contents. Change [YOUR_DOMAIN_NAME] with your actual domain name. &lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb02&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb01 with the contents below. HAProxy's configuration process involves 3 major sources of parameters:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*The arguments from the command-line, which always take precedence.&amp;lt;br&amp;gt; &lt;br /&gt;
*The &amp;quot;global&amp;quot; section, which sets process-wide parameters.&amp;lt;br&amp;gt; &lt;br /&gt;
*The proxies sections which can take form of &amp;quot;defaults&amp;quot;, &amp;quot;listen&amp;quot;, &amp;quot;frontend&amp;quot; and &amp;quot;backend&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following provides additional details of the haproxy.cfg file:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global-&amp;amp;nbsp; '''Sets process-wide parameters for load-balancing traffic.&amp;amp;nbsp; Global parameters can be overriden by server-specific configurations within the''listen section ''of the haproxy.cfg file.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''defaults-''' The &amp;quot;defaults&amp;quot; section sets default parameters for all other sections following its declaration. Those default parameters are reset by the next &amp;quot;defaults&amp;quot; section. The name is optional but its use is encouraged for better readability.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''listen-''' A &amp;quot;listen&amp;quot; section defines a complete proxy with its front-end (i.e. listening VIP) and back-end (i.e. real IP of servers)&amp;amp;nbsp;parts combined in one section. Currently two major proxy modes are supported: &amp;quot;tcp&amp;quot;, also known as layer 4 and &amp;quot;http&amp;quot;, also known as layer 7. In layer 4 mode, HAProxy simply forwards bidirectional traffic between two sides. In layer 7 mode, HAProxy analyzes the protocol and can interact with it by allowing, blocking, switching, adding, modifying, or removing arbitrary content in requests or responses based on configurable criteria.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
 chroot  /var/lib/haproxy&lt;br /&gt;
 daemon  &lt;br /&gt;
 group  haproxy&lt;br /&gt;
 log  192.168.220.81 local0&lt;br /&gt;
 maxconn  4000&lt;br /&gt;
 pidfile  /var/run/haproxy.pid&lt;br /&gt;
 user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
 log  global&lt;br /&gt;
 maxconn  8000&lt;br /&gt;
 option  redispatch&lt;br /&gt;
 retries  3&lt;br /&gt;
 timeout  http-request 10s&lt;br /&gt;
 timeout  queue 1m&lt;br /&gt;
 timeout  connect 10s&lt;br /&gt;
 timeout  client 1m&lt;br /&gt;
 timeout  server 1m&lt;br /&gt;
 timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
 bind 192.168.220.40:80&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
 bind 192.168.220.40:3306&lt;br /&gt;
 balance  source&lt;br /&gt;
 mode  tcp&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9292&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
 bind 192.168.220.40:9191&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
 bind 192.168.220.40:35357&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
 bind 192.168.220.40:5000&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
 bind 192.168.220.40:11211&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
 bind 192.168.220.40:8773&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
 bind 192.168.220.40:8774&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
 bind 192.168.220.40:8775&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
 bind 192.168.220.40:8776&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
 bind 192.168.220.40:6080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9696&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
 bind 192.168.220.60:8080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb02 with the contents below. &lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
  chroot  /var/lib/haproxy&lt;br /&gt;
  daemon  &lt;br /&gt;
  group  haproxy&lt;br /&gt;
  log  192.168.220.82 local0&lt;br /&gt;
  maxconn  4000&lt;br /&gt;
  pidfile  /var/run/haproxy.pid&lt;br /&gt;
  user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
  log  global&lt;br /&gt;
  maxconn  8000&lt;br /&gt;
  option  redispatch&lt;br /&gt;
  retries  3&lt;br /&gt;
  timeout  http-request 10s&lt;br /&gt;
  timeout  queue 1m&lt;br /&gt;
  timeout  connect 10s&lt;br /&gt;
  timeout  client 1m&lt;br /&gt;
  timeout  server 1m&lt;br /&gt;
  timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
  bind 192.168.220.40:80&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
  bind 192.168.220.40:3306&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9292&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
  bind 192.168.220.40:9191&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
  bind 192.168.220.40:35357&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
  bind 192.168.220.40:5000&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
  bind 192.168.220.40:11211&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
  bind 192.168.220.40:8773&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
  bind 192.168.220.40:8774&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
  bind 192.168.220.40:8775&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
  bind 192.168.220.40:8776&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
  bind 192.168.220.40:6080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9696&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
  bind 192.168.220.60:8080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set &amp;quot;ENABLED&amp;quot; to &amp;quot;1&amp;quot; in /etc/default/haproxy &lt;br /&gt;
&amp;lt;pre&amp;gt;ENABLED=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keepalived and HAProxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/keepalived restart&lt;br /&gt;
/etc/init.d/haproxy restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Swift Nodes&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Install Swift and other basic packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift openssh-server rsync memcached python-netifaces python-xattr python-memcache &amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir -p /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration file. '''Note:''' This file should be identical on all Swift nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/swift.conf&lt;br /&gt;
&lt;br /&gt;
[swift-hash]&lt;br /&gt;
swift_hash_path_suffix = Gdr8ny7YyWqy2&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the Swift directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Storage Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Run these commands on nodes swift01, swift02 and swift03. Install the Swift Storage Node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-account swift-container swift-object xfsprogs parted&amp;lt;/pre&amp;gt; &lt;br /&gt;
For each of the hard disks other than the Ubuntu installation disk (i.e. /dev/sda), create an XFS volume with a single partition. Our example uses five hard disks (/dev/sdb - /dev/sdf) per Storage Node. Repeat this step for each disk that will be used for Swift storage: &lt;br /&gt;
&amp;lt;pre&amp;gt;parted /dev/sdb mklabel msdos&lt;br /&gt;
parted -a optimal /dev/sdb mkpart primary ext2 0% 100%&lt;br /&gt;
mkfs.xfs -i size=1024 /dev/sdb1&lt;br /&gt;
echo &amp;quot;/dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0&amp;quot; &amp;amp;gt;&amp;amp;gt; /etc/fstab&lt;br /&gt;
mkdir -p /srv/node/sdb1&lt;br /&gt;
mount /srv/node/sdb1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the mount directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /srv/node&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create an Rsync configuration file on each Storage Node. In the following example, replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/rsyncd.conf&lt;br /&gt;
&lt;br /&gt;
uid = swift&lt;br /&gt;
gid = swift&lt;br /&gt;
log file = /var/log/rsyncd.log&lt;br /&gt;
pid file = /var/run/rsyncd.pid&lt;br /&gt;
address = [STORAGE_NET_IP]&lt;br /&gt;
&lt;br /&gt;
[account]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/account.lock&lt;br /&gt;
&lt;br /&gt;
[container]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/container.lock&lt;br /&gt;
&lt;br /&gt;
[object]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/object.lock&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following line in /etc/default/rsync: &lt;br /&gt;
&amp;lt;pre&amp;gt;RSYNC_ENABLE = true&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start rsync daemon: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rsync start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/account-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/account-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = account-server&lt;br /&gt;
&lt;br /&gt;
[app:account-server]&lt;br /&gt;
use = egg:swift#account&lt;br /&gt;
&lt;br /&gt;
[account-replicator]&lt;br /&gt;
&lt;br /&gt;
[account-auditor]&lt;br /&gt;
&lt;br /&gt;
[account-reaper]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/container-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/container-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = container-server&lt;br /&gt;
&lt;br /&gt;
[app:container-server]&lt;br /&gt;
use = egg:swift#container&lt;br /&gt;
&lt;br /&gt;
[container-replicator]&lt;br /&gt;
&lt;br /&gt;
[container-updater]&lt;br /&gt;
&lt;br /&gt;
[container-auditor]&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Create /etc/swift/object-server.conf&amp;amp;nbsp;with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71):&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/object-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = object-server&lt;br /&gt;
&lt;br /&gt;
[app:object-server]&lt;br /&gt;
use = egg:swift#object&lt;br /&gt;
&lt;br /&gt;
[object-replicator]&lt;br /&gt;
&lt;br /&gt;
[object-updater]&lt;br /&gt;
&lt;br /&gt;
[object-auditor]&lt;br /&gt;
&lt;br /&gt;
[object-expirer]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the storage services. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; At this point, the ring files will not be present on the storage nodes. This will cause the *-replicator services to fail to start properly. After you create the ring files on the first proxy node (in the next section) and distribute them to the storage nodes, a service restart should allow all Swift services to start properly. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init object-server start&lt;br /&gt;
swift-init object-replicator start&lt;br /&gt;
swift-init object-updater start&lt;br /&gt;
swift-init object-auditor start&lt;br /&gt;
swift-init container-server start&lt;br /&gt;
swift-init container-replicator start&lt;br /&gt;
swift-init container-updater start&lt;br /&gt;
swift-init container-auditor start&lt;br /&gt;
swift-init account-server start&lt;br /&gt;
swift-init account-replicator start&lt;br /&gt;
swift-init account-auditor start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height: 1.5em;&amp;quot;&amp;gt;Make sure you repeat these steps for every Storage Node.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Proxy Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Ensure you have completed the previous steps in the &amp;quot;General Installation Steps for All Swift Nodes&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
Perform these steps on nodes swiftproxy01 and swiftproxy02. First, install the proxy node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-proxy memcached python-keystoneclient python-swiftclient swift-plugin-s3&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify memcached to bind to the storage network interface (192.168.222.x in our example). Edit the following line in /etc/memcached.conf, changing: &lt;br /&gt;
&amp;lt;pre&amp;gt;-l 127.0.0.1 &lt;br /&gt;
to&lt;br /&gt;
-l [STORAGE_NET_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the memcached server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
If it does not exist, create the /etc/swift/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /etc/swift/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure the directory the /etc/swift and the /var/cache/swift directories are owned by the swift user and group: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown swift:swift /etc/swift/&lt;br /&gt;
chown -R swift:swift /var/cache/swift/&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create /etc/swift/proxy-server.conf with the following contents: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_port = 8080&lt;br /&gt;
workers = 32&lt;br /&gt;
user = swift&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = catch_errors healthcheck cache ratelimit authtoken keystoneauth proxy-server&lt;br /&gt;
&lt;br /&gt;
[app:proxy-server]&lt;br /&gt;
use = egg:swift#proxy&lt;br /&gt;
allow_account_management = true&lt;br /&gt;
account_autocreate = true&lt;br /&gt;
&lt;br /&gt;
[filter:keystoneauth]&lt;br /&gt;
use = egg:swift#keystoneauth&lt;br /&gt;
operator_roles = Member,admin, swiftoperator&lt;br /&gt;
&lt;br /&gt;
[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
signing_dir = /var/cache/swift&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
auth_uri = http://192.168.220.40:5000&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = swift&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
delay_auth_decision = 10&lt;br /&gt;
&lt;br /&gt;
[filter:cache]&lt;br /&gt;
use = egg:swift#memcache&lt;br /&gt;
memcache_servers = 192.168.222.61:11211,192.168.222.62:11211&lt;br /&gt;
&lt;br /&gt;
[filter:catch_errors]&lt;br /&gt;
use = egg:swift#catch_errors&lt;br /&gt;
&lt;br /&gt;
[filter:healthcheck]&lt;br /&gt;
use = egg:swift#healthcheck&lt;br /&gt;
&lt;br /&gt;
[filter:ratelimit]&lt;br /&gt;
use = egg:swift#ratelimit&lt;br /&gt;
clock_accuracy = 1000&lt;br /&gt;
max_sleep_time_seconds = 60&lt;br /&gt;
log_sleep_time_seconds = 0&lt;br /&gt;
rate_buffer_seconds = 5&lt;br /&gt;
account_ratelimit = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, create the account, container and object rings. The builder command is basically creating a builder file with a few parameters. The parameter with the value of 18 represents 2 ^ 18th, this is the value of the partition size. Set this “partition power” value based on the total amount of storage you expect your entire ring to use. The value of 3 represents the number of replicas of each object, with the last value being the number of hours to restrict moving a partition more than once. Additional information regarding Swift ring preperation can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/preparing-the-ring.html here]. &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/swift&lt;br /&gt;
&lt;br /&gt;
swift-ring-builder account.builder create 18 3 1&lt;br /&gt;
swift-ring-builder container.builder create 18 3 1&lt;br /&gt;
swift-ring-builder object.builder create 18 3 1&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, for every storage device on each storage node add entries to each ring. This example prepares the account, container and object rings for storage node swift01 (192.168.222.71) with a partition in zone 1. The mount point of this partition is /srv/node/sdb1 and the path in rsyncd.conf is /srv/node/, the DEVICE would be sdb1 and the commands would look like: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder add z1-192.168.222.71:6002/sdb1 100&lt;br /&gt;
swift-ring-builder container.builder add z1-192.168.222.71:6001/sdb1 100&lt;br /&gt;
swift-ring-builder object.builder add z1-192.168.222.71:6000/sdb1 100&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Make sure not to place all devices in the same zone (i.e. z1). It is recommended to configure the zones as high-level as possible to create the greatest amount of isolation. Some considerations can include physical location, power availability, and network connectivity. For example, in a small cluster you might decide to split the zones up by cabinet, with each cabinet having its own power and network connectivity. Since our deployment only uses 3 storage nodes, each node should be in its own zone. However, it is recommended to have a minimum of 5 zones in a production-level Swift deployment. &lt;br /&gt;
&lt;br /&gt;
Verify the ring contents for each ring: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
swift-ring-builder /etc/swift/container.builder&lt;br /&gt;
swift-ring-builder /etc/swift/object.builder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Your output should look similar to this: &lt;br /&gt;
&amp;lt;pre&amp;gt;root@swiftproxy01:~# swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
/etc/swift/account.builder, build version 15&lt;br /&gt;
262144 partitions, 3 replicas, 3 zones, 15 devices, 0.00 balance&lt;br /&gt;
The minimum number of hours before a partition can be reassigned is 1&lt;br /&gt;
Devices:    id  zone      ip address  port      name weight partitions balance meta&lt;br /&gt;
             0     3  192.168.222.73  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
             1     2  192.168.222.72  6002      sdd1   1.00      52429    0.00 &lt;br /&gt;
             2     3  192.168.222.73  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             3     2  192.168.222.72  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             4     3  192.168.222.73  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             5     1  192.168.222.71  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             6     1  192.168.222.71  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             7     2  192.168.222.72  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
             8     1  192.168.222.71  6002      sdd1   1.00      52428   -0.00 &lt;br /&gt;
             9     2  192.168.222.72  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
            10     1  192.168.222.71  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
            11     1  192.168.222.71  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            12     3  192.168.222.73  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            13     2  192.168.222.72  6002      sde1   1.00      52428   -0.00 &lt;br /&gt;
            14     3  192.168.222.73  6002      sdd1   1.00      52428   -0.00&amp;lt;/pre&amp;gt; &lt;br /&gt;
Repeat the command, but replace account with object and container to verify the contents of the others two Swift rings. &lt;br /&gt;
&lt;br /&gt;
Rebalance the rings. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Rebalancing rings can take a while. You may get a message about a balance value and that you need to rebalance/push after the minimum 1 hour. If so, recheck the status after an hour. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder rebalance&lt;br /&gt;
swift-ring-builder container.builder rebalance&lt;br /&gt;
swift-ring-builder object.builder rebalance&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the account.ring.gz, container.ring.gz, and object.ring.gz files to swiftproxy02 and the 3 storage nodes in /etc/swift. &lt;br /&gt;
&lt;br /&gt;
Make sure all the config files are owned by the swift user: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Proxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init proxy start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verify the Swift Installation  ===&lt;br /&gt;
&lt;br /&gt;
You can run verification commands from the proxy server or any server with access to Keystone. Keep in mind that proxy nodes are configured to use Keystone for user authentication. As a result, you '''MUST''' complete the Controller Node Installation steps and ensure Keystone is operational before proceeding with Swift verification. &lt;br /&gt;
&lt;br /&gt;
Verify that you can successfully authenticate against Keystone using the Swift authentication credentials: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y curl&lt;br /&gt;
&lt;br /&gt;
curl -s -d &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should receive output similar to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;access&amp;quot;: {&amp;quot;token&amp;quot;: {&amp;quot;issued_at&amp;quot;: &amp;quot;2013-04-02T14:55:31.149327&amp;quot;, &amp;quot;expires&amp;quot;: &amp;quot;2013-04-03T14:55:31Z&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;bb29ef5439ce4a75bf85332bbadf6538&amp;quot;, &amp;quot;tenant&amp;quot;: {&amp;quot;description&amp;quot;: &lt;br /&gt;
null, &amp;quot;enabled&amp;quot;: true, &amp;quot;id&amp;quot;: &amp;quot;b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;services&amp;quot;}}, &amp;quot;serviceCatalog&amp;quot;: [{&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;45a336cb74e04e11ab95c0ea28b699d6&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;compute&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;nova&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;259fef5e66814f47ac1934d3cf522a3d&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;network&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;quantum&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [&lt;br /&gt;
{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;166de3790eb54c31a58237fe9ea3d301&amp;quot;, &lt;br /&gt;
&amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;image&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;glance&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;0a2c69157d5948a9ae8ecee5c65a6d2b&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;volume&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;cinder&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Admin&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &lt;br /&gt;
&amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;05f85b8aacbd4c87b680dcc2fb6da539&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;}], &lt;br /&gt;
&amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;ec2&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;ec2&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.60:8080/v1&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;4a1af526137341c0a682eb573101ddde&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;object-store&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;3e3f7b50b5bd44b7a15b3e4ae55086bf&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;identity&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;keystone&amp;quot;}], &amp;quot;user&amp;quot;: {&amp;quot;username&amp;quot;: &amp;quot;swift&amp;quot;, &amp;quot;roles_links&amp;quot;: [], &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;ed69664ac78a4b65a36d63da6b760863&amp;quot;, &amp;quot;roles&amp;quot;: [{&amp;quot;name&amp;quot;: &amp;quot;_member_&amp;quot;}, {&amp;quot;name&amp;quot;: &amp;quot;admin&amp;quot;}], &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, &amp;quot;metadata&amp;quot;: {&amp;quot;is_admin&amp;quot;: 0, &amp;quot;roles&amp;quot;: [&lt;br /&gt;
&amp;quot;9fe2ff9ee4384b1894a90878d3e92bab&amp;quot;, &amp;quot;6a553ae3be3c4f8c8fe079830d4102a5&amp;quot;]}}}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Use the swift client stat command to make sure you can view the contents of the ring.&amp;amp;nbsp;You can run these commands from the proxy server or any server with the swift client and access to Keystone. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U admin:admin -K keystone_admin stat&lt;br /&gt;
   Account: AUTH_3eccdb2a9331419c96ac9ff336110b65&lt;br /&gt;
Containers: 1&lt;br /&gt;
   Objects: 2&lt;br /&gt;
     Bytes: 0&lt;br /&gt;
Accept-Ranges: bytes&lt;br /&gt;
X-Timestamp: 1363989109.30329&lt;br /&gt;
X-Trans-Id: tx147dd9983ac54af1b71c5a561ae2aa9a&lt;br /&gt;
Content-Type: text/plain; charset=utf-8&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can see that 1 container exists. &amp;amp;nbsp;Now, lets find out the name of the container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list&lt;br /&gt;
glance&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The glance container is created after the Controller cluster is built and an image has been uploaded to Glance. &lt;br /&gt;
&lt;br /&gt;
List the contents of the Glance container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list glance&lt;br /&gt;
24164630-ba2f-436a-8bc6-43975717d5e5&lt;br /&gt;
858a11dc-ed61-4a18-a778-eabcb454ae45&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Controller Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Runs these commands on nodes control01, control02 and control03. &amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install MySQL and Galera dependencies: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y libaio1 libssl0.9.8 mysql-client-5.5 python-mysqldb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download MySQL-WSREP and Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget -O /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb http://launchpad.net/codership-mysql/5.5/5.5.23-23.6/+download/mysql-server-wsrep-5.5.23-23.6-amd64.deb --no-check-certificate&lt;br /&gt;
wget -O /tmp/galera-23.2.1-amd64.deb http://launchpad.net/galera/2.x/23.2.1/+download/galera-23.2.1-amd64.deb --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install MySQL and Galera. '''Note:''' If you are prompted to create a root password during the Galera package installation, please make note of the password you use as it will be needed when connecting to MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;dpkg -i /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb&lt;br /&gt;
dpkg -i /tmp/galera-23.2.1-amd64.deb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the MySQL bind address: &lt;br /&gt;
&amp;lt;pre&amp;gt;sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the following line to /etc/rc.local on all controllers to allow MySQL to start automatically upon reboot: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.41&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.42&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.43&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt;It is important to understand the [http://www.codership.com/wiki/doku.php?id=mysql_options_0.8 gcomm address] concept behind [http://www.codership.com/ Galera]. Only use an empty gcomm:// address when you create a NEW cluster. Never use it when your intention is to reconnect to an existing one. After the Galera cluster is established, you should change the gcomm address on control01 from gcomm:// to gcomm://192.168.220.42 or gcomm://192.168.220.43. Otherwise, control01 will not join the cluster upon reboot. Make sure to also restart the mysql service when making changes to any of the associated configuration files. &lt;br /&gt;
&lt;br /&gt;
Restart MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the Galera cluster has been established. The value should show 4 for all nodes in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | Variable_name      | Value |&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | wsrep_local_state  |    4  |&lt;br /&gt;
  +------------------------+---+&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Monitoring  ====&lt;br /&gt;
Complete each of the steps below on each control node except for when a single node is specified.&lt;br /&gt;
&lt;br /&gt;
Install xinetd: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y xinetd&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the mysqlchk service: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/mysqlchk -P /etc/xinetd.d/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' After functional testing is complete, it's recommended to secure the mysqlchk service. This can be accomplished by editing the only_from and per_source values in /etc/xinetd.d/ to the subnet used by the load-balancer nodes. &lt;br /&gt;
&lt;br /&gt;
Edit /etc/xinetd.d/mysqlchk by changing &amp;amp;lt;%= mysqlchk_script_dir&amp;amp;nbsp;%&amp;amp;gt;/galera_chk to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure root is the file owner: &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
If not, change the file permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the mysqlcheck service to /etc/services by adding the following line: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysqlchk        9200/tcp                        # MySQL Galera health check script&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the MySQL Galera health check script: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/galera_chk -P /usr/local/bin/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the file ownership and permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /usr/local/bin/galera_chk &lt;br /&gt;
chmod +x  /usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /usr/local/bin/galera_chk as follows. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41). &lt;br /&gt;
&amp;lt;pre&amp;gt;MYSQL_HOST=&amp;quot;[CONTROLLER_MGT_IP]&amp;quot;&lt;br /&gt;
MYSQL_PORT=&amp;quot;3306&amp;quot;&lt;br /&gt;
MYSQL_USERNAME=&amp;quot;mysqlchk_user&amp;quot;&lt;br /&gt;
MYSQL_PASSWORD=&amp;quot;mysqlchk_password&amp;quot;&lt;br /&gt;
MYSQL_OPTS=&amp;quot;-N -q -A&amp;quot;&lt;br /&gt;
TMP_FILE=&amp;quot;/dev/shm/mysqlchk.$$.out&amp;quot;&lt;br /&gt;
ERR_FILE=&amp;quot;/dev/shm/mysqlchk.$$.err&amp;quot;&lt;br /&gt;
FORCE_FAIL=&amp;quot;/dev/shm/proxyoff&amp;quot;&lt;br /&gt;
MYSQL_BIN=&amp;quot;/usr/bin/mysql&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart xinetsd: &lt;br /&gt;
&amp;lt;pre&amp;gt;service xinetd restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Connect to MySQL and add the mysqlchk user to each controller in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
use mysql;&lt;br /&gt;
INSERT INTO user (Host,User,Password) VALUES('%','mysqlchk_user',PASSWORD('mysqlchk_password'));&lt;br /&gt;
flush privileges;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Grant privileges for the mysqlchk user. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41).: &lt;br /&gt;
&amp;lt;pre&amp;gt;grant SUPER,PROCESS on *.* to 'mysqlchk_user'@'[CONTROLLER_MGT_IP]' IDENTIFIED BY 'mysqlchk_password';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the operational status of the MySQL Galera health check service. From slb01 or slb02, Telnet using port 9200 (health check port) and make sure you get a &amp;quot;MySQL is running&amp;quot; message: &lt;br /&gt;
&amp;lt;pre&amp;gt;telnet 192.168.220.41 9200&lt;br /&gt;
Trying 192.168.220.41...&lt;br /&gt;
Connected to 192.168.220.41.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Content-Type: text/html&lt;br /&gt;
Content-Length: 43&lt;br /&gt;
&amp;amp;lt;html&amp;amp;gt;&amp;amp;lt;body&amp;amp;gt;MySQL is running.&amp;amp;lt;/body&amp;amp;gt;&amp;amp;lt;/html&amp;amp;gt;&lt;br /&gt;
Connection closed by foreign host.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Repeat the previous step for each control node. &lt;br /&gt;
&lt;br /&gt;
Verify that you can access the MySQL database by using the Virtual IP address (VIP) of the Galera cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -umysqlchk_user -pmysqlchk_password -h192.168.220.40&amp;lt;/pre&amp;gt; &lt;br /&gt;
For informational purposes, this is the command used by the health check script. This example is for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql -N -q -A --host=192.168.220.41 --user=mysqlchk_user --password=mysqlchk_password -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RabbitMQ Installation  ====&lt;br /&gt;
Complete each of the following steps on each control node unless a specific node is called out.&lt;br /&gt;
&lt;br /&gt;
Install RabbitMQ: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y rabbitmq-server&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure RabbitMQ Clustering. First, stop the service and remove the mnesia database on all control nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server stop&lt;br /&gt;
rm -rf /var/lib/rabbitmq/mnesia&amp;lt;/pre&amp;gt; &lt;br /&gt;
Clustering requires that the nodes have the same Erlang cookie. Copy the Erlang cookie from control01 to control02 and control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.42:/var/lib/rabbitmq/.erlang.cookie&lt;br /&gt;
scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.43:/var/lib/rabbitmq/.erlang.cookie&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The above command requires root login (disabled by default in Ubuntu). If you do not have root permissions, copy the Erlang cookie from /var/lib/rabbitmq/ to the /tmp directory of control02 and control03 and then to /var/lib/rabbitmq/. Also, make sure the file permissions match on all 3 nodes. &lt;br /&gt;
&lt;br /&gt;
Now that all 3 control nodes have the same Erlang cookie, make sure that RabbitMQ will start: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server start&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' If RabbitMQ does not successfully start, do not proceed with clustering.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Clustering can be configured using rabbitmqctl commands or by modifying the RabbitMQ configuration file. Our example uses the rabbitmqctl commands since issues were experienced using the configuration file with RabbitMQ 2.7.1. You can see both approaches to configuring RabbitMQ clustering [http://www.rabbitmq.com/clustering.html#setup here]. &lt;br /&gt;
&lt;br /&gt;
In order to cluster the three control nodes, two of the nodes (i.e. rabbit@control2 and rabbit@control03) will be configured to join the cluster of the third node (rabbit@control01). '''Note:''' Joining a cluster implicitly resets the node, thus removing all resources and data that were previously present on that node. &lt;br /&gt;
&lt;br /&gt;
From control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control02 is now clustered with control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control02 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
From control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control03 is now clustered with control01 and control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control03 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02,rabbit@control03]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02,rabbit@control03]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Now that clustering is complete, secure RabbitMQ by removing the default (guest) user: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl delete_user guest&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a RabbitMQ user account that will be used by OpenStack services: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl add_user openstack_rabbit_user openstack_rabbit_password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the permissions for the new RabbitMQ user account: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl set_permissions -p / openstack_rabbit_user &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the user settings: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl list_users&lt;br /&gt;
rabbitmqctl list_user_permissions openstack_rabbit_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keystone Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Keystone on every control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keystone python-keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Remove the sqllite db: &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/keystone/keystone.db&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Keystone. The database needs to be created on only 1 control node. &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE keystone;&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'%' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'localhost' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' From other controllers in the cluster, you can see that databases are replicated by Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show databases;&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/keystone/keystone.conf file on each controller. Change [CONTROLLER_MGT_IP] to the management IP address of the control node (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
admin_token = keystone_admin_token&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
&lt;br /&gt;
[sql]&lt;br /&gt;
connection = mysql://keystone_admin:keystone_db_pass@192.168.220.40/keystone&lt;br /&gt;
&lt;br /&gt;
[ssl]&lt;br /&gt;
enable = False&lt;br /&gt;
&lt;br /&gt;
[signing]&lt;br /&gt;
token_format = UUID&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a credential file and load it so credentials are not required for every OpenStack client command. '''Note:''' This needs to be created on each node that you will run OpenStack commands from: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that MySQL is listening on the VIP for the Keystone database. If you have any problems connecting to the VIP, try the real IP address of a control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -h192.168.220.40 -ukeystone_admin -pkeystone_db_pass keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keystone: &lt;br /&gt;
&amp;lt;pre&amp;gt;service keystone restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh Keystone data script](Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;ADMIN_PASSWORD=${ADMIN_PASSWORD:-keystone_admin}&lt;br /&gt;
export SERVICE_TOKEN=&amp;quot;keystone_admin_token&amp;quot;&lt;br /&gt;
export SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0/&amp;quot;&lt;br /&gt;
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-services}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with data (users, tenants, services). '''Note:''' If you see a long timeout and errors about &amp;quot;connection timeout&amp;quot;, it may be related to your proxy setting. Remove the export of your http/https proxies and re-run the script. You will have to re-add your proxies for any other external downloads. &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://github.com/EmilienM/openstack-folsom-guide/blob/master/scripts/keystone-endpoints.sh Keystone endpoint script] (Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;# MySQL definitions&lt;br /&gt;
MYSQL_USER=keystone_admin&lt;br /&gt;
MYSQL_DATABASE=keystone&lt;br /&gt;
MYSQL_HOST=192.168.220.40&lt;br /&gt;
MYSQL_PASSWORD=keystone_db_pass&lt;br /&gt;
&lt;br /&gt;
# Keystone definitions&lt;br /&gt;
KEYSTONE_REGION=RegionOne&lt;br /&gt;
SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# other definitions&lt;br /&gt;
MASTER=&amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
SWIFT_MASTER=&amp;quot;192.168.220.60&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with service endpoints. Again, if you are using proxies then you will need remove them from your export before running this command: &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Test connectivity to Keystone by using a curl request&amp;amp;nbsp;: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install curl openssl -y&lt;br /&gt;
&lt;br /&gt;
curl -d '{&amp;quot;auth&amp;quot;: {&amp;quot;tenantName&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;passwordCredentials&amp;quot;:{&amp;quot;username&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;password&amp;quot;: &amp;quot;keystone_admin&amp;quot;}}}' -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens | python -mjson.tool&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the above command is successful, you will receive output that includes a token and a list of service endpoints.&amp;amp;nbsp;You may also want to verify the other service account credentials: &lt;br /&gt;
&lt;br /&gt;
'''Glance''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;glance\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Nova''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;nova\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Swift''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Quantum''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;quantum\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Cinder''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;cinder\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can also use the Keystone client to verify the configuration: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
keystone user-list&lt;br /&gt;
keystone role-list&lt;br /&gt;
keystone service-list&lt;br /&gt;
keystone endpoint-list&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Glance Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Glance API and Registry packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y glance-api glance-registry&amp;lt;/pre&amp;gt; &lt;br /&gt;
Delete the glance.sqlite file created in the /var/lib/glance/ directory &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/glance/glance.sqlite&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Glance on only 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE glance;&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-api.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41). Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
default_store = swift&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
registry_host = 192.168.220.40&lt;br /&gt;
swift_store_auth_address = http://192.168.220.40:5000/v2.0/&lt;br /&gt;
swift_store_user = services:swift&lt;br /&gt;
swift_store_key = keystone_admin&lt;br /&gt;
swift_store_container = glance&lt;br /&gt;
swift_store_create_container_on_put = True&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone+cachemanagement&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-registry.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41) Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the glance-api and glance-registry services: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-api restart; service glance-registry restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
The database tables are under version control and you use the following command on a new installation to prevent the Image service from breaking possible upgrades. This command is used on only one of the controllers: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage version_control 0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the glance database on one control node (You may get a message about deprecation - you can ignore): &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the services again to take into account the new modifications: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-registry restart; service glance-api restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the Cirros 0.3.1 cloud image to a controller node and then upload it to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-disk.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;cirros&amp;quot; is_public=true disk_format=qcow2 container_format=ovf &amp;amp;lt; cirros-0.3.1-x86_64-disk.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that Glance is serving the image: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance image-list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, you can add the Ubuntu Precise image to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
 &lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum Server on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y quantum-server quantum-plugin-openvswitch&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Quantum database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE quantum; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'%' IDENTIFIED BY 'quantum_pass'; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'localhost' IDENTIFIED BY 'quantum_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/quantum/quantum.conf file on all control nodes. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = quantum&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/quantum/keystone-signing&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1&lt;br /&gt;
bridge_mappings = physnet1:br-ex &lt;br /&gt;
&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the quantum server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-server restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova software packages on all Control Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-api nova-conductor nova-consoleauth nova-scheduler nova-novncproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Nova database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE nova;&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the authtoken section in the /etc/nova/api-paste.ini file on each control node to include the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = nova&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [CONTROLLER_MGT_IP] with the controller node's management IP address (i.e. control01 = 192.168.220.41). Do this on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
dhcpbridge_flagfile=/etc/nova/nova.conf&lt;br /&gt;
dhcpbridge=/usr/bin/nova-dhcpbridge&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
verbose=true&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
image_service=nova.image.glance.GlanceImageService&lt;br /&gt;
rpc_backend=nova.rpc.impl_kombu&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
service_down_time=60&lt;br /&gt;
rabbit_port=5672&lt;br /&gt;
rabbit_virtual_host=/&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
ec2_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
enabled_apis=ec2,osapi_compute&lt;br /&gt;
osapi_compute_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
novncproxy_port=6080&lt;br /&gt;
novncproxy_host=0.0.0.0&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
novncproxy_host=[CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Synchronize the Nova database (You may get a DEBUG message - You can ignore this). '''Note:''' The db sync needs to be completed on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Due to [https://bugs.launchpad.net/nova/+bug/1158958 bug 1158958], Nova API must be patched to support memcached instead of the in-process cache. First, see if Nova needs to be patched by grep'ing the file that needs to be patched. You will receive no output if the file needs to be patched. You will receive host = str(instance.get('host')) if the file does not need patching: &lt;br /&gt;
&amp;lt;pre&amp;gt;grep &amp;quot;str(instance.get('host'))&amp;quot; /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the extended_availability_zone.py file needs patching, download the patched file: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/dflorea/nova/grizzly/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the patched extended_availability_zone.py to the /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;cp extended_availability_zone.py /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure the file is owned by root:root. &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If&amp;amp;nbsp;extended_availability_zone.py is not owned by root, then change the file ownership: &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod root:root /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart nova-* services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/init.d/; for i in $( ls nova-* ); do sudo service $i restart; done&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Also check that nova-api is running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-api status&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Cinder software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-api cinder-scheduler&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Cinder MySQL database on 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE cinder;&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/api-paste.ini file on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
service_protocol = http&lt;br /&gt;
service_host = 192.168.220.40&lt;br /&gt;
service_port = 5000&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = cinder&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/cinder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf configuration file on each control node. '''Note:''' The default volume_group is being changed from cinder-volumes to nova-volumes. As mentioned in the Critical Reminders section, an LVM Volume Group named nova-volumes must exist on each Compute Node. &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30 &lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Initialize the Cinder database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;cinder-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Cinder services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-api restart&lt;br /&gt;
service cinder-scheduler restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Horizon Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Horizon software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y memcached libapache2-mod-wsgi openstack-dashboard&amp;lt;/pre&amp;gt; &lt;br /&gt;
Next, modify the /etc/openstack-dashboard/local_settings.py file as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;CACHES = {&lt;br /&gt;
    'default': {&lt;br /&gt;
        'BACKEND'&amp;amp;nbsp;: 'django.core.cache.backends.memcached.MemcachedCache',&lt;br /&gt;
        'LOCATION'&amp;amp;nbsp;: '[CONTROLLER_MGT_IP]:11211'&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
OPENSTACK_HOST = &amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
OPENSTACK_KEYSTONE_URL = &amp;quot;http://%s:5000/v2.0&amp;quot;&amp;amp;nbsp;% OPENSTACK_HOST&lt;br /&gt;
OPENSTACK_KEYSTONE_DEFAULT_ROLE = &amp;quot;Member&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the memcached listening address in /etc/memcached.conf. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;-l [CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Reload Apache and memcached on each control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service apache2 restart; service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Access Horizon by using the following URL in your web browser. Use '''admin/keystone_admin''' for your login credentials. &amp;amp;nbsp;If you have problems accessing Horizon by using the VIP (192.168.220.40), then try using a real IP address of a control node (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;http://192.168.220.40/horizon&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, if you would like to remove the Ubuntu theme: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get purge -y openstack-dashboard-ubuntu-theme&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Compute Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Follow these steps for compute01, compute02 and compute03 compute nodes. &lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum software packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install quantum-plugin-openvswitch quantum-plugin-openvswitch-agent quantum-dhcp-agent&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check the status of the Open vSwitch services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch status&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Open vSwitch services on each compute node if they are not running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Nodes require OVS bridges named &amp;quot;br-int&amp;quot; and &amp;quot;br-ex&amp;quot;, and that &amp;quot;br-ex&amp;quot; is associated with the Public Network interface (eth1 in our example): &lt;br /&gt;
&amp;lt;pre&amp;gt;ovs-vsctl add-br br-int&lt;br /&gt;
ovs-vsctl add-br br-ex&lt;br /&gt;
ovs-vsctl add-port br-ex eth1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the Quantum configuration file /etc/quantum/quantum.conf with the following. '''Note:''' Make sure the names in rabbit_hosts= resolve: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini with: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the database section&lt;br /&gt;
[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following under the OVS section. &amp;amp;nbsp; '''Note:''' 223:225 signifies the VLAN ID range used for tenant VLANs. Modify this range based on your deployment needs. These VLANs should be trunked to eth1 of Compute Nodes and you must create a gateway address (i.e. 192.168.223.1 for VLAN 223) on your upstream Layer-3 device. &lt;br /&gt;
&amp;lt;pre&amp;gt;[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1:223:225&lt;br /&gt;
bridge_mappings = physnet1:br-ex&lt;br /&gt;
&lt;br /&gt;
# Using Quantum Security Groups instead of Nova Security Groups&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Update the /etc/quantum/dhcp_agent.ini: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
# Required to run multiple Quantum DHCP agents&lt;br /&gt;
use_component_ext = True&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Quantum services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-plugin-openvswitch-agent restart&lt;br /&gt;
service quantum-dhcp-agent restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova Compute software package on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-compute&amp;lt;/pre&amp;gt; &lt;br /&gt;
The deployment uses config_drive instead of Nova Metadata. Install the genisoimage package used by config_drive: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y genisoimage&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that the authtoken section in the /etc/nova/api-paste.ini file includes the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 127.0.0.1&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name =&amp;amp;nbsp;%SERVICE_TENANT_NAME%&lt;br /&gt;
admin_user =&amp;amp;nbsp;%SERVICE_USER%&lt;br /&gt;
admin_password =&amp;amp;nbsp;%SERVICE_PASSWORD%&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
force_config_drive=true&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
verbose=true&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_host=192.168.220.40&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
vncserver_proxyclient_address=[COMPUTE_MGT_IP]&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
vncserver_listen=[COMPUTE_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Restart the nova-compute service on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-compute restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt; Create a credentials file so you can issue OpenStack client commands from the Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing Cinder software packages on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-volume&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
iscsi_ip_address=[COMPUTE_MGT_IP]&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Cinder services on all compute nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-volume restart&lt;br /&gt;
service tgt restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring Quantum and Deploying the First VM  ===&lt;br /&gt;
&lt;br /&gt;
Run the following commands from either a Compute Node or Controller Node. If something has to be done on a specific node it will be called out. '''Note:''' If you have an issue running any Quantum command you may need to do the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y python-pip&lt;br /&gt;
pip install -U cliff&amp;lt;/pre&amp;gt; &lt;br /&gt;
Obtain the tenant ID and create your first tenant network. Create additional networks and associated subnets as needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
quantum net-create public223 --tenant_id &amp;amp;lt;tenant-id&amp;amp;gt; --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 223&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create your first tenant subnet and associate it to the network you created in the previous step. The example below uses .10-.250 for Instance IP addresses. Modify the allocation-pool and dns_nameservers based on your deployment needs. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum subnet-create --name 223-subnet --allocation-pool start=192.168.223.10,end=192.168.223.250 public223 192.168.223.0/24 --dns_nameservers list=true 192.168.26.186&amp;lt;/pre&amp;gt; &lt;br /&gt;
If you skipped the earlier step of downloading an image and uploading it to glance, do that now: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
*'''On a Compute Node''' create an SSH keypair and add the public key to Nova. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Leave the passphrase empty when creating the keypair. You will need to to install the nova client support:&lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install python-novaclient&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;ssh-keygen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;cd ~/.ssh/&lt;br /&gt;
nova keypair-add --pub_key id_rsa.pub &amp;amp;lt;key_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova keypair-add --pub_key id_rsa.pub net-key&amp;lt;/pre&amp;gt; &lt;br /&gt;
Before booting the instance, check for the ID of the network we created earlier. Note: the &amp;amp;lt;quantum_net_id&amp;amp;gt; value will come from the output of the &amp;quot;quantum net-list&amp;quot; command: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum net-list&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name &amp;amp;lt;key_name&amp;amp;gt; --nic net-id=&amp;amp;lt;quantum_net_id&amp;amp;gt; &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name net-key --nic net-id=f9035744-72a9-42cf-bd46-73d54c0cea06 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Watch the status of the instance: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
The instance is booted completely when the OS-EXT-STS:vm_state is &amp;quot;active&amp;quot;. Make note of the IP address of the VM. Alternatively, you can watch the complete log of the VM booting by running: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova console-log --length=25 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the default Quantum Security Group to allow ingress traffic to Instances. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Security Group rules are associated to a specific tenant. The &amp;amp;lt;tenant-id&amp;amp;gt; can be found from the output of keystone tenant-list. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
This example allows all ICMP and SSH traffic: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should now be able to ping the VM as well as SSH into it from the host that you used to create the key you associated with the VM during the boot phase.&lt;/div&gt;</summary>
		<author><name>Shmcfarl</name></author>	</entry>

	<entry>
		<id>http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide</id>
		<title>COE Grizzly Release: High-Availability Manual Installation Guide</title>
		<link rel="alternate" type="text/html" href="http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide"/>
				<updated>2013-04-24T16:43:49Z</updated>
		
		<summary type="html">&lt;p&gt;Shmcfarl: /* Keystone Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
There are two common ways of installing [http://docs.openstack.org/ OpenStack], manually or by using automation tools. There is much focus on the full automation of OpenStack deployments using tools such as [http://puppetlabs.com/ Puppet], [http://www.opscode.com/chef/ Chef], [https://juju.ubuntu.com/ JuJu] and others. While these tools offer great advantages over manual configuration, they do hide the OpenStack installation and configuration details. This document can be used by those interested in learning more about the OpenStack Grizzly High-Availability (HA) installation process or for those not interested in using automation tools to deploy HA. The document covers the following OpenStack software components: &lt;br /&gt;
&lt;br /&gt;
*[http://glance.openstack.org/ Glance] (Image Service) &lt;br /&gt;
*[http://keystone.openstack.org/ Keystone] (Identity Service) &lt;br /&gt;
*[http://nova.openstack.org/ Nova] (Compute Service) &lt;br /&gt;
*[http://horizon.openstack.org/ Horizon] (OpenStack Dashboard Web User Interface) &lt;br /&gt;
*[http://docs.openstack.org/developer/quantum/ Quantum] (Network Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/cinder/ Cinder] (Block Storage Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/swift/ Swift] (Object Storage Service)&lt;br /&gt;
&lt;br /&gt;
== Dependencies  ==&lt;br /&gt;
&lt;br /&gt;
=== Critical Reminders  ===&lt;br /&gt;
&lt;br /&gt;
The most common OpenStack HA deployment issues are either incorrect configuration files or not deploying the nodes in the proper order. To save you from future troubleshooting steps, ENSURE that you deploy the nodes in the order described within the document and verify the accuracy of all configuration files. You will likely be using your own IP addressing and passwords in your setup and it is critical to ensure any variations from this guide are fully understood. &lt;br /&gt;
&lt;br /&gt;
Do not configure RAID on the hard disks of Swift Storage Nodes. Swift performs better without RAID and disk redundancy is unneeded since Swift protects the data through replication. Therefore, if a RAID Controller manages the hard disks, ensure you present each of the hard disks independently. Our example uses disk /dev/sda for the Operating System installation and disks /dev/sdb-/dev/sdf for Swift storage. Please remember to modify these definitions based on your specific deployment environment. Additional Swift considerations and tuning information can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/considerations-and-tuning.html here]. &lt;br /&gt;
&lt;br /&gt;
Compute Nodes run Cinder Volume to provide block storage services to Instances. The default Cinder driver (volume_driver=nova.volume.driver.ISCSIDriver) is an iSCSI solution that employs the use of Linux Logical Volume Manager (LVM). Therefore, you must create an LVM Volume Group either during the Ubuntu Precise installation or [http://docs.openstack.org/trunk/openstack-compute/admin/content/cinder-install.html afterwards]. The name of the LVM Volume Group must match the volume_group definition in cinder.conf. Our example uses the name nova-volumes for the LVM Volume Group and associated cinder.conf volume_group name. &lt;br /&gt;
&lt;br /&gt;
The password used in our examples is keystone_admin. Every account, service and configuration file uses this one password. You will want to change this in your setup and you certainly want to use a strong password and a different password for each account/service if this system is going into production.&lt;br /&gt;
&lt;br /&gt;
=== Operating System  ===&lt;br /&gt;
&lt;br /&gt;
The operating system used for this installation is Ubuntu 12.04 LTS (Precise). &lt;br /&gt;
&lt;br /&gt;
=== Server Requirements  ===&lt;br /&gt;
&lt;br /&gt;
Our deployment uses 13 Cisco UCS C-series servers to serve the roles of Controller, Compute, Load-Balancer and Swift Proxy/Storage. The environment scales linearly, therefore individual nodes can be added to increase capacity for any particular OpenStack service. The five distinct node types used in this document are: &lt;br /&gt;
&lt;br /&gt;
*'''3 Controller Nodes-'''&amp;amp;nbsp;Runs Nova API, Nova Conductor, Nova Consoleauth, Nova Novncproxy, Nova Scheduler, NoVNC, Quantum Server, Quantum Plugin OVS, Glance API/Registry, Keystone, Cinder API, Cinder Scheduler, OpenStack Dashboard, RabbitMQ Server, MySQL Server WSREP and Galera. &lt;br /&gt;
**Provides management functionality of the OpenStack environment.&lt;br /&gt;
&lt;br /&gt;
*'''3 Compute Nodes-'''&amp;amp;nbsp;Runs Nova Compute, Quantum OVS and DHCP Agents, Cinder Volume and TGT services. &lt;br /&gt;
**Provides the hypervisor role for running Nova instances (Virtual Machines) and presents LVM volumes for Cinder block storage.&lt;br /&gt;
&lt;br /&gt;
*'''2 Load-Balancer Nodes-'''&amp;amp;nbsp;Runs HAProxy and Keepalived to load-balance traffic across Controller and Swift Proxy clusters.&lt;br /&gt;
&lt;br /&gt;
*'''2 Swift Proxy Nodes-'''&amp;amp;nbsp;The Proxy Node is responsible for tying together users and their data within the the Swift object storage system. For each request, it will look up the location of the account, container or object in the Swift ring and route the request accordingly. The public API is also exposed by Proxy Node.&lt;br /&gt;
&lt;br /&gt;
*'''3 Swift Storage Nodes-'''&amp;amp;nbsp;Each Storage Nodes contains Swift object, container, and account services. At a very high-level, these are the servers that contain the user data and perform replication among one another to keep the system in a consistent state.&lt;br /&gt;
&lt;br /&gt;
=== Networking Requirements  ===&lt;br /&gt;
&lt;br /&gt;
The OpenStack HA environment uses five separate networks. Three of the five networks are used by Tenants. Three tenant networks are being used as an example, and thus the tenant networks can be increased or decreased based on your deployment needs. Connectivity within Tenants uses Quantum with the Open vSwitch (OVS) plugin and [http://docs.openstack.org/trunk/openstack-network/admin/content/provider_networks.html Provider Network Extensions]. Provider Network Extensions allow cloud administrators to create OpenStack networks that map directly to physical networks in the data center and support local, VLAN and GRE deployment models. Our example uses the Provider VLAN networking model. The network details are as follows: &lt;br /&gt;
&lt;br /&gt;
*'''1 Management Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used to perform management functions against the node. For example, SSH'ing to the nodes to change a configuration setting. The network is also used for lights-out management using the CIMC interface of the UCS servers. Lastly, OpenStack API's and the Horizon web dashboard is associated to this network. &lt;br /&gt;
**An IP address for each node is required for this network. If using lights-out management such as CIMC, each node will require 2 addresses from this network. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]). &lt;br /&gt;
*'''3 Tenant Networks'''&amp;lt;br&amp;gt; &lt;br /&gt;
**These networks are used to provide connectivity to Instances. Since Quantum Provider Networking Extensions are being used, it is common to give tenants direct access to a &amp;quot;public&amp;quot; network that can be used to reach the Internet. &lt;br /&gt;
**Compute Nodes will have an interface attached to this network. Since the Compute Node interfaces that attach to this network are managed by OVS, they should not contain an IP address. &lt;br /&gt;
**This network typically employs publicly routable IP addressing if external NAT'ing is not used upstream towards the Internet edge ('''Note:''' in this document all IP addressing for all interfaces comes out of various private addressing blocks). &lt;br /&gt;
*'''1 Storage Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used for providing separate connectivity between Swift Proxy and Storage Nodes. This ensures storage traffic is not interfering with Instance traffic. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]) IP addressing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''[http://docwiki.cisco.com/w/images/a/a8/Grizzly-ha-network-design-details-v1.0.png Figure 1]''' is used to help visualize the network deployment and to act as a reference for configuration steps within the document. It is highly recommend to print the diagram so it can easily be referenced throughout the installation process.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;u&amp;gt;'''Figure 1:'''&amp;lt;/u&amp;gt;'''OpenStack HA Network Design Details''' &lt;br /&gt;
&lt;br /&gt;
[[Image:Grizzly-ha-network-design-details-v1.0.png|thumb|left]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''Other Network Services'''&amp;lt;br&amp;gt; &lt;br /&gt;
**'''DNS: '''In this setup an external DNS server (192.168.26.186) is used for name resolution of OpenStack nodes and external name resolution. If DNS is not being used, the /etc/hosts file should include the following for all nodes:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 127.0.0.1	localhost&lt;br /&gt;
 192.168.220.40  control.dmz-pod2.lab		control&lt;br /&gt;
 192.168.220.41  control01.dmz-pod2.lab	        control01&lt;br /&gt;
 192.168.220.42  control02.dmz-pod2.lab  	control02&lt;br /&gt;
 192.168.220.43  control03.dmz-pod2.lab  	control03&lt;br /&gt;
 192.168.220.60  swiftproxy.dmz-pod2.lab	        swiftproxy&lt;br /&gt;
 192.168.220.61  swiftproxy01.dmz-pod2.lab	swiftproxy01&lt;br /&gt;
 192.168.220.62  swiftproxy02.dmz-pod2.lab	swiftproxy02&lt;br /&gt;
 192.168.220.51  compute01.dmz-pod2.lab          compute01&lt;br /&gt;
 192.168.220.52  compute02.dmz-pod2.lab          compute02&lt;br /&gt;
 192.168.220.53  compute03.dmz-pod2.lab          compute03&lt;br /&gt;
&lt;br /&gt;
*'''NTP: '''In this setup an external NTP server(s) is used for time synchronization. &lt;br /&gt;
*'''Physical Network Switches:''' Each node in this setup is physically attached to a Cisco Nexus switch acting as a Top-of-Rack access layer device. Trunking is configured on each interface connecting to the eth0 NIC of each node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Upstream routers/aggregation layer switches will most likely be terminating the Layer-3 VLAN interfaces. If these interfaces are deployed in a redundant fashion with a First Hop Redundancy Protocol such as HSRP or VRRP, then you should be careful of the IP addresses assigned to the physical L3 switches/routers as they may conflict with the IP address of the Quantum router's public subnet (.3 by default). For example, if you are using HSRP and you have .1 as the standby IP address, .2 as the first L3 switch IP and .3 as the second L3 switch IP, you will receive a duplicate IP address error on the second L3 switch. This can be worked around by using high-order IPs on your upstream L3 device or altering the Quantum subnet configuration at the time of creation to have an IP starting range higher than the physical switches/routers are using (i.e. .4 and higher). Our example uses an IP allocation range that starts with .10 to avoid this issue.&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
The installation of the nodes should be in the following order: &lt;br /&gt;
&lt;br /&gt;
#'''Load-Balancer Nodes-''' slb01 and slb02 &lt;br /&gt;
#'''Swift Storage Nodes-''' swift01, swift02 and swift03 &lt;br /&gt;
#'''Swift Proxy Nodes-''' swiftproxy01 and swiftproxy02 &lt;br /&gt;
#'''Controller Nodes-''' control01, control02 and control03 &lt;br /&gt;
#'''Compute Nodes- '''compute01, compute02 and compute03&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Nodes  ===&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu Precise 12.04 Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Ubuntu 12.04 (AMD 64-bit) from CD/ISO or automated install (i.e. kickstart). You can reference Section 4 in the [http://docwiki.cisco.com/wiki/OpenStack:Essex_Build_Node#Starting_the_Ubuntu_Installation Build Node Guide] if you are unfamiliar with the Ubuntu Precise installation process. Use the following networking section to configure your network adapter properties for each node. As previously mentioned in the Critical Reminders Section, make sure to create an LVM Volume Group named nova-volumes for Compute Nodes and do not configure RAID for Swift Storage Nodes. Lastly, select ssh-server as the only additional package during the Ubuntu Precise installation. &lt;br /&gt;
&lt;br /&gt;
==== Grizzly Packages  ====&lt;br /&gt;
&lt;br /&gt;
The [https://launchpad.net/~openstack-ubuntu-testing/+archive/grizzly-trunk-testing Ubuntu Testers Team] manages the repository used by this document for OpenStack Grizzly packaging. Although the repository supports Ubuntu Precise and Raring releases, the document is only based on Precise. The Ubuntu Testers PPA should be used for all OpenStack nodes (i.e. not needed for Load-Balancer nodes). &lt;br /&gt;
&lt;br /&gt;
Use sudo mode or run from root account for the entire installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the Ubuntu Grizzly repository: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install python-software-properties -y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;apt-add-repository ppa:openstack-ubuntu-testing/grizzly-trunk-testing&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' Press enter when you are prompted for “[ENTER] or cancel” when adding the PPA. Update your system: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get update&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Networking  ====&lt;br /&gt;
&lt;br /&gt;
Our implementation uses VLANs for segmentation of certain networks. Make sure the VLAN package is installed and your network switches have been configured for VLANs. Otherwise, replicate the network setup using only physical interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install vlan -y&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.81&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.82&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Proxy Node swiftproxy01 /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Proxy Node swiftproxy02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.62&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.62&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.41&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.42&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.43&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.51&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.52&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.53&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart networking: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/networking restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Time Synchronization  ====&lt;br /&gt;
&lt;br /&gt;
Install NTP: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y ntp&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add your NTP server(s) by editing /etc/ntp.conf. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; OpenStack requires that clocks be synchronized. Our example uses a '''FAKE '''server called ntp.corp.com as the NTP server. Make sure you change&amp;amp;nbsp;ntp.corp.com to your real NTP server. Lastly, make sure the NTP server name resolves. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/ntp.conf&lt;br /&gt;
&lt;br /&gt;
server ntp.corp.com&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart NTP for the changes to take effect &lt;br /&gt;
&amp;lt;pre&amp;gt;service ntp restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that you are pulling time: &lt;br /&gt;
&amp;lt;pre&amp;gt;ntpq -p&lt;br /&gt;
&lt;br /&gt;
remote           refid      st t when poll reach   delay   offset  jitter&lt;br /&gt;
==============================================================================&lt;br /&gt;
*ntp.corp.       .GPS.            1 u  185  512  377   76.035    0.053   0.033&lt;br /&gt;
 cheezum.mattnor 129.7.1.66       2 u   8d 1024    0   47.731   -0.555   0.000&lt;br /&gt;
 ntp2.rescomp.be .STEP.          16 u    - 1024    0    0.000    0.000   0.000&lt;br /&gt;
 216.45.57.38    204.123.2.5      2 u  54h 1024    0   12.607    0.808   0.000&lt;br /&gt;
 lithium.constan 128.4.1.1        2 u   8d 1024    0   69.861    0.206   0.000&lt;br /&gt;
 europium.canoni 193.79.237.14    2 u  54h 1024    0  144.040   -1.455   0.000&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load Balancer Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Perform the following steps on nodes slb01 and slb02. &lt;br /&gt;
&lt;br /&gt;
==== Keepalived &amp;amp;amp; HAProxy  ====&lt;br /&gt;
&lt;br /&gt;
Edit /etc/sysctl.conf to allow Keepalived to associate a virtual IP address (VIP) that is not directly bound to an interface on the node:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;net.ipv4.ip_nonlocal_bind=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load in sysctl settings from /etc/sysctl.conf: &lt;br /&gt;
&amp;lt;pre&amp;gt;sysctl -p&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install Keepalived and HAProxy packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keepalived haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the /var/lib/haproxy directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /var/lib/haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure /var/lib/haproxy is owned by root. Change the file ownership if needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /var/lib/haproxy/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the&amp;amp;nbsp;/etc/keepalived/keepalived.conf file for slb01 with the contents below.&amp;amp;nbsp; Change&amp;amp;nbsp;[YOUR_DOMAIN_NAME] with your actual domain name.&amp;amp;nbsp; The keepalived.conf includes the following sections:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global_defs-''' Global parameters affect the whole process behavior.&amp;amp;nbsp;There may be several 'global' sections if needed, but their parameters will only be merged. &amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_script-''' Keepalived supports a VRRP scripting framework to extend base functionality.&amp;amp;nbsp; The vrrp_script named haproxy will check the status of the haproxy service every 2 seconds and add 2 points of priority if the status is running. &amp;amp;nbsp;If the haproxy service is not running, the backup HAProxy Node will become the primary and begin passing traffic for the virtual_ipaddress(es).&amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_instance-''' Is where you define configuration paramters for virtual gateway addresses.&amp;amp;nbsp; slb01 is configured as the primary gateway for 192.168.220.40 (Controller Cluster) and the backup gateway for 192.168.220.60 (Swift Proxy Cluster). Accordingly, slb02 is configured as the primary for 192.168.220.60 and the backup for 192.168.220.40.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb01&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure /etc/keepalived/keepalived.conf for slb02 with the following contents. Change [YOUR_DOMAIN_NAME] with your actual domain name. &lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb02&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb01 with the contents below. HAProxy's configuration process involves 3 major sources of parameters:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*The arguments from the command-line, which always take precedence.&amp;lt;br&amp;gt; &lt;br /&gt;
*The &amp;quot;global&amp;quot; section, which sets process-wide parameters.&amp;lt;br&amp;gt; &lt;br /&gt;
*The proxies sections which can take form of &amp;quot;defaults&amp;quot;, &amp;quot;listen&amp;quot;, &amp;quot;frontend&amp;quot; and &amp;quot;backend&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following provides additional details of the haproxy.cfg file:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global-&amp;amp;nbsp; '''Sets process-wide parameters for load-balancing traffic.&amp;amp;nbsp; Global parameters can be overriden by server-specific configurations within the''listen section ''of the haproxy.cfg file.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''defaults-''' The &amp;quot;defaults&amp;quot; section sets default parameters for all other sections following its declaration. Those default parameters are reset by the next &amp;quot;defaults&amp;quot; section. The name is optional but its use is encouraged for better readability.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''listen-''' A &amp;quot;listen&amp;quot; section defines a complete proxy with its front-end (i.e. listening VIP) and back-end (i.e. real IP of servers)&amp;amp;nbsp;parts combined in one section. Currently two major proxy modes are supported: &amp;quot;tcp&amp;quot;, also known as layer 4 and &amp;quot;http&amp;quot;, also known as layer 7. In layer 4 mode, HAProxy simply forwards bidirectional traffic between two sides. In layer 7 mode, HAProxy analyzes the protocol and can interact with it by allowing, blocking, switching, adding, modifying, or removing arbitrary content in requests or responses based on configurable criteria.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
 chroot  /var/lib/haproxy&lt;br /&gt;
 daemon  &lt;br /&gt;
 group  haproxy&lt;br /&gt;
 log  192.168.220.81 local0&lt;br /&gt;
 maxconn  4000&lt;br /&gt;
 pidfile  /var/run/haproxy.pid&lt;br /&gt;
 user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
 log  global&lt;br /&gt;
 maxconn  8000&lt;br /&gt;
 option  redispatch&lt;br /&gt;
 retries  3&lt;br /&gt;
 timeout  http-request 10s&lt;br /&gt;
 timeout  queue 1m&lt;br /&gt;
 timeout  connect 10s&lt;br /&gt;
 timeout  client 1m&lt;br /&gt;
 timeout  server 1m&lt;br /&gt;
 timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
 bind 192.168.220.40:80&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
 bind 192.168.220.40:3306&lt;br /&gt;
 balance  source&lt;br /&gt;
 mode  tcp&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9292&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
 bind 192.168.220.40:9191&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
 bind 192.168.220.40:35357&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
 bind 192.168.220.40:5000&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
 bind 192.168.220.40:11211&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
 bind 192.168.220.40:8773&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
 bind 192.168.220.40:8774&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
 bind 192.168.220.40:8775&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
 bind 192.168.220.40:8776&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
 bind 192.168.220.40:6080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9696&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
 bind 192.168.220.60:8080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb02 with the contents below. &lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
  chroot  /var/lib/haproxy&lt;br /&gt;
  daemon  &lt;br /&gt;
  group  haproxy&lt;br /&gt;
  log  192.168.220.82 local0&lt;br /&gt;
  maxconn  4000&lt;br /&gt;
  pidfile  /var/run/haproxy.pid&lt;br /&gt;
  user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
  log  global&lt;br /&gt;
  maxconn  8000&lt;br /&gt;
  option  redispatch&lt;br /&gt;
  retries  3&lt;br /&gt;
  timeout  http-request 10s&lt;br /&gt;
  timeout  queue 1m&lt;br /&gt;
  timeout  connect 10s&lt;br /&gt;
  timeout  client 1m&lt;br /&gt;
  timeout  server 1m&lt;br /&gt;
  timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
  bind 192.168.220.40:80&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
  bind 192.168.220.40:3306&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9292&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
  bind 192.168.220.40:9191&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
  bind 192.168.220.40:35357&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
  bind 192.168.220.40:5000&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
  bind 192.168.220.40:11211&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
  bind 192.168.220.40:8773&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
  bind 192.168.220.40:8774&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
  bind 192.168.220.40:8775&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
  bind 192.168.220.40:8776&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
  bind 192.168.220.40:6080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
  bind 192.168.220.40:9696&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  option  httpchk&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
  bind 192.168.220.60:8080&lt;br /&gt;
  balance  source&lt;br /&gt;
  option  tcplog&lt;br /&gt;
  option  tcpka&lt;br /&gt;
  server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
  server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set &amp;quot;ENABLED&amp;quot; to &amp;quot;1&amp;quot; in /etc/default/haproxy &lt;br /&gt;
&amp;lt;pre&amp;gt;ENABLED=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keepalived and HAProxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/keepalived restart&lt;br /&gt;
/etc/init.d/haproxy restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Swift Nodes&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Install Swift and other basic packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift openssh-server rsync memcached python-netifaces python-xattr python-memcache &amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir -p /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Swift configuration file. '''Note:''' This file should be identical on all Swift nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/swift.conf&lt;br /&gt;
&lt;br /&gt;
[swift-hash]&lt;br /&gt;
swift_hash_path_suffix = Gdr8ny7YyWqy2&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the Swift directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift/&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Storage Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Run these commands on nodes swift01, swift02 and swift03. Install the Swift Storage Node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-account swift-container swift-object xfsprogs parted&amp;lt;/pre&amp;gt; &lt;br /&gt;
For each of the hard disks other than the Ubuntu installation disk (i.e. /dev/sda), create an XFS volume with a single partition. Our example uses five hard disks (/dev/sdb - /dev/sdf) per Storage Node. Repeat this step for each disk that will be used for Swift storage: &lt;br /&gt;
&amp;lt;pre&amp;gt;parted /dev/sdb mklabel msdos&lt;br /&gt;
parted -a optimal /dev/sdb mkpart primary ext2 0% 100%&lt;br /&gt;
mkfs.xfs -i size=1024 /dev/sdb1&lt;br /&gt;
echo &amp;quot;/dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0&amp;quot; &amp;amp;gt;&amp;amp;gt; /etc/fstab&lt;br /&gt;
mkdir -p /srv/node/sdb1&lt;br /&gt;
mount /srv/node/sdb1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the ownership of the mount directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /srv/node&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create an Rsync configuration file on each Storage Node. In the following example, replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/rsyncd.conf&lt;br /&gt;
&lt;br /&gt;
uid = swift&lt;br /&gt;
gid = swift&lt;br /&gt;
log file = /var/log/rsyncd.log&lt;br /&gt;
pid file = /var/run/rsyncd.pid&lt;br /&gt;
address = [STORAGE_NET_IP]&lt;br /&gt;
&lt;br /&gt;
[account]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/account.lock&lt;br /&gt;
&lt;br /&gt;
[container]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/container.lock&lt;br /&gt;
&lt;br /&gt;
[object]&lt;br /&gt;
max connections = 2&lt;br /&gt;
path = /srv/node/&lt;br /&gt;
read only = false&lt;br /&gt;
lock file = /var/lock/object.lock&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following line in /etc/default/rsync: &lt;br /&gt;
&amp;lt;pre&amp;gt;RSYNC_ENABLE = true&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start rsync daemon: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rsync start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/account-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/account-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = account-server&lt;br /&gt;
&lt;br /&gt;
[app:account-server]&lt;br /&gt;
use = egg:swift#account&lt;br /&gt;
&lt;br /&gt;
[account-replicator]&lt;br /&gt;
&lt;br /&gt;
[account-auditor]&lt;br /&gt;
&lt;br /&gt;
[account-reaper]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /etc/swift/container-server.conf with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71): &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/container-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = container-server&lt;br /&gt;
&lt;br /&gt;
[app:container-server]&lt;br /&gt;
use = egg:swift#container&lt;br /&gt;
&lt;br /&gt;
[container-replicator]&lt;br /&gt;
&lt;br /&gt;
[container-updater]&lt;br /&gt;
&lt;br /&gt;
[container-auditor]&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Create /etc/swift/object-server.conf&amp;amp;nbsp;with the following contents. Replace [STORAGE_NET_IP] with the node's storage network IP address (i.e. swift01 = 192.168.222.71):&lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/swift/object-server.conf&lt;br /&gt;
&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
bind_ip = [STORAGE_NET_IP]&lt;br /&gt;
workers = 2&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = object-server&lt;br /&gt;
&lt;br /&gt;
[app:object-server]&lt;br /&gt;
use = egg:swift#object&lt;br /&gt;
&lt;br /&gt;
[object-replicator]&lt;br /&gt;
&lt;br /&gt;
[object-updater]&lt;br /&gt;
&lt;br /&gt;
[object-auditor]&lt;br /&gt;
&lt;br /&gt;
[object-expirer]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the storage services. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; At this point, the ring files will not be present on the storage nodes. This will cause the *-replicator services to fail to start properly. After you create the ring files on the first proxy node (in the next section) and distribute them to the storage nodes, a service restart should allow all Swift services to start properly. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init object-server start&lt;br /&gt;
swift-init object-replicator start&lt;br /&gt;
swift-init object-updater start&lt;br /&gt;
swift-init object-auditor start&lt;br /&gt;
swift-init container-server start&lt;br /&gt;
swift-init container-replicator start&lt;br /&gt;
swift-init container-updater start&lt;br /&gt;
swift-init container-auditor start&lt;br /&gt;
swift-init account-server start&lt;br /&gt;
swift-init account-replicator start&lt;br /&gt;
swift-init account-auditor start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height: 1.5em;&amp;quot;&amp;gt;Make sure you repeat these steps for every Storage Node.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Swift Proxy Node Installation Steps  ===&lt;br /&gt;
&lt;br /&gt;
Ensure you have completed the previous steps in the &amp;quot;General Installation Steps for All Swift Nodes&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
Perform these steps on nodes swiftproxy01 and swiftproxy02. First, install the proxy node packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y swift-proxy memcached python-keystoneclient python-swiftclient swift-plugin-s3&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify memcached to bind to the storage network interface (192.168.222.x in our example). Edit the following line in /etc/memcached.conf, changing: &lt;br /&gt;
&amp;lt;pre&amp;gt;-l 127.0.0.1 &lt;br /&gt;
to&lt;br /&gt;
-l [STORAGE_NET_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the memcached server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
If it does not exist, create the /etc/swift/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /etc/swift/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure the directory the /etc/swift and the /var/cache/swift directories are owned by the swift user and group: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown swift:swift /etc/swift/&lt;br /&gt;
chown -R swift:swift /var/cache/swift/&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create /etc/swift/proxy-server.conf with the following contents: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_port = 8080&lt;br /&gt;
workers = 32&lt;br /&gt;
user = swift&lt;br /&gt;
&lt;br /&gt;
[pipeline:main]&lt;br /&gt;
pipeline = catch_errors healthcheck cache ratelimit authtoken keystoneauth proxy-server&lt;br /&gt;
&lt;br /&gt;
[app:proxy-server]&lt;br /&gt;
use = egg:swift#proxy&lt;br /&gt;
allow_account_management = true&lt;br /&gt;
account_autocreate = true&lt;br /&gt;
&lt;br /&gt;
[filter:keystoneauth]&lt;br /&gt;
use = egg:swift#keystoneauth&lt;br /&gt;
operator_roles = Member,admin, swiftoperator&lt;br /&gt;
&lt;br /&gt;
[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
signing_dir = /var/cache/swift&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
auth_uri = http://192.168.220.40:5000&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = swift&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
delay_auth_decision = 10&lt;br /&gt;
&lt;br /&gt;
[filter:cache]&lt;br /&gt;
use = egg:swift#memcache&lt;br /&gt;
memcache_servers = 192.168.222.61:11211,192.168.222.62:11211&lt;br /&gt;
&lt;br /&gt;
[filter:catch_errors]&lt;br /&gt;
use = egg:swift#catch_errors&lt;br /&gt;
&lt;br /&gt;
[filter:healthcheck]&lt;br /&gt;
use = egg:swift#healthcheck&lt;br /&gt;
&lt;br /&gt;
[filter:ratelimit]&lt;br /&gt;
use = egg:swift#ratelimit&lt;br /&gt;
clock_accuracy = 1000&lt;br /&gt;
max_sleep_time_seconds = 60&lt;br /&gt;
log_sleep_time_seconds = 0&lt;br /&gt;
rate_buffer_seconds = 5&lt;br /&gt;
account_ratelimit = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, create the account, container and object rings. The builder command is basically creating a builder file with a few parameters. The parameter with the value of 18 represents 2 ^ 18th, this is the value of the partition size. Set this “partition power” value based on the total amount of storage you expect your entire ring to use. The value of 3 represents the number of replicas of each object, with the last value being the number of hours to restrict moving a partition more than once. Additional information regarding Swift ring preperation can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/preparing-the-ring.html here]. &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/swift&lt;br /&gt;
&lt;br /&gt;
swift-ring-builder account.builder create 18 3 1&lt;br /&gt;
swift-ring-builder container.builder create 18 3 1&lt;br /&gt;
swift-ring-builder object.builder create 18 3 1&amp;lt;/pre&amp;gt; &lt;br /&gt;
On swiftproxy01, for every storage device on each storage node add entries to each ring. This example prepares the account, container and object rings for storage node swift01 (192.168.222.71) with a partition in zone 1. The mount point of this partition is /srv/node/sdb1 and the path in rsyncd.conf is /srv/node/, the DEVICE would be sdb1 and the commands would look like: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder add z1-192.168.222.71:6002/sdb1 100&lt;br /&gt;
swift-ring-builder container.builder add z1-192.168.222.71:6001/sdb1 100&lt;br /&gt;
swift-ring-builder object.builder add z1-192.168.222.71:6000/sdb1 100&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Make sure not to place all devices in the same zone (i.e. z1). It is recommended to configure the zones as high-level as possible to create the greatest amount of isolation. Some considerations can include physical location, power availability, and network connectivity. For example, in a small cluster you might decide to split the zones up by cabinet, with each cabinet having its own power and network connectivity. Since our deployment only uses 3 storage nodes, each node should be in its own zone. However, it is recommended to have a minimum of 5 zones in a production-level Swift deployment. &lt;br /&gt;
&lt;br /&gt;
Verify the ring contents for each ring: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
swift-ring-builder /etc/swift/container.builder&lt;br /&gt;
swift-ring-builder /etc/swift/object.builder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Your output should look similar to this: &lt;br /&gt;
&amp;lt;pre&amp;gt;root@swiftproxy01:~# swift-ring-builder /etc/swift/account.builder&lt;br /&gt;
/etc/swift/account.builder, build version 15&lt;br /&gt;
262144 partitions, 3 replicas, 3 zones, 15 devices, 0.00 balance&lt;br /&gt;
The minimum number of hours before a partition can be reassigned is 1&lt;br /&gt;
Devices:    id  zone      ip address  port      name weight partitions balance meta&lt;br /&gt;
             0     3  192.168.222.73  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
             1     2  192.168.222.72  6002      sdd1   1.00      52429    0.00 &lt;br /&gt;
             2     3  192.168.222.73  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             3     2  192.168.222.72  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             4     3  192.168.222.73  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             5     1  192.168.222.71  6002      sdb1   1.00      52429    0.00 &lt;br /&gt;
             6     1  192.168.222.71  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
             7     2  192.168.222.72  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
             8     1  192.168.222.71  6002      sdd1   1.00      52428   -0.00 &lt;br /&gt;
             9     2  192.168.222.72  6002      sdc1   1.00      52429    0.00 &lt;br /&gt;
            10     1  192.168.222.71  6002      sde1   1.00      52429    0.00 &lt;br /&gt;
            11     1  192.168.222.71  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            12     3  192.168.222.73  6002      sdf1   1.00      52429    0.00 &lt;br /&gt;
            13     2  192.168.222.72  6002      sde1   1.00      52428   -0.00 &lt;br /&gt;
            14     3  192.168.222.73  6002      sdd1   1.00      52428   -0.00&amp;lt;/pre&amp;gt; &lt;br /&gt;
Repeat the command, but replace account with object and container to verify the contents of the others two Swift rings. &lt;br /&gt;
&lt;br /&gt;
Rebalance the rings. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Rebalancing rings can take a while. You may get a message about a balance value and that you need to rebalance/push after the minimum 1 hour. If so, recheck the status after an hour. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-ring-builder account.builder rebalance&lt;br /&gt;
swift-ring-builder container.builder rebalance&lt;br /&gt;
swift-ring-builder object.builder rebalance&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the account.ring.gz, container.ring.gz, and object.ring.gz files to swiftproxy02 and the 3 storage nodes in /etc/swift. &lt;br /&gt;
&lt;br /&gt;
Make sure all the config files are owned by the swift user: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown -R swift:swift /etc/swift&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Proxy services: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift-init proxy start&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verify the Swift Installation  ===&lt;br /&gt;
&lt;br /&gt;
You can run verification commands from the proxy server or any server with access to Keystone. Keep in mind that proxy nodes are configured to use Keystone for user authentication. As a result, you '''MUST''' complete the Controller Node Installation steps and ensure Keystone is operational before proceeding with Swift verification. &lt;br /&gt;
&lt;br /&gt;
Verify that you can successfully authenticate against Keystone using the Swift authentication credentials: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y curl&lt;br /&gt;
&lt;br /&gt;
curl -s -d &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should receive output similar to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;{&amp;quot;access&amp;quot;: {&amp;quot;token&amp;quot;: {&amp;quot;issued_at&amp;quot;: &amp;quot;2013-04-02T14:55:31.149327&amp;quot;, &amp;quot;expires&amp;quot;: &amp;quot;2013-04-03T14:55:31Z&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;bb29ef5439ce4a75bf85332bbadf6538&amp;quot;, &amp;quot;tenant&amp;quot;: {&amp;quot;description&amp;quot;: &lt;br /&gt;
null, &amp;quot;enabled&amp;quot;: true, &amp;quot;id&amp;quot;: &amp;quot;b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;services&amp;quot;}}, &amp;quot;serviceCatalog&amp;quot;: [{&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;45a336cb74e04e11ab95c0ea28b699d6&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8774/v2/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;compute&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;nova&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;, &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;259fef5e66814f47ac1934d3cf522a3d&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9696/&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;network&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;quantum&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [&lt;br /&gt;
{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;166de3790eb54c31a58237fe9ea3d301&amp;quot;, &lt;br /&gt;
&amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:9292/v2&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;image&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;glance&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;&lt;br /&gt;
, &amp;quot;id&amp;quot;: &amp;quot;0a2c69157d5948a9ae8ecee5c65a6d2b&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8776/v1/b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;volume&amp;quot;, &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;cinder&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Admin&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &lt;br /&gt;
&amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;05f85b8aacbd4c87b680dcc2fb6da539&amp;quot;, &amp;quot;publicURL&amp;quot;: &amp;quot;http://192.168.220.40:8773/services/Cloud&amp;quot;}], &lt;br /&gt;
&amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;ec2&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;ec2&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &amp;quot;http://192.168.220.60:8080/v1&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;4a1af526137341c0a682eb573101ddde&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.60:8080/v1/AUTH_b38d88aad6314870b746e7d60808e59a&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;object-store&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, {&amp;quot;endpoints&amp;quot;: [{&amp;quot;adminURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;, &amp;quot;region&amp;quot;: &amp;quot;RegionOne&amp;quot;, &amp;quot;internalURL&amp;quot;: &amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;3e3f7b50b5bd44b7a15b3e4ae55086bf&amp;quot;, &amp;quot;publicURL&amp;quot;: &lt;br /&gt;
&amp;quot;http://192.168.220.40:5000/v2.0&amp;quot;}], &amp;quot;endpoints_links&amp;quot;: [], &amp;quot;type&amp;quot;: &amp;quot;identity&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;keystone&amp;quot;}], &amp;quot;user&amp;quot;: {&amp;quot;username&amp;quot;: &amp;quot;swift&amp;quot;, &amp;quot;roles_links&amp;quot;: [], &amp;quot;id&amp;quot;: &lt;br /&gt;
&amp;quot;ed69664ac78a4b65a36d63da6b760863&amp;quot;, &amp;quot;roles&amp;quot;: [{&amp;quot;name&amp;quot;: &amp;quot;_member_&amp;quot;}, {&amp;quot;name&amp;quot;: &amp;quot;admin&amp;quot;}], &amp;quot;name&amp;quot;: &amp;quot;swift&amp;quot;}, &amp;quot;metadata&amp;quot;: {&amp;quot;is_admin&amp;quot;: 0, &amp;quot;roles&amp;quot;: [&lt;br /&gt;
&amp;quot;9fe2ff9ee4384b1894a90878d3e92bab&amp;quot;, &amp;quot;6a553ae3be3c4f8c8fe079830d4102a5&amp;quot;]}}}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Use the swift client stat command to make sure you can view the contents of the ring.&amp;amp;nbsp;You can run these commands from the proxy server or any server with the swift client and access to Keystone. &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U admin:admin -K keystone_admin stat&lt;br /&gt;
   Account: AUTH_3eccdb2a9331419c96ac9ff336110b65&lt;br /&gt;
Containers: 1&lt;br /&gt;
   Objects: 2&lt;br /&gt;
     Bytes: 0&lt;br /&gt;
Accept-Ranges: bytes&lt;br /&gt;
X-Timestamp: 1363989109.30329&lt;br /&gt;
X-Trans-Id: tx147dd9983ac54af1b71c5a561ae2aa9a&lt;br /&gt;
Content-Type: text/plain; charset=utf-8&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can see that 1 container exists. &amp;amp;nbsp;Now, lets find out the name of the container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list&lt;br /&gt;
glance&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The glance container is created after the Controller cluster is built and an image has been uploaded to Glance. &lt;br /&gt;
&lt;br /&gt;
List the contents of the Glance container: &lt;br /&gt;
&amp;lt;pre&amp;gt;swift -V 2 -A http://192.168.220.40:5000/v2.0/ -V 2 -U services:swift -K keystone_admin list glance&lt;br /&gt;
24164630-ba2f-436a-8bc6-43975717d5e5&lt;br /&gt;
858a11dc-ed61-4a18-a778-eabcb454ae45&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Controller Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Runs these commands on nodes control01, control02 and control03. &amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install MySQL and Galera dependencies: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y libaio1 libssl0.9.8 mysql-client-5.5 python-mysqldb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download MySQL-WSREP and Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget -O /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb http://launchpad.net/codership-mysql/5.5/5.5.23-23.6/+download/mysql-server-wsrep-5.5.23-23.6-amd64.deb --no-check-certificate&lt;br /&gt;
wget -O /tmp/galera-23.2.1-amd64.deb http://launchpad.net/galera/2.x/23.2.1/+download/galera-23.2.1-amd64.deb --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install MySQL and Galera. '''Note:''' If you are prompted to create a root password during the Galera package installation, please make note of the password you use as it will be needed when connecting to MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;dpkg -i /tmp/mysql-server-wsrep-5.5.23-23.6-amd64.deb&lt;br /&gt;
dpkg -i /tmp/galera-23.2.1-amd64.deb&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the MySQL bind address: &lt;br /&gt;
&amp;lt;pre&amp;gt;sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the following line to /etc/rc.local on all controllers to allow MySQL to start automatically upon reboot: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.41&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.42&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the default /etc/mysql/conf.d/wsrep.cnf file for control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;bind-address=192.168.220.43&lt;br /&gt;
wsrep_provider=/usr/lib/galera/libgalera_smm.so&lt;br /&gt;
wsrep_cluster_name=&amp;quot;controller_cluster&amp;quot;&lt;br /&gt;
wsrep_cluster_address=&amp;quot;gcomm://192.168.220.41&amp;quot;&lt;br /&gt;
wsrep_sst_method=rsync&lt;br /&gt;
wsrep_sst_auth=wsrep_sst:password&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt;It is important to understand the [http://www.codership.com/wiki/doku.php?id=mysql_options_0.8 gcomm address] concept behind [http://www.codership.com/ Galera]. Only use an empty gcomm:// address when you create a NEW cluster. Never use it when your intention is to reconnect to an existing one. After the Galera cluster is established, you should change the gcomm address on control01 from gcomm:// to gcomm://192.168.220.42 or gcomm://192.168.220.43. Otherwise, control01 will not join the cluster upon reboot. Make sure to also restart the mysql service when making changes to any of the associated configuration files. &lt;br /&gt;
&lt;br /&gt;
Restart MySQL: &lt;br /&gt;
&amp;lt;pre&amp;gt;service mysql restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the Galera cluster has been established. The value should show 4 for all nodes in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | Variable_name      | Value |&lt;br /&gt;
  +------------------------+---+&lt;br /&gt;
  | wsrep_local_state  |    4  |&lt;br /&gt;
  +------------------------+---+&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MySQL WSREP and Galera Monitoring  ====&lt;br /&gt;
Complete each of the steps below on each control node except for when a single node is specified.&lt;br /&gt;
&lt;br /&gt;
Install xinetd: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y xinetd&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the mysqlchk service: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/mysqlchk -P /etc/xinetd.d/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' After functional testing is complete, it's recommended to secure the mysqlchk service. This can be accomplished by editing the only_from and per_source values in /etc/xinetd.d/ to the subnet used by the load-balancer nodes. &lt;br /&gt;
&lt;br /&gt;
Edit /etc/xinetd.d/mysqlchk by changing &amp;amp;lt;%= mysqlchk_script_dir&amp;amp;nbsp;%&amp;amp;gt;/galera_chk to the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure root is the file owner: &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
If not, change the file permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /etc/xinetd.d/mysqlchk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the mysqlcheck service to /etc/services by adding the following line: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysqlchk        9200/tcp                        # MySQL Galera health check script&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the MySQL Galera health check script: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/CiscoSystems/puppet-mysql/folsom_ha/templates/galera_chk -P /usr/local/bin/ --no-check-certificate&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the file ownership and permissions: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /usr/local/bin/galera_chk &lt;br /&gt;
chmod +x  /usr/local/bin/galera_chk&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit /usr/local/bin/galera_chk as follows. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41). &lt;br /&gt;
&amp;lt;pre&amp;gt;MYSQL_HOST=&amp;quot;[CONTROLLER_MGT_IP]&amp;quot;&lt;br /&gt;
MYSQL_PORT=&amp;quot;3306&amp;quot;&lt;br /&gt;
MYSQL_USERNAME=&amp;quot;mysqlchk_user&amp;quot;&lt;br /&gt;
MYSQL_PASSWORD=&amp;quot;mysqlchk_password&amp;quot;&lt;br /&gt;
MYSQL_OPTS=&amp;quot;-N -q -A&amp;quot;&lt;br /&gt;
TMP_FILE=&amp;quot;/dev/shm/mysqlchk.$$.out&amp;quot;&lt;br /&gt;
ERR_FILE=&amp;quot;/dev/shm/mysqlchk.$$.err&amp;quot;&lt;br /&gt;
FORCE_FAIL=&amp;quot;/dev/shm/proxyoff&amp;quot;&lt;br /&gt;
MYSQL_BIN=&amp;quot;/usr/bin/mysql&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart xinetsd: &lt;br /&gt;
&amp;lt;pre&amp;gt;service xinetd restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Connect to MySQL and add the mysqlchk user to each controller in the cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
use mysql;&lt;br /&gt;
INSERT INTO user (Host,User,Password) VALUES('%','mysqlchk_user',PASSWORD('mysqlchk_password'));&lt;br /&gt;
flush privileges;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Grant privileges for the mysqlchk user. Change [CONTROLLER_MGT_IP] to the Management IP address for each controller node (i.e. control01 = 192.168.220.41).: &lt;br /&gt;
&amp;lt;pre&amp;gt;grant SUPER,PROCESS on *.* to 'mysqlchk_user'@'[CONTROLLER_MGT_IP]' IDENTIFIED BY 'mysqlchk_password';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the operational status of the MySQL Galera health check service. From slb01 or slb02, Telnet using port 9200 (health check port) and make sure you get a &amp;quot;MySQL is running&amp;quot; message: &lt;br /&gt;
&amp;lt;pre&amp;gt;telnet 192.168.220.41 9200&lt;br /&gt;
Trying 192.168.220.41...&lt;br /&gt;
Connected to 192.168.220.41.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Content-Type: text/html&lt;br /&gt;
Content-Length: 43&lt;br /&gt;
&amp;amp;lt;html&amp;amp;gt;&amp;amp;lt;body&amp;amp;gt;MySQL is running.&amp;amp;lt;/body&amp;amp;gt;&amp;amp;lt;/html&amp;amp;gt;&lt;br /&gt;
Connection closed by foreign host.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Repeat the previous step for each control node. &lt;br /&gt;
&lt;br /&gt;
Verify that you can access the MySQL database by using the Virtual IP address (VIP) of the Galera cluster: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -umysqlchk_user -pmysqlchk_password -h192.168.220.40&amp;lt;/pre&amp;gt; &lt;br /&gt;
For informational purposes, this is the command used by the health check script. This example is for control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql -N -q -A --host=192.168.220.41 --user=mysqlchk_user --password=mysqlchk_password -e &amp;quot;show global status where variable_name='wsrep_local_state';&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== RabbitMQ Installation  ====&lt;br /&gt;
Complete each of the following steps on each control node unless a specific node is called out.&lt;br /&gt;
&lt;br /&gt;
Install RabbitMQ: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y rabbitmq-server&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure RabbitMQ Clustering. First, stop the service and remove the mnesia database on all control nodes. &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server stop&lt;br /&gt;
rm -rf /var/lib/rabbitmq/mnesia&amp;lt;/pre&amp;gt; &lt;br /&gt;
Clustering requires that the nodes have the same Erlang cookie. Copy the Erlang cookie from control01 to control02 and control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.42:/var/lib/rabbitmq/.erlang.cookie&lt;br /&gt;
scp /var/lib/rabbitmq/.erlang.cookie localadmin@192.168.220.43:/var/lib/rabbitmq/.erlang.cookie&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; The above command requires root login (disabled by default in Ubuntu). If you do not have root permissions, copy the Erlang cookie from /var/lib/rabbitmq/ to the /tmp directory of control02 and control03 and then to /var/lib/rabbitmq/. Also, make sure the file permissions match on all 3 nodes. &lt;br /&gt;
&lt;br /&gt;
Now that all 3 control nodes have the same Erlang cookie, make sure that RabbitMQ will start: &lt;br /&gt;
&amp;lt;pre&amp;gt;service rabbitmq-server start&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' If RabbitMQ does not successfully start, do not proceed with clustering.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Clustering can be configured using rabbitmqctl commands or by modifying the RabbitMQ configuration file. Our example uses the rabbitmqctl commands since issues were experienced using the configuration file with RabbitMQ 2.7.1. You can see both approaches to configuring RabbitMQ clustering [http://www.rabbitmq.com/clustering.html#setup here]. &lt;br /&gt;
&lt;br /&gt;
In order to cluster the three control nodes, two of the nodes (i.e. rabbit@control2 and rabbit@control03) will be configured to join the cluster of the third node (rabbit@control01). '''Note:''' Joining a cluster implicitly resets the node, thus removing all resources and data that were previously present on that node. &lt;br /&gt;
&lt;br /&gt;
From control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control02 is now clustered with control01: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control02 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
From control03: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl stop_app&lt;br /&gt;
rabbitmqctl cluster rabbit@control01&lt;br /&gt;
rabbitmqctl start_app&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that control03 is now clustered with control01 and control02: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl cluster_status&lt;br /&gt;
&lt;br /&gt;
Cluster status of node rabbit@control03 ...&lt;br /&gt;
[{nodes,[{disc,[rabbit@control01,rabbit@control02,rabbit@control03]}]},&lt;br /&gt;
 {running_nodes,[rabbit@control01,rabbit@control02,rabbit@control03]},&lt;br /&gt;
 {partitions,[]}]&lt;br /&gt;
...done.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Now that clustering is complete, secure RabbitMQ by removing the default (guest) user: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl delete_user guest&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a RabbitMQ user account that will be used by OpenStack services: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl add_user openstack_rabbit_user openstack_rabbit_password&amp;lt;/pre&amp;gt; &lt;br /&gt;
Set the permissions for the new RabbitMQ user account: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl set_permissions -p / openstack_rabbit_user &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot; &amp;quot;.*&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify the user settings: &lt;br /&gt;
&amp;lt;pre&amp;gt;rabbitmqctl list_users&lt;br /&gt;
rabbitmqctl list_user_permissions openstack_rabbit_user&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Keystone Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Keystone on every control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keystone python-keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Remove the sqllite db: &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/keystone/keystone.db&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Keystone. The database needs to be created on only 1 control node. &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE keystone;&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'%' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
GRANT ALL ON keystone.* TO 'keystone_admin'@'localhost' IDENTIFIED BY 'keystone_db_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' From other controllers in the cluster, you can see that databases are replicated by Galera: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -e &amp;quot;show databases;&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/keystone/keystone.conf file on each controller. Change [CONTROLLER_MGT_IP] to the management IP address of the control node (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
admin_token = keystone_admin_token&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
&lt;br /&gt;
[sql]&lt;br /&gt;
connection = mysql://keystone_admin:keystone_db_pass@192.168.220.40/keystone&lt;br /&gt;
&lt;br /&gt;
[ssl]&lt;br /&gt;
enable = False&lt;br /&gt;
&lt;br /&gt;
[signing]&lt;br /&gt;
token_format = UUID&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a credential file and load it so credentials are not required for every OpenStack client command. '''Note:''' This needs to be created on each node that you will run OpenStack commands from: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that MySQL is listening on the VIP for the Keystone database. If you have any problems connecting to the VIP, try the real IP address of a control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql -h192.168.220.40 -ukeystone_admin -pkeystone_db_pass keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Keystone: &lt;br /&gt;
&amp;lt;pre&amp;gt;service keystone restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh Keystone data script](Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;ADMIN_PASSWORD=${ADMIN_PASSWORD:-keystone_admin}&lt;br /&gt;
export SERVICE_TOKEN=&amp;quot;keystone_admin_token&amp;quot;&lt;br /&gt;
export SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0/&amp;quot;&lt;br /&gt;
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-services}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with data (users, tenants, services). '''Note:''' If you see a long timeout and errors about &amp;quot;connection timeout&amp;quot;, it may be related to your proxy setting. Remove the export of your http/https proxies and re-run the script. You will have to re-add your proxies for any other external downloads. &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-data.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the [https://github.com/EmilienM/openstack-folsom-guide/blob/master/scripts/keystone-endpoints.sh Keystone endpoint script] (Provided by Emilien Macchi): &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/EmilienM/openstack-folsom-guide/master/scripts/keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following fields in the script: &lt;br /&gt;
&amp;lt;pre&amp;gt;# MySQL definitions&lt;br /&gt;
MYSQL_USER=keystone_admin&lt;br /&gt;
MYSQL_DATABASE=keystone&lt;br /&gt;
MYSQL_HOST=192.168.220.40&lt;br /&gt;
MYSQL_PASSWORD=keystone_db_pass&lt;br /&gt;
&lt;br /&gt;
# Keystone definitions&lt;br /&gt;
KEYSTONE_REGION=RegionOne&lt;br /&gt;
SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
SERVICE_ENDPOINT=&amp;quot;http://192.168.220.40:35357/v2.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# other definitions&lt;br /&gt;
MASTER=&amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
SWIFT_MASTER=&amp;quot;192.168.220.60&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the file permissions &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod +x keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Run the script to populate the Keystone database with service endpoints. Again, if you are using proxies then you will need remove them from your export before running this command: &lt;br /&gt;
&amp;lt;pre&amp;gt;./keystone-endpoints.sh&amp;lt;/pre&amp;gt; &lt;br /&gt;
Test connectivity to Keystone by using a curl request&amp;amp;nbsp;: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install curl openssl -y&lt;br /&gt;
&lt;br /&gt;
curl -d '{&amp;quot;auth&amp;quot;: {&amp;quot;tenantName&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;passwordCredentials&amp;quot;:{&amp;quot;username&amp;quot;: &amp;quot;admin&amp;quot;, &amp;quot;password&amp;quot;: &amp;quot;keystone_admin&amp;quot;}}}' -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens | python -mjson.tool&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the above command is successful, you will receive output that includes a token and a list of service endpoints.&amp;amp;nbsp;You may also want to verify the other service account credentials: &lt;br /&gt;
&lt;br /&gt;
'''Glance''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;glance\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Nova''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;nova\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Swift''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;swift\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Quantum''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;quantum\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Cinder''' &lt;br /&gt;
&amp;lt;pre&amp;gt;curl -s -d  &amp;quot;{\&amp;quot;auth\&amp;quot;:{\&amp;quot;passwordCredentials\&amp;quot;: {\&amp;quot;username\&amp;quot;: \&amp;quot;cinder\&amp;quot;, \&amp;quot;password\&amp;quot;: \&amp;quot;keystone_admin\&amp;quot;}, \&amp;quot;tenantName\&amp;quot;: \&amp;quot;services\&amp;quot;}}&amp;quot; -H &amp;quot;Content-type: application/json&amp;quot; http://192.168.220.40:35357/v2.0/tokens&amp;lt;/pre&amp;gt; &lt;br /&gt;
You can also use the Keystone client to verify the configuration: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
keystone user-list&lt;br /&gt;
keystone role-list&lt;br /&gt;
keystone service-list&lt;br /&gt;
keystone endpoint-list&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Glance Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Glance API and Registry packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y glance-api glance-registry&amp;lt;/pre&amp;gt; &lt;br /&gt;
Delete the glance.sqlite file created in the /var/lib/glance/ directory &lt;br /&gt;
&amp;lt;pre&amp;gt;rm /var/lib/glance/glance.sqlite&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create a MySQL database for Glance on only 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE glance;&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
GRANT ALL ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-api.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41). Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
default_store = swift&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
registry_host = 192.168.220.40&lt;br /&gt;
swift_store_auth_address = http://192.168.220.40:5000/v2.0/&lt;br /&gt;
swift_store_user = services:swift&lt;br /&gt;
swift_store_key = keystone_admin&lt;br /&gt;
swift_store_container = glance&lt;br /&gt;
swift_store_create_container_on_put = True&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone+cachemanagement&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/glance/glance-registry.conf as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41) Make changes on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
sql_connection=mysql://glance:glance_pass@192.168.220.40/glance&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = glance&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
&lt;br /&gt;
[paste_deploy]&lt;br /&gt;
flavor=keystone&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the glance-api and glance-registry services: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-api restart; service glance-registry restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
The database tables are under version control and you use the following command on a new installation to prevent the Image service from breaking possible upgrades. This command is used on only one of the controllers: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage version_control 0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Synchronize the glance database on one control node (You may get a message about deprecation - you can ignore): &lt;br /&gt;
&amp;lt;pre&amp;gt;glance-manage db_sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the services again to take into account the new modifications: &lt;br /&gt;
&amp;lt;pre&amp;gt;service glance-registry restart; service glance-api restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Download the Cirros 0.3.1 cloud image to a controller node and then upload it to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-disk.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;cirros&amp;quot; is_public=true disk_format=qcow2 container_format=ovf &amp;amp;lt; cirros-0.3.1-x86_64-disk.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that Glance is serving the image: &lt;br /&gt;
&amp;lt;pre&amp;gt;glance image-list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, you can add the Ubuntu Precise image to Glance: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
 &lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum Server on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y quantum-server quantum-plugin-openvswitch&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Quantum database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE quantum; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'%' IDENTIFIED BY 'quantum_pass'; &lt;br /&gt;
GRANT ALL ON quantum.* TO 'quantum'@'localhost' IDENTIFIED BY 'quantum_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/quantum/quantum.conf file on all control nodes. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01: bind_host = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
bind_host = [CONTROLLER_MGT_IP]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&lt;br /&gt;
&lt;br /&gt;
[keystone_authtoken]&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = quantum&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/quantum/keystone-signing&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&lt;br /&gt;
&lt;br /&gt;
[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1&lt;br /&gt;
bridge_mappings = physnet1:br-ex &lt;br /&gt;
&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the quantum server: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-server restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova software packages on all Control Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-api nova-conductor nova-consoleauth nova-scheduler nova-novncproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Nova database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE nova;&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
GRANT ALL ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Modify the authtoken section in the /etc/nova/api-paste.ini file on each control node to include the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = nova&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [CONTROLLER_MGT_IP] with the controller node's management IP address (i.e. control01 = 192.168.220.41). Do this on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
dhcpbridge_flagfile=/etc/nova/nova.conf&lt;br /&gt;
dhcpbridge=/usr/bin/nova-dhcpbridge&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
verbose=true&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
image_service=nova.image.glance.GlanceImageService&lt;br /&gt;
rpc_backend=nova.rpc.impl_kombu&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
service_down_time=60&lt;br /&gt;
rabbit_port=5672&lt;br /&gt;
rabbit_virtual_host=/&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
ec2_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
enabled_apis=ec2,osapi_compute&lt;br /&gt;
osapi_compute_listen=[CONTROLLER_MGT_IP]&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
novncproxy_port=6080&lt;br /&gt;
novncproxy_host=0.0.0.0&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
novncproxy_host=[CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Synchronize the Nova database (You may get a DEBUG message - You can ignore this). '''Note:''' The db sync needs to be completed on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Due to [https://bugs.launchpad.net/nova/+bug/1158958 bug 1158958], Nova API must be patched to support memcached instead of the in-process cache. First, see if Nova needs to be patched by grep'ing the file that needs to be patched. You will receive no output if the file needs to be patched. You will receive host = str(instance.get('host')) if the file does not need patching: &lt;br /&gt;
&amp;lt;pre&amp;gt;grep &amp;quot;str(instance.get('host'))&amp;quot; /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If the extended_availability_zone.py file needs patching, download the patched file: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.github.com/dflorea/nova/grizzly/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Copy the patched extended_availability_zone.py to the /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/ directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;cp extended_availability_zone.py /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure the file is owned by root:root. &lt;br /&gt;
&amp;lt;pre&amp;gt;ls -l /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
If&amp;amp;nbsp;extended_availability_zone.py is not owned by root, then change the file ownership: &lt;br /&gt;
&amp;lt;pre&amp;gt;chmod root:root /usr/lib/python2.7/dist-packages/nova/api/openstack/compute/contrib/extended_availability_zone.py&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart nova-* services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;cd /etc/init.d/; for i in $( ls nova-* ); do sudo service $i restart; done&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
Also check that nova-api is running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-api status&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Cinder software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-api cinder-scheduler&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the Cinder MySQL database on 1 control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;mysql&lt;br /&gt;
CREATE DATABASE cinder;&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
GRANT ALL ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinder_pass';&lt;br /&gt;
quit;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/api-paste.ini file on each control node.: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
service_protocol = http&lt;br /&gt;
service_host = 192.168.220.40&lt;br /&gt;
service_port = 5000&lt;br /&gt;
auth_host = 192.168.220.40&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name = services&lt;br /&gt;
admin_user = cinder&lt;br /&gt;
admin_password = keystone_admin&lt;br /&gt;
signing_dir = /var/lib/cinder&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf configuration file on each control node. '''Note:''' The default volume_group is being changed from cinder-volumes to nova-volumes. As mentioned in the Critical Reminders section, an LVM Volume Group named nova-volumes must exist on each Compute Node. &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
sql_idle_timeout=30 &lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Initialize the Cinder database on only one control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;cinder-manage db sync&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart Cinder services on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-api restart&lt;br /&gt;
service cinder-scheduler restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Horizon Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Horizon software packages on all control nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y memcached libapache2-mod-wsgi openstack-dashboard&amp;lt;/pre&amp;gt; &lt;br /&gt;
Next, modify the /etc/openstack-dashboard/local_settings.py file as follows. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;CACHES = {&lt;br /&gt;
    'default': {&lt;br /&gt;
        'BACKEND'&amp;amp;nbsp;: 'django.core.cache.backends.memcached.MemcachedCache',&lt;br /&gt;
        'LOCATION'&amp;amp;nbsp;: '[CONTROLLER_MGT_IP]:11211'&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
OPENSTACK_HOST = &amp;quot;192.168.220.40&amp;quot;&lt;br /&gt;
OPENSTACK_KEYSTONE_URL = &amp;quot;http://%s:5000/v2.0&amp;quot;&amp;amp;nbsp;% OPENSTACK_HOST&lt;br /&gt;
OPENSTACK_KEYSTONE_DEFAULT_ROLE = &amp;quot;Member&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Change the memcached listening address in /etc/memcached.conf. Replace [CONTROLLER_MGT_IP] with the controller management IP address (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;-l [CONTROLLER_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
Reload Apache and memcached on each control node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service apache2 restart; service memcached restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Access Horizon by using the following URL in your web browser. Use '''admin/keystone_admin''' for your login credentials. &amp;amp;nbsp;If you have problems accessing Horizon by using the VIP (192.168.220.40), then try using a real IP address of a control node (i.e. control01 = 192.168.220.41): &lt;br /&gt;
&amp;lt;pre&amp;gt;http://192.168.220.40/horizon&amp;lt;/pre&amp;gt; &lt;br /&gt;
Optionally, if you would like to remove the Ubuntu theme: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get purge -y openstack-dashboard-ubuntu-theme&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Compute Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Follow these steps for compute01, compute02 and compute03 compute nodes. &lt;br /&gt;
&lt;br /&gt;
==== Quantum Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install the Quantum software packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install quantum-plugin-openvswitch quantum-plugin-openvswitch-agent quantum-dhcp-agent&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check the status of the Open vSwitch services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch status&amp;lt;/pre&amp;gt; &lt;br /&gt;
Start the Open vSwitch services on each compute node if they are not running: &lt;br /&gt;
&amp;lt;pre&amp;gt;service openvswitch-switch start&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Nodes require OVS bridges named &amp;quot;br-int&amp;quot; and &amp;quot;br-ex&amp;quot;, and that &amp;quot;br-ex&amp;quot; is associated with the Public Network interface (eth1 in our example): &lt;br /&gt;
&amp;lt;pre&amp;gt;ovs-vsctl add-br br-int&lt;br /&gt;
ovs-vsctl add-br br-ex&lt;br /&gt;
ovs-vsctl add-port br-ex eth1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the Quantum configuration file /etc/quantum/quantum.conf with the following. '''Note:''' Make sure the names in rabbit_hosts= resolve: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
log_file=/var/log/quantum/server.log&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the OVS plugin configuration file /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini with: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the database section&lt;br /&gt;
[DATABASE]&lt;br /&gt;
sql_connection=mysql://quantum:quantum_pass@192.168.220.40/quantum&lt;br /&gt;
sql_idle_timeout = 30&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the following under the OVS section. &amp;amp;nbsp; '''Note:''' 223:225 signifies the VLAN ID range used for tenant VLANs. Modify this range based on your deployment needs. These VLANs should be trunked to eth1 of Compute Nodes and you must create a gateway address (i.e. 192.168.223.1 for VLAN 223) on your upstream Layer-3 device. &lt;br /&gt;
&amp;lt;pre&amp;gt;[OVS]&lt;br /&gt;
network_vlan_ranges = physnet1:223:225&lt;br /&gt;
bridge_mappings = physnet1:br-ex&lt;br /&gt;
&lt;br /&gt;
# Using Quantum Security Groups instead of Nova Security Groups&lt;br /&gt;
[SECURITYGROUP]&lt;br /&gt;
firewall_driver = quantum.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver&amp;lt;/pre&amp;gt; &lt;br /&gt;
Update the /etc/quantum/dhcp_agent.ini: &lt;br /&gt;
&amp;lt;pre&amp;gt;#Under the default section&lt;br /&gt;
[DEFAULT]&lt;br /&gt;
# Required to run multiple Quantum DHCP agents&lt;br /&gt;
use_component_ext = True&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Quantum services on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service quantum-plugin-openvswitch-agent restart&lt;br /&gt;
service quantum-dhcp-agent restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Nova Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing the Nova Compute software package on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y nova-compute&amp;lt;/pre&amp;gt; &lt;br /&gt;
The deployment uses config_drive instead of Nova Metadata. Install the genisoimage package used by config_drive: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y genisoimage&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that the authtoken section in the /etc/nova/api-paste.ini file includes the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;[filter:authtoken]&lt;br /&gt;
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory&lt;br /&gt;
auth_host = 127.0.0.1&lt;br /&gt;
auth_port = 35357&lt;br /&gt;
auth_protocol = http&lt;br /&gt;
admin_tenant_name =&amp;amp;nbsp;%SERVICE_TENANT_NAME%&lt;br /&gt;
admin_user =&amp;amp;nbsp;%SERVICE_USER%&lt;br /&gt;
admin_password =&amp;amp;nbsp;%SERVICE_PASSWORD%&lt;br /&gt;
signing_dir = /tmp/keystone-signing-nova&lt;br /&gt;
# Workaround for https://bugs.launchpad.net/nova/+bug/1154809&lt;br /&gt;
auth_version = v2.0&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/nova/nova.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
force_config_drive=true&lt;br /&gt;
network_api_class=nova.network.quantumv2.api.API&lt;br /&gt;
quantum_url=http://192.168.220.40:9696&lt;br /&gt;
quantum_admin_auth_url=http://192.168.220.40:35357/v2.0&lt;br /&gt;
quantum_auth_strategy=keystone&lt;br /&gt;
quantum_admin_tenant_name=services&lt;br /&gt;
quantum_admin_username=quantum&lt;br /&gt;
quantum_admin_password=keystone_admin&lt;br /&gt;
firewall_driver=nova.virt.firewall.NoopFirewallDriver&lt;br /&gt;
service_quantum_metadata_proxy=true&lt;br /&gt;
quantum_metadata_proxy_shared_secret=quantum_proxy_secret&lt;br /&gt;
logdir=/var/log/nova&lt;br /&gt;
verbose=true&lt;br /&gt;
state_path=/var/lib/nova&lt;br /&gt;
lock_path=/var/lock/nova&lt;br /&gt;
iscsi_helper=tgtadm&lt;br /&gt;
libvirt_use_virtio_for_bridges=True&lt;br /&gt;
ec2_private_dns_show_ip=True&lt;br /&gt;
api_paste_config=/etc/nova/api-paste.ini&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
glance_api_servers=192.168.220.40:9292&lt;br /&gt;
sql_connection=mysql://nova:nova_pass@192.168.220.40/nova&lt;br /&gt;
memcached_servers=192.168.220.41:11211,192.168.220.42:11211,192.168.220.43:11211&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
metadata_host=192.168.220.40&lt;br /&gt;
volume_api_class=nova.volume.cinder.API&lt;br /&gt;
auth_strategy=keystone&lt;br /&gt;
rootwrap_config= /etc/nova/rootwrap.conf&lt;br /&gt;
vncserver_proxyclient_address=[COMPUTE_MGT_IP]&lt;br /&gt;
novncproxy_base_url=http://192.168.220.40:6080/vnc_auto.html&lt;br /&gt;
vncserver_listen=[COMPUTE_MGT_IP]&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' The nova.conf in our example enables verbose logging. When the environment is functional, you may want to consider changing verbose to false. Restart the nova-compute service on each compute node: &lt;br /&gt;
&amp;lt;pre&amp;gt;service nova-compute restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt; Create a credentials file so you can issue OpenStack client commands from the Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /root/openrc&lt;br /&gt;
&lt;br /&gt;
export OS_TENANT_NAME=admin&lt;br /&gt;
export OS_USERNAME=admin&lt;br /&gt;
export OS_PASSWORD=keystone_admin&lt;br /&gt;
export OS_AUTH_URL=&amp;quot;http://192.168.220.40:5000/v2.0/&amp;quot;&lt;br /&gt;
export OS_AUTH_STRATEGY=keystone&lt;br /&gt;
export SERVICE_TOKEN=keystone_admin_token&lt;br /&gt;
export SERVICE_ENDPOINT=http://192.168.220.40:35357/v2.0/&lt;br /&gt;
&lt;br /&gt;
source /root/openrc&amp;lt;/pre&amp;gt; &lt;br /&gt;
Check for the smiling faces on nova services to confirm your installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova-manage service list&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Cinder Installation  ====&lt;br /&gt;
&lt;br /&gt;
Start by installing Cinder software packages on all Compute Nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y cinder-volume&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the /etc/cinder/cinder.conf file with the following. Replace [COMPUTE_MGT_IP] with the compute node's management IP address (i.e. compute01 = 192.168.220.51): &lt;br /&gt;
&amp;lt;pre&amp;gt;[DEFAULT]&lt;br /&gt;
iscsi_ip_address=[COMPUTE_MGT_IP]&lt;br /&gt;
rabbit_ha_queues=True&lt;br /&gt;
rabbit_hosts=control01:5672,control02:5672,control03:5672&lt;br /&gt;
rabbit_userid=openstack_rabbit_user&lt;br /&gt;
rabbit_password=openstack_rabbit_password&lt;br /&gt;
sql_connection = mysql://cinder:cinder_pass@192.168.220.40/cinder&lt;br /&gt;
rootwrap_config = /etc/cinder/rootwrap.conf&lt;br /&gt;
api_paste_confg = /etc/cinder/api-paste.ini&lt;br /&gt;
iscsi_helper = tgtadm&lt;br /&gt;
volume_name_template = volume-%s&lt;br /&gt;
volume_group = nova-volumes&lt;br /&gt;
verbose = True&lt;br /&gt;
auth_strategy = keystone&lt;br /&gt;
state_path = /var/lib/cinder&lt;br /&gt;
lock_path = /var/lock/cinder&lt;br /&gt;
volumes_dir = /var/lib/cinder/volumes&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart the Cinder services on all compute nodes: &lt;br /&gt;
&amp;lt;pre&amp;gt;service cinder-volume restart&lt;br /&gt;
service tgt restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring Quantum and Deploying the First VM  ===&lt;br /&gt;
&lt;br /&gt;
Run the following commands from either a Compute Node or Controller Node. If something has to be done on a specific node it will be called out. NOTE: If you have an issue running any Quantum command you may need to do the following: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y python-pip&lt;br /&gt;
pip install -U cliff&amp;lt;/pre&amp;gt; &lt;br /&gt;
Obtain the tenant ID and create your first tenant network. Create additional networks and associated subnets as needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;keystone tenant-list&lt;br /&gt;
quantum net-create public223 --tenant_id &amp;amp;lt;tenant-id&amp;amp;gt; --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 223&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create your first tenant subnet and associate it to the network you created in the previous step. The example below uses .10-.250 for Instance IP addresses. Modify the allocation-pool and dns_nameservers based on your deployment needs. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum subnet-create --name 223-subnet --allocation-pool start=192.168.223.10,end=192.168.223.250 public223 192.168.223.0/24 --dns_nameservers list=true 192.168.26.186&amp;lt;/pre&amp;gt; &lt;br /&gt;
If you skipped the earlier step of downloading an image and uploading it to glance, do that now: &lt;br /&gt;
&amp;lt;pre&amp;gt;wget http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img&lt;br /&gt;
&lt;br /&gt;
glance add name=&amp;quot;precise&amp;quot; is_public=true container_format=ovf disk_format=qcow2 &amp;amp;lt; precise-server-cloudimg-amd64-disk1.img&amp;lt;/pre&amp;gt; &lt;br /&gt;
*'''On a Compute Node''' create an SSH keypair and add the public key to Nova. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Leave the passphrase empty when creating the keypair. You will need to to install the nova client support:&lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get -y install python-novaclient&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;ssh-keygen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;cd ~/.ssh/&lt;br /&gt;
nova keypair-add --pub_key id_rsa.pub &amp;amp;lt;key_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova keypair-add --pub_key id_rsa.pub net-key&amp;lt;/pre&amp;gt; &lt;br /&gt;
Before booting the instance, check for the ID of the network we created earlier. Note: the &amp;amp;lt;quantum_net_id&amp;amp;gt; value will come from the output of the &amp;quot;quantum net-list&amp;quot; command: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum net-list&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name &amp;amp;lt;key_name&amp;amp;gt; --nic net-id=&amp;amp;lt;quantum_net_id&amp;amp;gt; &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova boot --image precise --flavor m1.small --key_name net-key --nic net-id=f9035744-72a9-42cf-bd46-73d54c0cea06 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Watch the status of the instance: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show &amp;amp;lt;instance_name&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova show vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
The instance is booted completely when the OS-EXT-STS:vm_state is &amp;quot;active&amp;quot;. Make note of the IP address of the VM. Alternatively, you can watch the complete log of the VM booting by running: &lt;br /&gt;
&amp;lt;pre&amp;gt;nova console-log --length=25 vm1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Edit the default Quantum Security Group to allow ingress traffic to Instances. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Security Group rules are associated to a specific tenant. The &amp;amp;lt;tenant-id&amp;amp;gt; can be found from the output of keystone tenant-list. &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id &amp;amp;lt;tenant-id&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
This example allows all ICMP and SSH traffic: &lt;br /&gt;
&amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol icmp --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&amp;lt;/pre&amp;gt; &amp;lt;pre&amp;gt;quantum security-group-rule-create default --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 0.0.0.0/0 --tenant-id 2fbf0d3f6b914b5e8eb4605355cf2c9b&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
You should now be able to ping the VM as well as SSH into it from the host that you used to create the key you associated with the VM during the boot phase.&lt;/div&gt;</summary>
		<author><name>Shmcfarl</name></author>	</entry>

	<entry>
		<id>http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide</id>
		<title>COE Grizzly Release: High-Availability Manual Installation Guide</title>
		<link rel="alternate" type="text/html" href="http://docwiki.cisco.com/wiki/COE_Grizzly_Release:_High-Availability_Manual_Installation_Guide"/>
				<updated>2013-04-24T16:42:42Z</updated>
		
		<summary type="html">&lt;p&gt;Shmcfarl: /* RabbitMQ Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction  ==&lt;br /&gt;
&lt;br /&gt;
There are two common ways of installing [http://docs.openstack.org/ OpenStack], manually or by using automation tools. There is much focus on the full automation of OpenStack deployments using tools such as [http://puppetlabs.com/ Puppet], [http://www.opscode.com/chef/ Chef], [https://juju.ubuntu.com/ JuJu] and others. While these tools offer great advantages over manual configuration, they do hide the OpenStack installation and configuration details. This document can be used by those interested in learning more about the OpenStack Grizzly High-Availability (HA) installation process or for those not interested in using automation tools to deploy HA. The document covers the following OpenStack software components: &lt;br /&gt;
&lt;br /&gt;
*[http://glance.openstack.org/ Glance] (Image Service) &lt;br /&gt;
*[http://keystone.openstack.org/ Keystone] (Identity Service) &lt;br /&gt;
*[http://nova.openstack.org/ Nova] (Compute Service) &lt;br /&gt;
*[http://horizon.openstack.org/ Horizon] (OpenStack Dashboard Web User Interface) &lt;br /&gt;
*[http://docs.openstack.org/developer/quantum/ Quantum] (Network Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/cinder/ Cinder] (Block Storage Service) &lt;br /&gt;
*[http://docs.openstack.org/developer/swift/ Swift] (Object Storage Service)&lt;br /&gt;
&lt;br /&gt;
== Dependencies  ==&lt;br /&gt;
&lt;br /&gt;
=== Critical Reminders  ===&lt;br /&gt;
&lt;br /&gt;
The most common OpenStack HA deployment issues are either incorrect configuration files or not deploying the nodes in the proper order. To save you from future troubleshooting steps, ENSURE that you deploy the nodes in the order described within the document and verify the accuracy of all configuration files. You will likely be using your own IP addressing and passwords in your setup and it is critical to ensure any variations from this guide are fully understood. &lt;br /&gt;
&lt;br /&gt;
Do not configure RAID on the hard disks of Swift Storage Nodes. Swift performs better without RAID and disk redundancy is unneeded since Swift protects the data through replication. Therefore, if a RAID Controller manages the hard disks, ensure you present each of the hard disks independently. Our example uses disk /dev/sda for the Operating System installation and disks /dev/sdb-/dev/sdf for Swift storage. Please remember to modify these definitions based on your specific deployment environment. Additional Swift considerations and tuning information can be found [http://docs.openstack.org/trunk/openstack-object-storage/admin/content/considerations-and-tuning.html here]. &lt;br /&gt;
&lt;br /&gt;
Compute Nodes run Cinder Volume to provide block storage services to Instances. The default Cinder driver (volume_driver=nova.volume.driver.ISCSIDriver) is an iSCSI solution that employs the use of Linux Logical Volume Manager (LVM). Therefore, you must create an LVM Volume Group either during the Ubuntu Precise installation or [http://docs.openstack.org/trunk/openstack-compute/admin/content/cinder-install.html afterwards]. The name of the LVM Volume Group must match the volume_group definition in cinder.conf. Our example uses the name nova-volumes for the LVM Volume Group and associated cinder.conf volume_group name. &lt;br /&gt;
&lt;br /&gt;
The password used in our examples is keystone_admin. Every account, service and configuration file uses this one password. You will want to change this in your setup and you certainly want to use a strong password and a different password for each account/service if this system is going into production.&lt;br /&gt;
&lt;br /&gt;
=== Operating System  ===&lt;br /&gt;
&lt;br /&gt;
The operating system used for this installation is Ubuntu 12.04 LTS (Precise). &lt;br /&gt;
&lt;br /&gt;
=== Server Requirements  ===&lt;br /&gt;
&lt;br /&gt;
Our deployment uses 13 Cisco UCS C-series servers to serve the roles of Controller, Compute, Load-Balancer and Swift Proxy/Storage. The environment scales linearly, therefore individual nodes can be added to increase capacity for any particular OpenStack service. The five distinct node types used in this document are: &lt;br /&gt;
&lt;br /&gt;
*'''3 Controller Nodes-'''&amp;amp;nbsp;Runs Nova API, Nova Conductor, Nova Consoleauth, Nova Novncproxy, Nova Scheduler, NoVNC, Quantum Server, Quantum Plugin OVS, Glance API/Registry, Keystone, Cinder API, Cinder Scheduler, OpenStack Dashboard, RabbitMQ Server, MySQL Server WSREP and Galera. &lt;br /&gt;
**Provides management functionality of the OpenStack environment.&lt;br /&gt;
&lt;br /&gt;
*'''3 Compute Nodes-'''&amp;amp;nbsp;Runs Nova Compute, Quantum OVS and DHCP Agents, Cinder Volume and TGT services. &lt;br /&gt;
**Provides the hypervisor role for running Nova instances (Virtual Machines) and presents LVM volumes for Cinder block storage.&lt;br /&gt;
&lt;br /&gt;
*'''2 Load-Balancer Nodes-'''&amp;amp;nbsp;Runs HAProxy and Keepalived to load-balance traffic across Controller and Swift Proxy clusters.&lt;br /&gt;
&lt;br /&gt;
*'''2 Swift Proxy Nodes-'''&amp;amp;nbsp;The Proxy Node is responsible for tying together users and their data within the the Swift object storage system. For each request, it will look up the location of the account, container or object in the Swift ring and route the request accordingly. The public API is also exposed by Proxy Node.&lt;br /&gt;
&lt;br /&gt;
*'''3 Swift Storage Nodes-'''&amp;amp;nbsp;Each Storage Nodes contains Swift object, container, and account services. At a very high-level, these are the servers that contain the user data and perform replication among one another to keep the system in a consistent state.&lt;br /&gt;
&lt;br /&gt;
=== Networking Requirements  ===&lt;br /&gt;
&lt;br /&gt;
The OpenStack HA environment uses five separate networks. Three of the five networks are used by Tenants. Three tenant networks are being used as an example, and thus the tenant networks can be increased or decreased based on your deployment needs. Connectivity within Tenants uses Quantum with the Open vSwitch (OVS) plugin and [http://docs.openstack.org/trunk/openstack-network/admin/content/provider_networks.html Provider Network Extensions]. Provider Network Extensions allow cloud administrators to create OpenStack networks that map directly to physical networks in the data center and support local, VLAN and GRE deployment models. Our example uses the Provider VLAN networking model. The network details are as follows: &lt;br /&gt;
&lt;br /&gt;
*'''1 Management Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used to perform management functions against the node. For example, SSH'ing to the nodes to change a configuration setting. The network is also used for lights-out management using the CIMC interface of the UCS servers. Lastly, OpenStack API's and the Horizon web dashboard is associated to this network. &lt;br /&gt;
**An IP address for each node is required for this network. If using lights-out management such as CIMC, each node will require 2 addresses from this network. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]). &lt;br /&gt;
*'''3 Tenant Networks'''&amp;lt;br&amp;gt; &lt;br /&gt;
**These networks are used to provide connectivity to Instances. Since Quantum Provider Networking Extensions are being used, it is common to give tenants direct access to a &amp;quot;public&amp;quot; network that can be used to reach the Internet. &lt;br /&gt;
**Compute Nodes will have an interface attached to this network. Since the Compute Node interfaces that attach to this network are managed by OVS, they should not contain an IP address. &lt;br /&gt;
**This network typically employs publicly routable IP addressing if external NAT'ing is not used upstream towards the Internet edge ('''Note:''' in this document all IP addressing for all interfaces comes out of various private addressing blocks). &lt;br /&gt;
*'''1 Storage Network'''&amp;lt;br&amp;gt; &lt;br /&gt;
**This network is used for providing separate connectivity between Swift Proxy and Storage Nodes. This ensures storage traffic is not interfering with Instance traffic. &lt;br /&gt;
**This network typically employs private ([http://tools.ietf.org/html/rfc1918 RFC1918]) IP addressing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''[http://docwiki.cisco.com/w/images/a/a8/Grizzly-ha-network-design-details-v1.0.png Figure 1]''' is used to help visualize the network deployment and to act as a reference for configuration steps within the document. It is highly recommend to print the diagram so it can easily be referenced throughout the installation process.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;u&amp;gt;'''Figure 1:'''&amp;lt;/u&amp;gt;'''OpenStack HA Network Design Details''' &lt;br /&gt;
&lt;br /&gt;
[[Image:Grizzly-ha-network-design-details-v1.0.png|thumb|left]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''Other Network Services'''&amp;lt;br&amp;gt; &lt;br /&gt;
**'''DNS: '''In this setup an external DNS server (192.168.26.186) is used for name resolution of OpenStack nodes and external name resolution. If DNS is not being used, the /etc/hosts file should include the following for all nodes:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 127.0.0.1	localhost&lt;br /&gt;
 192.168.220.40  control.dmz-pod2.lab		control&lt;br /&gt;
 192.168.220.41  control01.dmz-pod2.lab	        control01&lt;br /&gt;
 192.168.220.42  control02.dmz-pod2.lab  	control02&lt;br /&gt;
 192.168.220.43  control03.dmz-pod2.lab  	control03&lt;br /&gt;
 192.168.220.60  swiftproxy.dmz-pod2.lab	        swiftproxy&lt;br /&gt;
 192.168.220.61  swiftproxy01.dmz-pod2.lab	swiftproxy01&lt;br /&gt;
 192.168.220.62  swiftproxy02.dmz-pod2.lab	swiftproxy02&lt;br /&gt;
 192.168.220.51  compute01.dmz-pod2.lab          compute01&lt;br /&gt;
 192.168.220.52  compute02.dmz-pod2.lab          compute02&lt;br /&gt;
 192.168.220.53  compute03.dmz-pod2.lab          compute03&lt;br /&gt;
&lt;br /&gt;
*'''NTP: '''In this setup an external NTP server(s) is used for time synchronization. &lt;br /&gt;
*'''Physical Network Switches:''' Each node in this setup is physically attached to a Cisco Nexus switch acting as a Top-of-Rack access layer device. Trunking is configured on each interface connecting to the eth0 NIC of each node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; Upstream routers/aggregation layer switches will most likely be terminating the Layer-3 VLAN interfaces. If these interfaces are deployed in a redundant fashion with a First Hop Redundancy Protocol such as HSRP or VRRP, then you should be careful of the IP addresses assigned to the physical L3 switches/routers as they may conflict with the IP address of the Quantum router's public subnet (.3 by default). For example, if you are using HSRP and you have .1 as the standby IP address, .2 as the first L3 switch IP and .3 as the second L3 switch IP, you will receive a duplicate IP address error on the second L3 switch. This can be worked around by using high-order IPs on your upstream L3 device or altering the Quantum subnet configuration at the time of creation to have an IP starting range higher than the physical switches/routers are using (i.e. .4 and higher). Our example uses an IP allocation range that starts with .10 to avoid this issue.&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
&lt;br /&gt;
The installation of the nodes should be in the following order: &lt;br /&gt;
&lt;br /&gt;
#'''Load-Balancer Nodes-''' slb01 and slb02 &lt;br /&gt;
#'''Swift Storage Nodes-''' swift01, swift02 and swift03 &lt;br /&gt;
#'''Swift Proxy Nodes-''' swiftproxy01 and swiftproxy02 &lt;br /&gt;
#'''Controller Nodes-''' control01, control02 and control03 &lt;br /&gt;
#'''Compute Nodes- '''compute01, compute02 and compute03&lt;br /&gt;
&lt;br /&gt;
=== General Installation Steps for All Nodes  ===&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu Precise 12.04 Installation  ====&lt;br /&gt;
&lt;br /&gt;
Install Ubuntu 12.04 (AMD 64-bit) from CD/ISO or automated install (i.e. kickstart). You can reference Section 4 in the [http://docwiki.cisco.com/wiki/OpenStack:Essex_Build_Node#Starting_the_Ubuntu_Installation Build Node Guide] if you are unfamiliar with the Ubuntu Precise installation process. Use the following networking section to configure your network adapter properties for each node. As previously mentioned in the Critical Reminders Section, make sure to create an LVM Volume Group named nova-volumes for Compute Nodes and do not configure RAID for Swift Storage Nodes. Lastly, select ssh-server as the only additional package during the Ubuntu Precise installation. &lt;br /&gt;
&lt;br /&gt;
==== Grizzly Packages  ====&lt;br /&gt;
&lt;br /&gt;
The [https://launchpad.net/~openstack-ubuntu-testing/+archive/grizzly-trunk-testing Ubuntu Testers Team] manages the repository used by this document for OpenStack Grizzly packaging. Although the repository supports Ubuntu Precise and Raring releases, the document is only based on Precise. The Ubuntu Testers PPA should be used for all OpenStack nodes (i.e. not needed for Load-Balancer nodes). &lt;br /&gt;
&lt;br /&gt;
Use sudo mode or run from root account for the entire installation: &lt;br /&gt;
&amp;lt;pre&amp;gt;sudo su&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add the Ubuntu Grizzly repository: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install python-software-properties -y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;apt-add-repository ppa:openstack-ubuntu-testing/grizzly-trunk-testing&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Note:''' Press enter when you are prompted for “[ENTER] or cancel” when adding the PPA. Update your system: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get update&amp;lt;/pre&amp;gt; &lt;br /&gt;
==== Networking  ====&lt;br /&gt;
&lt;br /&gt;
Our implementation uses VLANs for segmentation of certain networks. Make sure the VLAN package is installed and your network switches have been configured for VLANs. Otherwise, replicate the network setup using only physical interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install vlan -y&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.81&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load-Balancer Node slb02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.82&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.71&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.72&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Storage Node swift03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.73&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
*Proxy Node swiftproxy01 /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.61&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Proxy Node swiftproxy02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# Management Network&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
        address 192.168.220.62&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
        broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
&lt;br /&gt;
# Storage Network&lt;br /&gt;
auto eth0.222&lt;br /&gt;
iface eth0.222 inet static&lt;br /&gt;
        address 192.168.222.62&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.41&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.42&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Control Node control03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.43&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute01 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.51&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute02 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.52&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Compute Node compute03 /etc/network/interfaces: &lt;br /&gt;
&amp;lt;pre&amp;gt;# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 192.168.220.53&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	network 192.168.220.0&lt;br /&gt;
	broadcast 192.168.220.255&lt;br /&gt;
	gateway 192.168.220.1&lt;br /&gt;
	# dns-* options are implemented by the resolvconf package, if installed&lt;br /&gt;
	dns-nameservers 192.168.220.254&lt;br /&gt;
	dns-search dmz-pod2.lab&lt;br /&gt;
&lt;br /&gt;
# Public Network: Bridged Interface&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet manual&lt;br /&gt;
	up ifconfig $IFACE 0.0.0.0 up&lt;br /&gt;
	up ip link set $IFACE promisc on&lt;br /&gt;
	down ifconfig $IFACE 0.0.0.0 down&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart networking: &lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/init.d/networking restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Time Synchronization  ====&lt;br /&gt;
&lt;br /&gt;
Install NTP: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y ntp&amp;lt;/pre&amp;gt; &lt;br /&gt;
Add your NTP server(s) by editing /etc/ntp.conf. &amp;lt;u&amp;gt;'''Note:'''&amp;lt;/u&amp;gt; OpenStack requires that clocks be synchronized. Our example uses a '''FAKE '''server called ntp.corp.com as the NTP server. Make sure you change&amp;amp;nbsp;ntp.corp.com to your real NTP server. Lastly, make sure the NTP server name resolves. &lt;br /&gt;
&amp;lt;pre&amp;gt;vi /etc/ntp.conf&lt;br /&gt;
&lt;br /&gt;
server ntp.corp.com&amp;lt;/pre&amp;gt; &lt;br /&gt;
Restart NTP for the changes to take effect &lt;br /&gt;
&amp;lt;pre&amp;gt;service ntp restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Verify that you are pulling time: &lt;br /&gt;
&amp;lt;pre&amp;gt;ntpq -p&lt;br /&gt;
&lt;br /&gt;
remote           refid      st t when poll reach   delay   offset  jitter&lt;br /&gt;
==============================================================================&lt;br /&gt;
*ntp.corp.       .GPS.            1 u  185  512  377   76.035    0.053   0.033&lt;br /&gt;
 cheezum.mattnor 129.7.1.66       2 u   8d 1024    0   47.731   -0.555   0.000&lt;br /&gt;
 ntp2.rescomp.be .STEP.          16 u    - 1024    0    0.000    0.000   0.000&lt;br /&gt;
 216.45.57.38    204.123.2.5      2 u  54h 1024    0   12.607    0.808   0.000&lt;br /&gt;
 lithium.constan 128.4.1.1        2 u   8d 1024    0   69.861    0.206   0.000&lt;br /&gt;
 europium.canoni 193.79.237.14    2 u  54h 1024    0  144.040   -1.455   0.000&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load Balancer Node Installation  ===&lt;br /&gt;
&lt;br /&gt;
Perform the following steps on nodes slb01 and slb02. &lt;br /&gt;
&lt;br /&gt;
==== Keepalived &amp;amp;amp; HAProxy  ====&lt;br /&gt;
&lt;br /&gt;
Edit /etc/sysctl.conf to allow Keepalived to associate a virtual IP address (VIP) that is not directly bound to an interface on the node:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;net.ipv4.ip_nonlocal_bind=1&amp;lt;/pre&amp;gt; &lt;br /&gt;
Load in sysctl settings from /etc/sysctl.conf: &lt;br /&gt;
&amp;lt;pre&amp;gt;sysctl -p&amp;lt;/pre&amp;gt; &lt;br /&gt;
Install Keepalived and HAProxy packages: &lt;br /&gt;
&amp;lt;pre&amp;gt;apt-get install -y keepalived haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Create the /var/lib/haproxy directory: &lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir /var/lib/haproxy&amp;lt;/pre&amp;gt; &lt;br /&gt;
Make sure /var/lib/haproxy is owned by root. Change the file ownership if needed: &lt;br /&gt;
&amp;lt;pre&amp;gt;chown root:root /var/lib/haproxy/&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the&amp;amp;nbsp;/etc/keepalived/keepalived.conf file for slb01 with the contents below.&amp;amp;nbsp; Change&amp;amp;nbsp;[YOUR_DOMAIN_NAME] with your actual domain name.&amp;amp;nbsp; The keepalived.conf includes the following sections:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global_defs-''' Global parameters affect the whole process behavior.&amp;amp;nbsp;There may be several 'global' sections if needed, but their parameters will only be merged. &amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_script-''' Keepalived supports a VRRP scripting framework to extend base functionality.&amp;amp;nbsp; The vrrp_script named haproxy will check the status of the haproxy service every 2 seconds and add 2 points of priority if the status is running. &amp;amp;nbsp;If the haproxy service is not running, the backup HAProxy Node will become the primary and begin passing traffic for the virtual_ipaddress(es).&amp;lt;br&amp;gt; &lt;br /&gt;
*'''vrrp_instance-''' Is where you define configuration paramters for virtual gateway addresses.&amp;amp;nbsp; slb01 is configured as the primary gateway for 192.168.220.40 (Controller Cluster) and the backup gateway for 192.168.220.60 (Swift Proxy Cluster). Accordingly, slb02 is configured as the primary for 192.168.220.60 and the backup for 192.168.220.40.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb01&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure /etc/keepalived/keepalived.conf for slb02 with the following contents. Change [YOUR_DOMAIN_NAME] with your actual domain name. &lt;br /&gt;
&amp;lt;pre&amp;gt;global_defs {&lt;br /&gt;
  notification_email {&lt;br /&gt;
    root@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  }&lt;br /&gt;
  notification_email_from keepalived@[YOUR_DOMAIN_NAME]&lt;br /&gt;
  smtp_server localhost&lt;br /&gt;
  smtp_connect_timeout 30&lt;br /&gt;
  router_id slb02&lt;br /&gt;
}&lt;br /&gt;
vrrp_script haproxy {&lt;br /&gt;
  script   &amp;quot;killall -0 haproxy&amp;quot;&lt;br /&gt;
  interval 2&lt;br /&gt;
  weight   2&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 50 {&lt;br /&gt;
  virtual_router_id 50&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  100&lt;br /&gt;
  state     BACKUP&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.40 dev eth0&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
vrrp_instance 51 {&lt;br /&gt;
  virtual_router_id 51&lt;br /&gt;
  # Advert interval&lt;br /&gt;
  advert_int 1&lt;br /&gt;
  # for electing MASTER, highest priority wins.&lt;br /&gt;
  priority  101&lt;br /&gt;
  state     MASTER&lt;br /&gt;
  interface eth0&lt;br /&gt;
  virtual_ipaddress {&lt;br /&gt;
      192.168.220.60 dev eth0&lt;br /&gt;
  } &lt;br /&gt;
  track_script {&lt;br /&gt;
    haproxy&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb01 with the contents below. HAProxy's configuration process involves 3 major sources of parameters:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*The arguments from the command-line, which always take precedence.&amp;lt;br&amp;gt; &lt;br /&gt;
*The &amp;quot;global&amp;quot; section, which sets process-wide parameters.&amp;lt;br&amp;gt; &lt;br /&gt;
*The proxies sections which can take form of &amp;quot;defaults&amp;quot;, &amp;quot;listen&amp;quot;, &amp;quot;frontend&amp;quot; and &amp;quot;backend&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following provides additional details of the haproxy.cfg file:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''global-&amp;amp;nbsp; '''Sets process-wide parameters for load-balancing traffic.&amp;amp;nbsp; Global parameters can be overriden by server-specific configurations within the''listen section ''of the haproxy.cfg file.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''defaults-''' The &amp;quot;defaults&amp;quot; section sets default parameters for all other sections following its declaration. Those default parameters are reset by the next &amp;quot;defaults&amp;quot; section. The name is optional but its use is encouraged for better readability.&amp;lt;br&amp;gt; &lt;br /&gt;
*'''listen-''' A &amp;quot;listen&amp;quot; section defines a complete proxy with its front-end (i.e. listening VIP) and back-end (i.e. real IP of servers)&amp;amp;nbsp;parts combined in one section. Currently two major proxy modes are supported: &amp;quot;tcp&amp;quot;, also known as layer 4 and &amp;quot;http&amp;quot;, also known as layer 7. In layer 4 mode, HAProxy simply forwards bidirectional traffic between two sides. In layer 7 mode, HAProxy analyzes the protocol and can interact with it by allowing, blocking, switching, adding, modifying, or removing arbitrary content in requests or responses based on configurable criteria.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
 chroot  /var/lib/haproxy&lt;br /&gt;
 daemon  &lt;br /&gt;
 group  haproxy&lt;br /&gt;
 log  192.168.220.81 local0&lt;br /&gt;
 maxconn  4000&lt;br /&gt;
 pidfile  /var/run/haproxy.pid&lt;br /&gt;
 user  haproxy&lt;br /&gt;
&lt;br /&gt;
defaults&lt;br /&gt;
 log  global&lt;br /&gt;
 maxconn  8000&lt;br /&gt;
 option  redispatch&lt;br /&gt;
 retries  3&lt;br /&gt;
 timeout  http-request 10s&lt;br /&gt;
 timeout  queue 1m&lt;br /&gt;
 timeout  connect 10s&lt;br /&gt;
 timeout  client 1m&lt;br /&gt;
 timeout  server 1m&lt;br /&gt;
 timeout  check 10s&lt;br /&gt;
&lt;br /&gt;
listen dashboard_cluster&lt;br /&gt;
 bind 192.168.220.40:80&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:80 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen galera_cluster&lt;br /&gt;
 bind 192.168.220.40:3306&lt;br /&gt;
 balance  source&lt;br /&gt;
 mode  tcp&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 server control01 192.168.220.41:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:3306 check port 9200 inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9292&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9292 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen glance_registry_cluster&lt;br /&gt;
 bind 192.168.220.40:9191&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9191 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_admin_cluster&lt;br /&gt;
 bind 192.168.220.40:35357&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:35357 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen keystone_public_internal_cluster&lt;br /&gt;
 bind 192.168.220.40:5000&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:5000 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen memcached_cluster&lt;br /&gt;
 bind 192.168.220.40:11211&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:11211 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api1_cluster&lt;br /&gt;
 bind 192.168.220.40:8773&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8773 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api2_cluster&lt;br /&gt;
 bind 192.168.220.40:8774&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8774 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_compute_api3_cluster&lt;br /&gt;
 bind 192.168.220.40:8775&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8775 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen nova_volume_cluster&lt;br /&gt;
 bind 192.168.220.40:8776&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:8776 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen novnc_cluster&lt;br /&gt;
 bind 192.168.220.40:6080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:6080 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen quantum_api_cluster&lt;br /&gt;
 bind 192.168.220.40:9696&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 option  httpchk&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 server control01 192.168.220.41:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control02 192.168.220.42:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server control03 192.168.220.43:9696 check inter 2000 rise 2 fall 5&lt;br /&gt;
&lt;br /&gt;
listen swift_proxy_cluster&lt;br /&gt;
 bind 192.168.220.60:8080&lt;br /&gt;
 balance  source&lt;br /&gt;
 option  tcplog&lt;br /&gt;
 option  tcpka&lt;br /&gt;
 server swiftproxy01 192.168.220.61:8080 check inter 2000 rise 2 fall 5&lt;br /&gt;
 server swiftproxy02 192.168.220.62:8080 check inter 2000 rise 2 fall 5&amp;lt;/pre&amp;gt; &lt;br /&gt;
Configure the /etc/haproxy/haproxy.cfg file for slb02 with the contents below. &lt;br /&gt;
&amp;lt;pre&amp;gt;global&lt;br /&gt;
  chroot  /var/lib/haproxy&lt;br /&gt;
  daemon  &lt;br /&gt;
  group  haproxy&lt;b