OpenStack Cloud Computing Cookbook
http://www.openstackcookbook.com/
Monthly Archives: February 2014
Installing Rackspace Private Cloud using Chef Cookbooks
February 4, 2014
Posted by on What It Does
In this recipe we show you how to install Rackspace Private Cloud on 3 servers: 2 Controllers in HA and a Compute host.
Getting Ready
You will need
- a Chef server installed and configured
- 3 Servers (virtual or physical) running Ubuntu 12.04
Ensure you are on a client or server that has the Chef Client, knife, installed and configured to use your Chef Server.
How to do it…
#!/usr/bin/env bash set -e set -v set -u # This is a crude script which will deploy an openstack HA environment # YOU have to populate the IP addresses for Controller 1 and 2 as well as # The IP addresses for your compute nodes. Additionally you will need to # Populate the VIP_PREFIX with the first three octets of your VIP addresses. # You should run this script on the node that will become controller 1. # Rabbit Password RMQ_PW="Passw0rd" # Rabbit IP address, this should be the host ip which is on # the same network used by your management network RMQ_IP="10.51.50.1" # Set the cookbook version that we will upload to chef COOKBOOK_VERSION="v4.2.1" # SET THE NODE IP ADDRESSES CONTROLLER1="10.51.50.1" CONTROLLER2="10.51.50.2" # ADD ALL OF THE COMPUTE NODE IP ADDRESSES, SPACE SEPERATED. COMPUTE_NODES="10.51.50.3 10.51.50.4" # This is the VIP prefix, IE the beginning of your IP addresses for all your VIPS. # Note, This makes a lot of assumptions for your VIPS. # The environment use .154, .155, .156 for your HA VIPS. VIP_PREFIX="10.51.50" # Make the system key used for bootstrapping self and others. if [ ! -f "/root/.ssh/id_rsa" ];then ssh-keygen -t rsa -f /root/.ssh/id_rsa -N '' pushd /root/.ssh/ cat id_rsa.pub | tee -a authorized_keys popd fi for node in ${CONTROLLER1} ${CONTROLLER2} ${COMPUTE_NODES};do ssh-copy-id ${node} done apt-get update apt-get install -y python-dev python-pip git erlang erlang-nox erlang-dev curl lvm2 pip install git+https://github.com/cloudnull/mungerator RABBIT_URL="http://www.rabbitmq.com" function rabbit_setup() { if [ ! "$(rabbitmqctl list_vhosts | grep -w '/chef')" ];then rabbitmqctl add_vhost /chef fi if [ "$(rabbitmqctl list_users | grep -w 'chef')" ];then rabbitmqctl delete_user chef fi rabbitmqctl add_user chef "${RMQ_PW}" rabbitmqctl set_permissions -p /chef chef '.*' '.*' '.*' } function install_apt_packages() { RABBITMQ_KEY="${RABBIT_URL}/rabbitmq-signing-key-public.asc" wget -O /tmp/rabbitmq.asc ${RABBITMQ_KEY}; apt-key add /tmp/rabbitmq.asc RABBITMQ="${RABBIT_URL}/releases/rabbitmq-server/v3.1.5/rabbitmq-server_3.1.5-1_all.deb" wget -O /tmp/rabbitmq.deb ${RABBITMQ} dpkg -i /tmp/rabbitmq.deb rabbit_setup CHEF="https://www.opscode.com/chef/download-server?p=ubuntu&pv=12.04&m=x86_64" CHEF_SERVER_PACKAGE_URL=${CHEF} wget -O /tmp/chef_server.deb ${CHEF_SERVER_PACKAGE_URL} dpkg -i /tmp/chef_server.deb } function CREATE_SWAP() { cat > /tmp/swap.sh <<EOF #!/usr/bin/env bash if [ ! "\$(swapon -s | grep -v Filename)" ];then SWAPFILE="/SwapFile" if [ -f "\${SWAPFILE}" ];then swapoff -a rm \${SWAPFILE} fi dd if=/dev/zero of=\${SWAPFILE} bs=1M count=1024 chmod 600 \${SWAPFILE} mkswap \${SWAPFILE} swapon \${SWAPFILE} fi EOF cat > /tmp/swappiness.sh <<EOF #!/usr/bin/env bash SWAPPINESS=\$(sysctl -a | grep vm.swappiness | awk -F' = ' '{print \$2}') if [ "\${SWAPPINESS}" != 60 ];then sysctl vm.swappiness=60 fi EOF if [ ! "$(swapon -s | grep -v Filename)" ];then chmod +x /tmp/swap.sh chmod +x /tmp/swappiness.sh /tmp/swap.sh && /tmp/swappiness.sh fi } CREATE_SWAP install_apt_packages mkdir -p /etc/chef-server cat > /etc/chef-server/chef-server.rb <<EOF erchef["s3_url_ttl"] = 3600 nginx["ssl_port"] = 4000 nginx["non_ssl_port"] = 4080 nginx["enable_non_ssl"] = true rabbitmq["enable"] = false rabbitmq["password"] = "${RMQ_PW}" rabbitmq["vip"] = "${RMQ_IP}" rabbitmq['node_ip_address'] = "${RMQ_IP}" chef_server_webui["web_ui_admin_default_password"] = "THISisAdefaultPASSWORD" bookshelf["url"] = "https://#{node['ipaddress']}:4000" EOF chef-server-ctl reconfigure sysctl net.ipv4.conf.default.rp_filter=0 | tee -a /etc/sysctl.conf sysctl net.ipv4.conf.all.rp_filter=0 | tee -a /etc/sysctl.conf sysctl net.ipv4.ip_forward=1 | tee -a /etc/sysctl.conf bash <(wget -O - http://opscode.com/chef/install.sh) SYS_IP=$(ohai ipaddress | awk '/^ / {gsub(/ *\"/, ""); print; exit}') export CHEF_SERVER_URL=https://${SYS_IP}:4000 # Configure Knife mkdir -p /root/.chef cat > /root/.chef/knife.rb <<EOF log_level :info log_location STDOUT node_name 'admin' client_key '/etc/chef-server/admin.pem' validation_client_name 'chef-validator' validation_key '/etc/chef-server/chef-validator.pem' chef_server_url "https://${SYS_IP}:4000" cache_options( :path => '/root/.chef/checksums' ) cookbook_path [ '/opt/chef-cookbooks/cookbooks' ] EOF if [ ! -d "/opt/" ];then mkdir -p /opt/ fi if [ -d "/opt/chef-cookbooks" ];then rm -rf /opt/chef-cookbooks fi git clone https://github.com/rcbops/chef-cookbooks.git /opt/chef-cookbooks pushd /opt/chef-cookbooks git checkout ${COOKBOOK_VERSION} git submodule init git submodule sync git submodule update # Get add-on Cookbooks knife cookbook site download -f /tmp/cron.tar.gz cron 1.2.6 tar xf /tmp/cron.tar.gz -C /opt/chef-cookbooks/cookbooks knife cookbook site download -f /tmp/chef-client.tar.gz chef-client 3.0.6 tar xf /tmp/chef-client.tar.gz -C /opt/chef-cookbooks/cookbooks # Upload all of the RCBOPS Cookbooks knife cookbook upload -o /opt/chef-cookbooks/cookbooks -a popd # Save the erlang cookie if [ ! -f "/var/lib/rabbitmq/.erlang.cookie" ];then ERLANG_COOKIE="ANYSTRINGWILLDOJUSTFINE" else ERLANG_COOKIE="$(cat /var/lib/rabbitmq/.erlang.cookie)" fi # DROP THE BASE ENVIRONMENT FILE cat > /opt/base.env.json <<EOF { "name": "RCBOPS_Openstack_Environment", "description": "Environment for Openstack Private Cloud", "cookbook_versions": { }, "json_class": "Chef::Environment", "chef_type": "environment", "default_attributes": { }, "override_attributes": { "monitoring": { "procmon_provider": "monit", "metric_provider": "collectd" }, "enable_monit": true, "osops_networks": { "management": "${VIP_PREFIX}.0/24", "swift": "${VIP_PREFIX}.0/24", "public": "${VIP_PREFIX}.0/24", "nova": "${VIP_PREFIX}.0/24" }, "rabbitmq": { "cluster": true, "erlang_cookie": "${ERLANG_COOKIE}" }, "nova": { "config": { "use_single_default_gateway": false, "ram_allocation_ratio": 1.0, "disk_allocation_ratio": 1.0, "cpu_allocation_ratio": 2.0, "resume_guests_state_on_host_boot": false }, "network": { "provider": "neutron" }, "scheduler": { "default_filters": [ "AvailabilityZoneFilter", "ComputeFilter", "RetryFilter" ] }, "libvirt": { "vncserver_listen": "0.0.0.0", "virt_type": "qemu" } }, "keystone": { "pki": { "enabled": false }, "admin_user": "admin", "tenants": [ "service", "admin", "demo", "demo2" ], "users": { "admin": { "password": "secrete", "roles": { "admin": [ "admin" ] } }, "demo": { "password": "secrete", "default_tenant": "demo", "roles": { "Member": [ "demo2", "demo" ] } }, "demo2": { "password": "secrete", "default_tenant": "demo2", "roles": { "Member": [ "demo2", "demo" ] } } } }, "neutron": { "ovs": { "network_type": "gre", "provider_networks": [ { "bridge": "br-eth2", "vlans": "1024:1024", "label": "ph-eth2" } ] } }, "mysql": { "tunable": { "log_queries_not_using_index": false }, "allow_remote_root": true, "root_network_acl": "127.0.0.1" }, "vips": { "horizon-dash": "${VIP_PREFIX}.156", "keystone-service-api": "${VIP_PREFIX}.156", "nova-xvpvnc-proxy": "${VIP_PREFIX}.156", "nova-api": "${VIP_PREFIX}.156", "cinder-api": "${VIP_PREFIX}.156", "nova-ec2-public": "${VIP_PREFIX}.156", "config": { "${VIP_PREFIX}.156": { "vrid": 12, "network": "public" }, "${VIP_PREFIX}.154": { "vrid": 10, "network": "public" }, "${VIP_PREFIX}.155": { "vrid": 11, "network": "public" } }, "rabbitmq-queue": "${VIP_PREFIX}.155", "nova-novnc-proxy": "${VIP_PREFIX}.156", "mysql-db": "${VIP_PREFIX}.154", "glance-api": "${VIP_PREFIX}.156", "keystone-internal-api": "${VIP_PREFIX}.156", "horizon-dash_ssl": "${VIP_PREFIX}.156", "glance-registry": "${VIP_PREFIX}.156", "neutron-api": "${VIP_PREFIX}.156", "ceilometer-api": "${VIP_PREFIX}.156", "ceilometer-central-agent": "${VIP_PREFIX}.156", "heat-api": "${VIP_PREFIX}.156", "heat-api-cfn": "${VIP_PREFIX}.156", "heat-api-cloudwatch": "${VIP_PREFIX}.156", "keystone-admin-api": "${VIP_PREFIX}.156" }, "glance": { "images": [ ], "image": { }, "image_upload": false }, "osops": { "do_package_upgrades": false, "apply_patches": false }, "developer_mode": false } } EOF # Upload all of the RCBOPS Roles knife role from file /opt/chef-cookbooks/roles/*.rb knife environment from file /opt/base.env.json # Build all the things knife bootstrap -E RCBOPS_Openstack_Environment -r role[ha-controller1],role[single-network-node] ${CONTROLLER1} knife bootstrap -E RCBOPS_Openstack_Environment -r role[ha-controller2],role[single-network-node] ${CONTROLLER2} for node in ${COMPUTE_NODES};do knife bootstrap -E RCBOPS_Openstack_Environment -r role[single-compute] ${node} done