Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

executable file 327 lines (287 sloc) 11.472 kB
#!/bin/bash
set -e
EXTRA_DIR="$1-extra"
OS_TOKEN="$1"
OS="${1##-*}"
FQDN=$(hostname --fqdn)
export CROWBAR_DIR=$PWD
export ISO_LIBRARY=/opt/dell/isos
mkdir -p "$ISO_LIBRARY"
die() { echo "$*"; exit 1; }
fqdn_re='^([a-z]+[0-9a-z]\.){2,}[a-z]+[0-9a-z]+$'
# Make sure there is something of a domain name
[[ $FQDN =~ $fqdn_re ]] || \
die "Please specify an FQDN for the admin name with valid characters"
[[ -d $EXTRA_DIR ]] || die "Unsupported OS $1. Cannot install crowbar."
. "$EXTRA_DIR/build_lib.sh"
mkdir -p /opt/dell/bin
cp change-image/dell/* /opt/dell/bin
cp extra/barclamp* /opt/dell/bin
export PATH=$PATH:/opt/dell/bin:/usr/local/bin
# Put our barclamps in the proper location
[[ -d /opt/dell/barclamps/crowbar ]] || cp -a barclamps /opt/dell
# Since we are running this script, we want an online mode install.
sed -i '/"online":/ s/false/true/' \
/opt/dell/barclamps/provisioner/chef/data_bags/crowbar/bc-template-provisioner.json
# Set the default OS for the provisioner
sed -i "s/%default_os%/$OS_TOKEN/g" \
/opt/dell/barclamps/provisioner/chef/data_bags/crowbar/bc-template-provisioner.json
if [[ ! -f /etc/polipo/config ]]; then
case $OS in
ubuntu)
cp "ubuntu-common/apt.conf" /etc/apt
debconf-set-selections < \
<(sed "s/__HOSTNAME__/$FQDN/g" "ubuntu-common/debsel.conf")
apt-get update
apt-get -y install polipo;;
centos|redhat)
yum -y makecache
yum -y install polipo;;
esac
cp extra/polipo.config /etc/polipo/config
if [[ $http_proxy && \
$http_proxy =~ http://([^/]+) ]] && \
! grep -q parentProxy /etc/polipo/config;
then
printf "\nparentProxy = \"${BASH_REMATCH[1]}\"\n">> \
/etc/polipo/config
fi
cp extra/polipo.uncachable /etc/polipo/uncachable
service polipo restart
fi
if [[ ! -f /opt/dell/.base_installed ]]; then
case $OS in
ubuntu)
echo 'Acquire::http::Proxy "http://127.0.0.1:8123";' > \
/etc/apt/apt.conf.d/00proxy
apt-get -y remove apparmor
apt-get -y install rubygems gcc ruby tcpdump \
libcurl4-gnutls-dev build-essential ruby-dev libxml2-dev \
zlib1g-dev nginx ipmitool;;
centos|redhat)
grep -q proxy /etc/yum.conf || \
echo 'proxy=http://localhost:8123' >>/etc/yum.conf
# matahari and qpid conflict with rabbitmq.
# Kill them with fire if they are around.
yum -y erase '*qpid*' 'matahari*' || :
yum -q -y install rubygems gcc make ruby-devel \
libxml2-devel zlib-devel tcpdump nginx;;
*) die "Unknown OS $OS";;
esac
# stop nginx
service nginx stop
rm -f /etc/nginx/sites-enabled/default
> /opt/dell/.base_installed
fi
# Arrange for all our gem binaries to be installed into /usr/local/bin
cat >/etc/gemrc <<EOF
gem: --no-ri --no-rdoc --bindir /usr/local/bin --http-proxy http://localhost:8123
EOF
if [[ ! -f /opt/dell/.gems_installed ]]; then
for gem in builder json net-http-digest_auth activesupport i18n \
daemons bluepill xml-simple libxml-ruby cstruct ; do
gem install $gem
done
>/opt/dell/.gems_installed
fi
mkdir -p /var/run/bluepill
mkdir -p /var/lib/bluepill
mkdir -p /etc/bluepill
# Copy all our pills to
for p in chef-client chef-server; do
cp extra/$p.pill /etc/bluepill
done
cp extra/chef-client.pill /tftpboot
cp "extra/chef-server.conf" /etc/nginx
if [[ ! -x /etc/init.d/bluepill ]]; then
echo "$(date '+%F %T %z'): Installing Chef"
case $OS in
ubuntu)
apt-get -y install chef kwalify
service chef-client stop || :
killall chef-client || :
apt-get -y install chef-server chef-server-webui
(cd "extra/patches"; chmod +x ./patch.sh ; ./patch.sh) || exit 1
# increase chef-solr index field size
perl -i -ne 'if ($_ =~ /<maxFieldLength>(.*)<\/maxFieldLength>/){ print "<maxFieldLength>200000</maxFieldLength> \n" } else { print } ' /var/lib/chef/solr/conf/solrconfig.xml
# Fix ruby-gems and merb-core mismatch
sed -i -e "s/Gem.activate(dep)/dep.to_spec.activate/g" \
/usr/lib/ruby/1.8/merb-core/core_ext/kernel.rb
service chef-server restart;;
redhat|centos)
yum -q -y install rubygem-chef rubygem-kwalify
service chef-client stop || :
killall chef-client || :
yum -q -y install rubygem-chef-server \
curl-devel ruby-shadow patch
(cd "extra/patches"; chmod +x ./patch.sh; ./patch.sh) || exit 1
# Default password in chef webui to password
sed -i 's/web_ui_admin_default_password ".*"/web_ui_admin_default_password "password"/' /etc/chef/webui.rb
redhat-common/start-chef-server.sh
## Missing client.rb for this system - Others get it ##
touch /etc/chef/client.rb
chown chef:chef /etc/chef/client.rb
# increase chef-solr index field size
perl -i -ne 'if ($_ =~ /<maxFieldLength>(.*)<\/maxFieldLength>/){ print "<maxFieldLength>200000</maxFieldLength> \n" } else { print } ' /var/chef/solr/conf/solrconfig.xml
service chef-server restart;;
*) die "Unknown OS $OS";;
esac
chef_services=(rabbitmq-server couchdb chef-server chef-server-webui \
chef-solr chef-expander chef-client)
# Have Bluepill manage our Chef services instead of letting sysvinit do it.
echo "$(date '+%F %T %z'): Arranging for Chef to run under Bluepill..."
for svc in "${chef_services[@]}"; do
service "$svc" stop || :
done
# sometimes couchdb does not die when asked. Kill it manually.
if ps aux |grep -q [c]ouchdb; then
kill $(ps aux |awk '/^couchdb/ {print $2}')
fi
# Create an init script for bluepill
cat > /etc/init.d/bluepill <<EOF
#!/bin/bash
# chkconfig: 2345 90 10
# description: Bluepill Daemon runner
PATH=$PATH
case \$1 in
start) for pill in /etc/bluepill/*.pill; do
[[ -f \$pill ]] || continue
bluepill load "\$pill"
done;;
stop) bluepill stop
bluepill quit;;
status) if ps aux |grep [b]luepilld; then
echo "Bluepill is running."
exit 0
else
echo "Bluepill is not running."
exit 1
fi;;
*) echo "\$1: Not supported.";;
esac
EOF
# enable the bluepill init script and disable the old sysv init scripts.
if which chkconfig &>/dev/null; then
chkconfig --add bluepill
chkconfig bluepill on
for svc in "${chef_services[@]}"; do
chkconfig "$svc" off
chmod ugo-x /etc/init.d/"$svc"
done
# to be implemented
elif which update-rc.d &>/dev/null; then
update-rc.d bluepill defaults 90 10
for svc in "${chef_services[@]}"; do
update-rc.d "$svc" disable
chmod ugo-x /etc/init.d/"$svc"
done
else
echo "Don't know how to handle services on this system!"
exit 1
fi
# Make sure that the chef log dir has the right permissions
chown -R chef:chef /var/log/chef
mkdir -p /var/lib/chef
chown -R chef:chef /var/lib/chef
mkdir -p /var/chef
chown -R chef:chef /var/chef
bluepill load /etc/bluepill/chef-server.pill
sleep 30
chmod 755 /etc/init.d/bluepill
fi
# Bundle up our patches and put them in a sane place
(cd extra ; tar czf "/tftpboot/patches.tar.gz" patches)
chef-client || die "Initial run of chef-client failed!"
if [[ ! -f /opt/dell/.crowbar_configured ]]; then
sed -i "s/pod.your.cloud.org/$(dnsdomainname)/g" \
/opt/dell/barclamps/dns/chef/data_bags/crowbar/bc-template-dns.json
# generate the machine install username and password
CROWBAR_FILE="/opt/dell/barclamps/crowbar/chef/data_bags/crowbar/bc-template-crowbar.json"
if [[ -e crowbar.json ]]; then
sed -e '/"id": "default"/ s/default/bc-template-crowbar/' < \
crowbar.json > \
/opt/dell/barclamps/crowbar/chef/data_bags/crowbar/bc-template-crowbar.json
fi
# Mangle the provisioner appropriatly
sed -i -e '/"online"/ s/false/true/' /opt/dell/barclamps/provisioner/chef/data_bags/crowbar/bc-template-provisioner.json
if grep -q parentProxy /etc/polipo/config; then
parent_proxy=$(awk '/parentProxy/ {print $3}' /etc/polipo/config)
if [[ $parent_proxy ]]; then
sed -i -e "/\"upstream_proxy\"/ s/\"\"/${parent_proxy}/" \
/opt/dell/barclamps/provisioner/chef/data_bags/crowbar/bc-template-provisioner.json
else
die "Cannot find parent proxy"
fi
fi
mkdir -p /opt/dell/crowbar_framework
CROWBAR_REALM=$(parse_node_data $CROWBAR_FILE -a attributes.crowbar.realm)
CROWBAR_REALM=${CROWBAR_REALM##*=}
if [[ ! -e /etc/crowbar.install.key && $CROWBAR_REALM ]]; then
dd if=/dev/urandom bs=65536 count=1 2>/dev/null |sha512sum - 2>/dev/null | \
(read key rest; echo "machine-install:$key" >/etc/crowbar.install.key)
fi
if [[ $CROWBAR_REALM && -f /etc/crowbar.install.key ]]; then
export CROWBAR_KEY=$(cat /etc/crowbar.install.key)
sed -ie "s/machine_password/${CROWBAR_KEY##*:}/g" "$CROWBAR_FILE"
fi
fi
# Install our barclamps
if [[ ! -f /opt/dell/.barclamps_installed ]]; then
(
unset CROWBAR_DIR
/opt/dell/bin/barclamp_install.rb /opt/dell/barclamps/*
) || die "Could not install barclamps"
# Now validate them
/opt/dell/bin/validate_bags.rb /opt/dell/chef/data_bags || die "Could not validate data bags."
fi
# Always make sure we have a gem site to fall back on.
mkdir -p /tftpboot/gemsite
(cd /tftpboot/gemsite; gem generate_index)
if [[ ! -f /opt/dell/.crowbar_installed ]]; then
NODE_ROLE="crowbar-${FQDN//./_}"
cat > /tmp/role.rb <<EOF
name "$NODE_ROLE"
description "Role for $FQDN"
run_list()
default_attributes( "crowbar" => { "network" => {} } )
override_attributes()
EOF
knife role from file /tmp/role.rb -u chef-webui -k /etc/chef/webui.pem || \
die "Unable to create machine role for admin node."
rm -rf /tmp/role.rb
echo "$(date '+%F %T %z'): Update run list..."
for role in crowbar deployer-client $NODE_ROLE; do
knife node run_list add "$FQDN" role["$role"] \
-u chef-webui -k /etc/chef/webui.pem || \
die "Could not add $role to Chef. Crowbar bringup will fail."
done
blocking_chef_client.sh || die "Could not bring up Crowbar"
# Add configured crowbar proposal
if [ "$(crowbar crowbar proposal list)" != "default" ] ; then
proposal_opts=(proposal create default)
# Sometimes proposal creation fails if Chef and Crowbar are not quite
# fully prepared -- this can happen due to solr not having everything
# fully indexed yet. So we don't want to just fail immediatly if
# we fail to create a proposal -- instead, we will kick Chef, sleep a bit,
# and try again up to 5 times before bailing out.
for ((x=1; x<6; x++)); do
crowbar crowbar "${proposal_opts[@]}" && { proposal_created=true; break; }
echo "Proposal create failed, pass $x. Will kick Chef and try again."
blocking_chef_client.sh "Kicking proposal bits"
sleep 1
done
if [[ ! $proposal_created ]]; then
die "Could not create default proposal"
fi
fi
crowbar crowbar proposal show default >/var/log/default-proposal.json
crowbar crowbar proposal commit default || \
die "Could not commit default proposal!"
crowbar crowbar show default >/var/log/default.json
fi
for state in discovering discovered hardware-installing hardware-installed \
installing installed readying ready; do
/opt/dell/bin/crowbar crowbar transition $FQDN $state || \
die "Could not transition to $state"
blocking_chef_client.sh || die "Chef-client run for $state failed."
done
Jump to Line
Something went wrong with that request. Please try again.