323 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			323 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh  
 | |
| # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | |
| 
 | |
| # This script, ("loadclouddata"), 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,loadclouddata"	
 | |
| #
 | |
| 
 | |
| 
 | |
| ## 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"
 | |
| }
 | |
| 
 | |
| HOME='/root/'
 | |
| export HOME
 | |
| 
 | |
| #flags
 | |
| run_all=0
 | |
| only_load_cookbook=0
 | |
| only_load_role=0
 | |
| only_load_clouddata=0
 | |
| # develop mode. 0 -- false(customer mode); 1 -- true(develop mode)
 | |
| devmode=1
 | |
| 
 | |
| if [ $# -eq 0 ]
 | |
| then
 | |
|     run_all=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
 | |
|     elif [ "$arg" = "--nodevmode" ]
 | |
|     then
 | |
|         devmode=0
 | |
|         run_all=1
 | |
|     else 
 | |
|         errmsg="no argument $arg in the loadchefdata script"
 | |
|         logger -t xcat -p local4.err "$errmsg"
 | |
|         echo "$errmsg"
 | |
|         exit 1
 | |
|     fi
 | |
|   done
 | |
| fi
 | |
| 
 | |
| if [ $devmode -eq 0 ] 
 | |
| then
 | |
|    if [ $only_load_cookbook -eq 1 -o $only_load_role -eq 1 -o $only_load_clouddata -eq 1 ]
 | |
|    then
 | |
|        errmsg="'--nodevmode' could not be used with other arguments"
 | |
|        logger -t xcat -p local4.err "$errmsg"
 | |
|        echo "$errmsg"
 | |
|        exit 1
 | |
|    fi
 | |
| fi
 | |
| 
 | |
| if [ -z $CLOUDLIST ]
 | |
| then
 | |
|     errmsg="Error! No Cloud name is assigned to the chef-client of the chef-server $NODE. Please check the cloud table."
 | |
|     logger -t xcat -p local4.err $errmsg
 | |
|     echo $errmsg
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| # enter the repository director
 | |
| # for example: cd /install/chef-cookbooks/grizzy-xcat/
 | |
| if [ ! -d "$REPOSITORY" ] 
 | |
| then
 | |
|     errmsg="Error! Not an available OpenStack Chef cookbooks repository for the cloud $CLOUDLIST.Please check the clouds table."
 | |
|     logger -t xcat -p local4.err $errmsg
 | |
|     echo $errmsg
 | |
|     exit 1
 | |
| fi
 | |
| cd $REPOSITORY
 | |
| 
 | |
| if [ $run_all -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 [ $run_all -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 [ $run_all -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"
 | |
|         c_fullname=$client
 | |
|         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 value of the attribute cfgmgtroles is set for $client. Please check the cfgmgt table."
 | |
|             logger -t xcat -p local4.err $errmsg
 | |
|             echo $errmsg
 | |
|             exit 1
 | |
|         fi
 | |
| 
 | |
|         roles=`echo $roles | sed -e 's/ /,/g'` 
 | |
|         r="";        
 | |
|         for onerole in $roles
 | |
|         do
 | |
|             r+="role[$onerole],"
 | |
|         done
 | |
|  
 | |
|         # assign the role for the chef node
 | |
|         knife node run_list add $c_fullname "$r"
 | |
|         if [ $? != 0 ]
 | |
|         then  
 | |
|             errmsg="Failed to run knife node run_list add $client '$r' 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 value of the attribute cloud is set 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
 | |
|     
 | |
|     IFS=$OIFS
 | |
| fi
 | |
| 
 | |
| 
 | |
| if [ $devmode -eq 0 ]
 | |
| then
 | |
|     bags=(db_passwords  secrets  service_passwords  user_passwords)
 | |
|     
 | |
|     if [ ! -e "$REPOSITORY/databags" ]
 | |
|     then
 | |
|         mkdir -p "$REPOSITORY/databags"
 | |
|     fi 
 | |
|    
 | |
|     databag_key="$REPOSITORY/databags/openstack_databag_key"
 | |
|     openssl rand -base64 512 > $databag_key
 | |
|     if [ $? != 0 ]
 | |
|     then  
 | |
|         errmsg="Failed to use openssl to generate the data bag key on $NODE. Please check whether openssl is installed."
 | |
|         logger -t xcat -p local4.err "$errmsg"
 | |
|         echo "$errmsg"
 | |
|         exit 1
 | |
|     fi
 | |
| 
 | |
|     if [ ! -e "/etc/chef/" ]
 | |
|     then
 | |
|         mkdir -p "/etc/chef/"
 | |
|     fi
 | |
|     
 | |
|     #for knife command 
 | |
|     cp -f $databag_key "/etc/chef/encrypted_data_bag_secret"
 | |
|     #for other chef-client nodes
 | |
|     cp -f $databag_key "/etc/chef-server/encrypted_data_bag_secret"
 | |
|    
 | |
|    # add the path of encrypted_data_bag_secret to knife.rb file
 | |
|    if ! grep -w -q 'encrypted_data_bag_secret' /root/.chef/knife.rb
 | |
|    then
 | |
|        echo "encrypted_data_bag_secret '/etc/chef/openstack_encrypted_data_bag_secret'" >> /root/.chef/knife.rb
 | |
|    fi
 | |
|  
 | |
|    # delete the old databags
 | |
|    knife data bag list | xargs -i knife data bag delete -y {}
 | |
| 
 | |
|    # create databags and upload items
 | |
|    for bag in ${bags[@]}
 | |
|    do
 | |
|        bagpath="$REPOSITORY/databags/$bag"
 | |
|        if [ ! -e "$bagpath" ]
 | |
|        then
 | |
|            errmsg="$bag doesn't exist in $REPOSITORY/databags. Please make sure the databags are in the directory $REPOSITORY/databags."
 | |
|            logger -t xcat -p local4.err "$errmsg"
 | |
|            echo "$errmsg"
 | |
|            exit 1
 | |
|        fi
 | |
|        knife data bag create --secret-file $databag_key $bag
 | |
|        items=$(ls $bagpath)
 | |
|        for item in $items
 | |
|        do
 | |
|            knife data bag from file $bag $REPOSITORY/databags/$bag/$item --secret-file $databag_key
 | |
|            if [ $? != 0 ]
 | |
|            then  
 | |
|                errmsg="Failed to run knife data bag from file $bag $REPOSITORY/databags/$bag/$item --secret-file $databag_key"
 | |
|                logger -t xcat -p local4.err "$errmsg"
 | |
|                echo "$errmsg"
 | |
|                exit 1
 | |
|            fi
 | |
|        done
 | |
|    done
 | |
| 
 | |
| fi
 | |
| 
 | |
| exit 0
 | |
| 
 | |
| 
 | |
| 
 |