From f82441ec93f626757eaf56b5aa3fb94cf0d498ff Mon Sep 17 00:00:00 2001 From: David Schroeder Date: Fri, 13 Jun 2014 12:25:39 -0600 Subject: [PATCH 1/2] Initial commit to add a devstack node --- Berksfile | 1 + Vagrantfile | 41 +++++++++++---- cookbooks/devstack/README.md | 12 +++++ cookbooks/devstack/files/default/autostack.sh | 50 +++++++++++++++++++ cookbooks/devstack/metadata.rb | 7 +++ cookbooks/devstack/recipes/default.rb | 30 +++++++++++ .../recipes/keystone.rb | 13 +---- cookbooks/devstack/recipes/mon-ui.rb | 21 ++++++++ roles/Devstack.json | 20 ++++++++ roles/Mini-Mon.json | 1 - 10 files changed, 172 insertions(+), 24 deletions(-) create mode 100644 cookbooks/devstack/README.md create mode 100755 cookbooks/devstack/files/default/autostack.sh create mode 100644 cookbooks/devstack/metadata.rb create mode 100644 cookbooks/devstack/recipes/default.rb rename cookbooks/{mini-mon => devstack}/recipes/keystone.rb (63%) create mode 100644 cookbooks/devstack/recipes/mon-ui.rb create mode 100644 roles/Devstack.json diff --git a/Berksfile b/Berksfile index 8528a18..5912a66 100644 --- a/Berksfile +++ b/Berksfile @@ -5,6 +5,7 @@ if Gem::Specification::find_by_name('berkshelf').version.to_s[0] == '3' end cookbook 'mini-mon', path: './cookbooks/mini-mon' +cookbook 'devstack', path: './cookbooks/devstack' cookbook 'mon_api', git: 'https://github.com/hpcloud-mon/cookbooks-mon_api' cookbook 'kafka', git: 'https://github.com/hpcloud-mon/cookbooks-kafka' cookbook 'mon_agent', git: 'https://github.com/hpcloud-mon/cookbooks-mon_agent' diff --git a/Vagrantfile b/Vagrantfile index b7662ad..5e24744 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -20,21 +20,40 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| end end - config.vm.box = "precise64" - config.vm.box_url = "http://files.vagrantup.com/precise64.box" config.vm.synced_folder "~/", "/vagrant_home" # One vm running all the services - config.vm.hostname = 'mini-mon' - config.vm.network :private_network, ip: "192.168.10.4" - config.vm.provider "virtualbox" do |vb| - vb.memory = 6144 - vb.cpus = 4 + config.vm.define "mini-mon" do |mm| + mm.vm.hostname = 'mini-mon' + mm.vm.box = "precise64" + mm.vm.box_url = "http://files.vagrantup.com/precise64.box" + mm.vm.network :private_network, ip: "192.168.10.4" + mm.vm.provider "virtualbox" do |vb| + vb.memory = 6144 + vb.cpus = 4 + end + mm.vm.provision :chef_solo do |chef| + chef.roles_path = "roles" + chef.data_bags_path = "data_bags" + chef.add_role "Mini-Mon" + end end - config.vm.provision :chef_solo do |chef| - chef.roles_path = "roles" - chef.data_bags_path = "data_bags" - chef.add_role "Mini-Mon" + + # One vm just for devstack (to access the UI) + config.vm.define "devstack" do |ds| + ds.vm.hostname = "devstack" + ds.vm.box = "cyrusbio/devstack" + ds.vm.network :private_network, ip: "192.168.10.5" + ds.vm.network :private_network, ip: "10.1.2.44" + ds.vm.provider "virtualbox" do |vb| + vb.memory = 5280 + vb.cpus = 4 + end + ds.vm.provision :chef_solo do |chef| + chef.roles_path = "roles" + chef.data_bags_path = "data_bags" + chef.add_role "Devstack" + end end end diff --git a/cookbooks/devstack/README.md b/cookbooks/devstack/README.md new file mode 100644 index 0000000..fea1a9c --- /dev/null +++ b/cookbooks/devstack/README.md @@ -0,0 +1,12 @@ +devstack cookbook +========================= +Various helper recipes for the devstack server setup. + +Requirements +------------ + +Recipes +--------- +- default - configures base apt repostories needed for devstack as well as option apt cache +- mon-ui - installs the Monitoring panel in the UI +- keystone - simple keystone installation diff --git a/cookbooks/devstack/files/default/autostack.sh b/cookbooks/devstack/files/default/autostack.sh new file mode 100755 index 0000000..246df2a --- /dev/null +++ b/cookbooks/devstack/files/default/autostack.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash + +IFS=" +" + +unpriv_user=$USER +basedir=`dirname $0` + +if [ ! -e $basedir/stack-screenrc ]; then + echo "$basedir/stack-screenrc not found. Did you run ./stack.sh?" + exit 1 +fi + + +for line in `cat $basedir/stack-screenrc |tr -d "\r"`; do + if [[ $line == stuff* ]]; then + # Extract the command line to run this service + command=`echo "$line" |sed 's/^stuff //;s/"//g'` + base_command=`echo $command |sed 's:.*bin/::;s/ .*//'` + + # Skip screen sessions that are only a tail command + [[ $command == *tail* ]] && continue + + # Determine an appropriate log directory + parent=`echo "$command" |cut -d' ' -f2 |sed 's/;//'` + logdir="/var/log/`basename $parent`" + logfile="$base_command.log" + + echo "Creating /etc/init/$base_command.conf" + + sudo tee "/etc/init/$base_command.conf" >/dev/null <" + +start on (filesystem and net-device-up IFACE!=lo) +stop on runlevel [016] + +pre-start script + mkdir -p $logdir + chown $unpriv_user:root $logdir +end script + +respawn + +exec su -c "$command --log-dir=$logdir --log-file=$logfile" $unpriv_user +EOF + # Fire up the service + service $base_command restart + fi +done diff --git a/cookbooks/devstack/metadata.rb b/cookbooks/devstack/metadata.rb new file mode 100644 index 0000000..b577466 --- /dev/null +++ b/cookbooks/devstack/metadata.rb @@ -0,0 +1,7 @@ +name "devstack" +maintainer "Mon Team" +maintainer_email "hpcs-mon@hp.com" +license "All rights reserved" +description "Build customized devstack server" +long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) +version "0.0.1" diff --git a/cookbooks/devstack/recipes/default.rb b/cookbooks/devstack/recipes/default.rb new file mode 100644 index 0000000..1664f7e --- /dev/null +++ b/cookbooks/devstack/recipes/default.rb @@ -0,0 +1,30 @@ +# Turn a devstack image (https://vagrantcloud.com/cyrusbio/devstack) into +# something useful to mini-mon + +admin_token = 'ADMIN' +my_ip = '192.168.10.5' +ks_conf = '/etc/keystone/keystone.conf' + +# Modify keystone configuration to... +## ...bind to all IPs +execute "sed -i.bak1 's^\\(.*bind_host = \\).*^\\10.0.0.0^' #{ks_conf}" +# ...set the default admin token +execute "sed -i.bak2 's^\\(admin_token = \\).*^\\1#{admin_token}^' #{ks_conf}" +# ...set endpoints that other mini-mon nodes can use +execute "sed -i.bak3 's^\\(.*endpoint = http://\\).*\\(:.*\\)^\\1#{my_ip}\\2^' #{ks_conf}" + + +# Regular devstack relies on a user manually running "rejoin-stack.sh" which +# fires up a bunch of screen sessions, one for each process. We don't really +# want that here. Instead autostack.sh will create upstart scripts for each +# devstack process, sendnig its output to real log files under /var/log/. +cookbook_file "autostack.sh" do + mode 0755 + owner "vagrant" + path "/home/vagrant/devstack/autostack.sh" + action :create_if_missing +end + +execute "/home/vagrant/devstack/autostack.sh" + + diff --git a/cookbooks/mini-mon/recipes/keystone.rb b/cookbooks/devstack/recipes/keystone.rb similarity index 63% rename from cookbooks/mini-mon/recipes/keystone.rb rename to cookbooks/devstack/recipes/keystone.rb index cacf3ae..8c75c2b 100644 --- a/cookbooks/mini-mon/recipes/keystone.rb +++ b/cookbooks/devstack/recipes/keystone.rb @@ -1,15 +1,4 @@ -# Install a simple keystone just using sqlite, then setup a user mini-mon/password - -package 'keystone' do - action :install -end - -service 'keystone' do - action [ :enable, :start ] -end - -# The python-keystoneclient that comes with precise is broken by a newer python-prettytable needed by python-monclient, so cmdline interaction is messed -# up, using the api directly is fine though +# Sets up a user mini-mon username/password in keystone python 'make default keystone user' do action :run diff --git a/cookbooks/devstack/recipes/mon-ui.rb b/cookbooks/devstack/recipes/mon-ui.rb new file mode 100644 index 0000000..0683c4c --- /dev/null +++ b/cookbooks/devstack/recipes/mon-ui.rb @@ -0,0 +1,21 @@ +# Installs the mon-ui panel + +# Grab the necessary packages +include_recipe "python" +['monitoring-plugin','python-monclient'].each do |pkg| + python_pip pkg do + action :install + end +end + +# Set up symlinks +# Use 'execute' resource because chef does not support symlinking directories +execute "ln -sfv /usr/local/lib/python2.7/dist-packages/enabled/* /opt/stack/horizon/openstack_dashboard/local/enabled/" +execute "ln -sv /usr/local/lib/python2.7/dist-packages/monitoring /opt/stack/horizon/monitoring" +execute "ln -sv /usr/local/lib/python2.7/dist-packages/cosmos/overcloud /opt/stack/horizon/openstack_dashboard/dashboards/overcloud" + +# Bounce the webserver +service "apache2" do + action :restart +end + diff --git a/roles/Devstack.json b/roles/Devstack.json new file mode 100644 index 0000000..12f3ddc --- /dev/null +++ b/roles/Devstack.json @@ -0,0 +1,20 @@ +{ + "name": "Devstack", + "description": "Sets up a devstack server for keystone and UI", + "json_class": "Chef::Role", + "default_attributes": { + "apt": { + "periodic_update_min_delay": 60 + } + }, + "override_attributes": { + }, + "chef_type": "role", + "run_list": [ + "recipe[devstack]", + "recipe[devstack::mon-ui]", + "recipe[devstack::keystone]" + ], + "env_run_lists": { + } +} diff --git a/roles/Mini-Mon.json b/roles/Mini-Mon.json index 36c9a3e..668aa2a 100644 --- a/roles/Mini-Mon.json +++ b/roles/Mini-Mon.json @@ -38,7 +38,6 @@ "chef_type": "role", "run_list": [ "recipe[mini-mon]", - "recipe[mini-mon::keystone]", "recipe[percona::cluster]", "recipe[mini-mon::mysql_schema]", "recipe[zookeeper]", From 3d0c415c4c7d6e3f3eac4e18dbf037675f9e2391 Mon Sep 17 00:00:00 2001 From: David Schroeder Date: Fri, 13 Jun 2014 16:07:49 -0600 Subject: [PATCH 2/2] Added devstack node for 'split' role --- split/Vagrantfile | 33 ++++++++++++++++++++++++++++++--- split/roles/Devstack.json | 20 ++++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 split/roles/Devstack.json diff --git a/split/Vagrantfile b/split/Vagrantfile index 7b83ed0..d49e5db 100644 --- a/split/Vagrantfile +++ b/split/Vagrantfile @@ -1,12 +1,13 @@ # -*- mode: ruby -*- # vi: set ft=ruby : +Dir.chdir ".." + VAGRANTFILE_API_VERSION = "2" # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # Settings for all vms config.berkshelf.enabled = true - config.berkshelf.berksfile_path = "../Berksfile" # Handle local proxy settings if Vagrant.has_plugin?("vagrant-proxyconf") @@ -21,8 +22,6 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| end end - config.vm.box = "precise64" - config.vm.box_url = "http://files.vagrantup.com/precise64.box" config.vm.synced_folder "~/", "/vagrant_home" config.vm.provider "virtualbox" do |vb| vb.customize ["modifyvm", :id, "--memory", "768"] @@ -31,6 +30,8 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # VM specific settings, these machines come up in order they are specified. config.vm.define "mysql" do |mysql| mysql.vm.hostname = 'mysql' + mysql.vm.box = "precise64" + mysql.vm.box_url = "http://files.vagrantup.com/precise64.box" mysql.vm.network :private_network, ip: "192.168.10.6" mysql.vm.provision :chef_solo do |chef| chef.roles_path = "roles" @@ -41,6 +42,8 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.define "kafka" do |kafka| kafka.vm.hostname = 'kafka' + kafka.vm.box = "precise64" + kafka.vm.box_url = "http://files.vagrantup.com/precise64.box" kafka.vm.network :private_network, ip: "192.168.10.10" kafka.vm.provision :chef_solo do |chef| chef.roles_path = "roles" @@ -54,6 +57,8 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.define "vertica" do |vertica| vertica.vm.hostname = 'vertica' + vertica.vm.box = "precise64" + vertica.vm.box_url = "http://files.vagrantup.com/precise64.box" vertica.vm.network :private_network, ip: "192.168.10.8" vertica.vm.provision :chef_solo do |chef| chef.roles_path = "roles" @@ -67,6 +72,8 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.define "api" do |api| api.vm.hostname = 'api' + api.vm.box = "precise64" + api.vm.box_url = "http://files.vagrantup.com/precise64.box" api.vm.network :private_network, ip: "192.168.10.4" api.vm.provision :chef_solo do |chef| chef.roles_path = "roles" @@ -75,8 +82,26 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| end end + config.vm.define "devstack" do |devstack| + devstack.vm.hostname = 'devstack' + devstack.vm.box = "cyrusbio/devstack" + devstack.vm.network :private_network, ip: "192.168.10.5" + devstack.vm.network :private_network, ip: "10.1.2.44" + devstack.vm.provider "virtualbox" do |vb| + vb.memory = 5280 + vb.cpus = 4 + end + devstack.vm.provision :chef_solo do |chef| + chef.roles_path = "roles" + chef.data_bags_path = "data_bags" + chef.add_role "Devstack" + end + end + config.vm.define "persister" do |persister| persister.vm.hostname = 'persister' + persister.vm.box = "precise64" + persister.vm.box_url = "http://files.vagrantup.com/precise64.box" persister.vm.network :private_network, ip: "192.168.10.12" persister.vm.provision :chef_solo do |chef| chef.roles_path = "roles" @@ -90,6 +115,8 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.define "thresh" do |thresh| thresh.vm.hostname = 'thresh' + thresh.vm.box = "precise64" + thresh.vm.box_url = "http://files.vagrantup.com/precise64.box" thresh.vm.network :private_network, ip: "192.168.10.14" thresh.vm.provision :chef_solo do |chef| chef.roles_path = "roles" diff --git a/split/roles/Devstack.json b/split/roles/Devstack.json new file mode 100644 index 0000000..12f3ddc --- /dev/null +++ b/split/roles/Devstack.json @@ -0,0 +1,20 @@ +{ + "name": "Devstack", + "description": "Sets up a devstack server for keystone and UI", + "json_class": "Chef::Role", + "default_attributes": { + "apt": { + "periodic_update_min_delay": 60 + } + }, + "override_attributes": { + }, + "chef_type": "role", + "run_list": [ + "recipe[devstack]", + "recipe[devstack::mon-ui]", + "recipe[devstack::keystone]" + ], + "env_run_lists": { + } +}