From 3e514716146e6213a18b6229b2864614e5a3ce1c Mon Sep 17 00:00:00 2001 From: jjhua Date: Tue, 22 Oct 2013 09:52:58 -0400 Subject: [PATCH] Postscripts for OpenStack-Chef-cookbook/xCAT integration --- xCAT/postscripts/config_chef_client | 19 +- xCAT/postscripts/config_chef_server | 28 +++ xCAT/postscripts/config_chef_workstation | 21 ++- xCAT/postscripts/hashlib.sh | 16 ++ xCAT/postscripts/loadchefdata | 212 +++++++++++++++++++++++ xCAT/postscripts/mountinstall | 50 ++++++ 6 files changed, 340 insertions(+), 6 deletions(-) create mode 100755 xCAT/postscripts/hashlib.sh create mode 100755 xCAT/postscripts/loadchefdata create mode 100755 xCAT/postscripts/mountinstall diff --git a/xCAT/postscripts/config_chef_client b/xCAT/postscripts/config_chef_client index ac95062d5..4d06eca7f 100755 --- a/xCAT/postscripts/config_chef_client +++ b/xCAT/postscripts/config_chef_client @@ -30,16 +30,29 @@ if [ -z "$chef_server" ]; then chef_server=$CHEFSERVER fi if [ -z "$chef_server" ]; then - chef_server=$SITEMASTER + chef_server=$MASTER fi fi mkdir -p /etc/chef +mkdir -p /etc/chef-server_tmp + +mount $chef_server:/etc/chef-server /etc/chef-server_tmp +if [ $? -ne 0 ] +then + errmsg="Failed to run 'mount $chef_server:/etc/chef-server /etc/chef-server_tmp' on $node" + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 +fi + # copy the validator.pem to chef client -scp root@$chef_server:/etc/chef-server/chef-validator.pem /etc/chef/validation.pem - +#scp root@$chef_server:/etc/chef-server/chef-validator.pem /etc/chef/validation.pem +cp /etc/chef-server_tmp/chef-validator.pem /etc/chef/validation.pem +umount /etc/chef-server_tmp +rmdir /etc/chef-server_tmp # Add the info to /etc/chef/client.rb echo -e "log_level :auto diff --git a/xCAT/postscripts/config_chef_server b/xCAT/postscripts/config_chef_server index b59938de2..b1ac1ce15 100755 --- a/xCAT/postscripts/config_chef_server +++ b/xCAT/postscripts/config_chef_server @@ -25,4 +25,32 @@ then exit 1 fi +# for ubuntu +if [ -e "/etc/lsb-release" ] +then + apt-get install nfs-kernel-server portmap nfs-common -y + + grep "/etc/chef-server" /etc/exports + if [ $? -ne 0 ] + then + echo -e "\n/etc/chef-server *(rw,no_root_squash,sync,no_subtree_check)\n" >> /etc/exports + fi + sudo /etc/init.d/nfs-kernel-server restart + if [ $? -ne 0 ] + then + errmsg="Failed to run sudo /etc/init.d/nfs-kernel-server restart on $node" + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 + fi + service portmap restart + if [ $? -ne 0 ] + then + errmsg="Failed to run service portmap restart on $node" + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 + fi +fi + exit 0; diff --git a/xCAT/postscripts/config_chef_workstation b/xCAT/postscripts/config_chef_workstation index c17e41cf7..23c104acc 100755 --- a/xCAT/postscripts/config_chef_workstation +++ b/xCAT/postscripts/config_chef_workstation @@ -35,7 +35,7 @@ then fi if [ -z "$chefserver" ] then - chefserver=$SITEMASTER + chefserver=$MASTER fi fi @@ -78,8 +78,23 @@ then validation_key='/etc/chef-server/chef-validator.pem' else # Remote chef-server - scp $chefserver:/etc/chef-server/admin.pem $homedir/.chef 2>&1 1>/dev/null - scp $chefserver:/etc/chef-server/chef-validator.pem $homedir/.chef 2>&1 1>/dev/null + #scp $chefserver:/etc/chef-server/admin.pem $homedir/.chef 2>&1 1>/dev/null + #scp $chefserver:/etc/chef-server/chef-validator.pem $homedir/.chef 2>&1 1>/dev/null + mkdir -p /etc/chef + mkdir -p /etc/chef-server_tmp + + mount $chef_server:/etc/chef-server /etc/chef-server_tmp + if [ $? -ne 0 ] + then + errmsg="Failed to run 'mount $chef_server:/etc/chef-server /etc/chef-server_tmp' on $node" + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 + fi + cp /etc/chef-server_tmp/admin.pem $homedir/.chef 2>&1 1>/dev/null + cp /etc/chef-server_tmp/chef-validator.pem $homedir/.chef 2>&1 1>/dev/null + umount /etc/chef-server_tmp + rmdir /etc/chef-server_tmp if [ ! -e "$homedir/.chef/admin.pem" ] || [ ! -e "$homedir/.chef/chef-validator.pem" ] then errmsg="Could not get the chef keys from chef server $chefserver" diff --git a/xCAT/postscripts/hashlib.sh b/xCAT/postscripts/hashlib.sh new file mode 100755 index 000000000..78fb47c9e --- /dev/null +++ b/xCAT/postscripts/hashlib.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +## defined HASH functions here +hput() { + eval "HASH""$1""$2"='$3' +} + +hget() { + eval echo '${'"HASH$1$2"'}' +} + +hkeys() { + set | grep -o "^HASH${1}[[:alnum:]]*=" | sed -re "s/^HASH${1}(.*)=/\\1/g" +} + + diff --git a/xCAT/postscripts/loadchefdata b/xCAT/postscripts/loadchefdata new file mode 100755 index 000000000..41e525314 --- /dev/null +++ b/xCAT/postscripts/loadchefdata @@ -0,0 +1,212 @@ +#!/bin/sh +# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html + +# This script, ("loadchefdata"), is a sample xCAT post script for +# upload the openstack-cookbooks, roles, enviornment to the +# xCAT chef-server node, and then create the chef-client +# nodes, and then assign the role and environment name to the +# chef-client nodes +# +# Make sure your script is executable and that is is in the +# /install/postscripts directory on the xCAT management node. +# +# You must add the script name to the list of scripts that +# must be run at install time, or use it with updatenode. +# +# To use this script you should make sure it gets run after the +# "mountinstall" script or any other scipts that may need to use +# scripts in the /install directory. +# +# For example, to get it to run after the "mountinstall" script you +# could set the "postbootscripts" attribute of the chef-server node +# definitions as follows: +# +# chdef -t node -o chef-server postbootscripts="mountinstall,loadchefdata" +# + + +# load shell hash lib +source ./hashlib.sh + +#flags +no_args=0 +only_load_cookbook=0 +only_load_role=0 +only_load_clouddata=0 + +if [ $# -eq 0 ] +then + no_args=1 +else + for arg in "$@" + do + if [ "$arg" = "--cookbook" ] + then + only_load_cookbook=1 + elif [ "$arg" = "--role" ] + then + only_load_role=1 + elif [ "$arg" = "--clouddata" ] + then + only_load_clouddata=1 + else + errmsg="no argument $arg in the loadchefdata script" + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 + fi + done +fi + + + +# enter the repository director +# for example: cd /install/chef-cookbooks/grizzy-xcat/ +if [ ! -d "$REPOSITORY" ] +then + errmsg="$REPOSITORY is not a OpenStack Chef cookbooks directory." + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 +fi +cd $REPOSITORY + +if [ $no_args -eq 1 -o $only_load_cookbook -eq 1 ] +then + # upload coobooks + knife cookbook bulk delete '.*' -y > /dev/null 2>&1 + knife cookbook upload -o cookbooks --all + if [ $? != 0 ] + then + errmsg="Failed to run knife cookbook upload -o cookbooks --all on the chefserver $NODE." + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 + fi +fi + +if [ $no_args -eq 1 -o $only_load_role -eq 1 ] +then + # upload roles + knife role bulk delete '.*' -y > /dev/null 2>&1 + knife role from file roles/*.rb + if [ $? != 0 ] + then + errmsg="Failed to run knife role from file roles/*.rb on the chefserver $NODE." + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 + fi + +fi + + +if [ $no_args -eq 1 -o $only_load_clouddata -eq 1 ] +then + + if [ -z $CFGCLIENTLIST ] + then + msg="No cfgclient on the cfgserver $NODE?" + logger -t xcat -p local3.info $msg + echo $errmsg + exit 0 + fi + + #CLOUDLIST='cloud1,cloud1,cloud3' + OIFS=$IFS + IFS=',' + for cloud in $CLOUDLIST + do + echo "loading the enviornment file $cloud.rb for $cloud" + # knife environment delete xcat_per-tenant_routers_with_private_networks -y + # knife environment delete xcat_per-tenant_routers_with_private_networks -y + # load the environment file + # knife environment from file environments/xcat_per-tenant_routers_with_private_networks.rb + if [ ! -e "$REPOSITORY/environments/$cloud.rb" ] + then + errmsg="$REPOSITORY/environments/$cloud.rb doesn't exsit. run mkclouddata at first." + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 + fi + knife environment from file environments/$cloud.rb + if [ $? != 0 ] + then + errmsg="Failed to run knife environment from file environments/$cloud.rb on the chef-server $NODE." + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 + fi + done + #IFS=$OIFS + + #CFGCLIENTLIST='node1,node1,node3' + #OIFS=$IFS + #IFS=',' + for client in $CFGCLIENTLIST + do + echo "Configuring the chef-client node $client on the chef-server $NODE." + c_fullname="$client.$DOMAIN" + knife client delete -y $c_fullname > /dev/null 2>&1 + knife node delete -y $c_fullname > /dev/null 2>&1 + + #create nodes on this chef-server + # knife node create test3 -d + knife node create $c_fullname -d + if [ $? != 0 ] + then + errmsg="Failed to run knife node create $client -d on the chef-server $NODE." + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 + fi + + roles=`hget $client roles` + if [ -z $roles ] + then + errmsg="No roles for $client. Please check the cfgmgt table." + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 + fi + + # assign the role for the chef node + knife node run_list add $c_fullname "role[$roles]" + if [ $? != 0 ] + then + errmsg="Failed to run knife node run_list add $client 'role[$roles]' on the chef-server $NODE." + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 + fi + + # assign the new environment to the chef client node + newenv=`hget $client cloud` + if [ -z $newenv ] + then + errmsg="No cloud for $client. Please check the cloud table." + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 + fi + origenv=`knife node show $c_fullname -E | sed -e 's/[ ]*//g'| awk -F: '{print $2}'` + EDITOR="sed -e s/$origenv/$newenv/ -i" knife node edit $c_fullname + if [ $? != 0 ] + then + errmsg="Failed to run knife node edit $client on the chef-server $NODE." + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 + fi + + + done +fi + +IFS=$OIFS + + +exit 0 + + + diff --git a/xCAT/postscripts/mountinstall b/xCAT/postscripts/mountinstall new file mode 100755 index 000000000..1ac5f7412 --- /dev/null +++ b/xCAT/postscripts/mountinstall @@ -0,0 +1,50 @@ +#!/bin/sh +# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html + +# This script, ("mountinstall"), is a sample xCAT post script for +# mounting /install from managment node to xCAT chef-server +# nodes. +# +# Make sure your script is executable and that is is in the +# /install/postscripts directory on the xCAT management node. +# +# You must add the script name to the list of scripts that +# must be run at install time, or use it with updatenode. +# +# To use this script you should make sure it gets run before the +# "loadchefdata" script or any other scipts that may need to use +# scripts in the /install directory. +# +# For example, to get it to run before the "loadchefdata" script you +# could set the "postbootscripts" attribute of the chef-server node +# definitions as follows: +# +# chdef -t node -o chef-server postbootscripts="mountinstall,loadchefdata" +# + + +if [ -z "$INSTALLDIR" ]; then + INSTALLDIR="/install" +fi + + +mount | grep "$MASTER:$INSTALLDIR" +if [ $? -ne 0 ] +then + exit 0 +fi + + +# mount the files systems +mkdir /install + +mount $MASTER:$INSTALLDIR /install +if [ $? -ne 0 ] +then + errmsg="Failed to run mount $MASTER:$INSTALLDIR /install" + logger -t xcat -p local4.err $errmsg + echo $errmsg + exit 1 +fi + +exit 0