Skip to content

Instantly share code, notes, and snippets.

@sawanoboly
Last active December 15, 2015 15:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sawanoboly/5282660 to your computer and use it in GitHub Desktop.
Save sawanoboly/5282660 to your computer and use it in GitHub Desktop.
Continuous convergence with the chef-solo on the joyent smartmachine.
#!/usr/bin/bash
# REPLACE APP_REPO and APP_NAME
set -e
set -x
export PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/usr/sbin
MDATA_WRAPPER=001
MDATA_USERSCRIPT=/var/svc/mdata-user-script
MDATA_USERDATA=/var/svc/mdata-user-data
CHEF_REPOS=/usr/local/user-applcation
APP_REPO=https://github.com/${REPLACE_YOUR_REPOS}.git
# set token to use private repos
# APP_REPO=https://${GITHUB_TOKEN}@github.com/${REPLACE_YOUR_REPOS}.git
APP_NAME=${REPLACE_CHEF_ROLL_NAME}
## add mdata-wapper script to cron
## Notice: this block must keep on top to retry fetch cyclically.
if ! exists /opt/local/sbin/mdata_wrapper_${MDATA_WRAPPER}.sh ; then
cat <<"EOL" > /opt/local/sbin/mdata_wrapper_${MDATA_WRAPPER}.sh
#!/usr/bin/bash
export PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/usr/sbin
sleep `expr $$ % 60`
svcadm restart mdata:fetch
if svcs mdata:fetch | grep -q maintenance ; then svcadm clear mdata:fetch ;fi
sleep 2
svcadm restart mdata:execute
if svcs mdata:execute | grep -q maintenance ; then svcadm clear mdata:execute ;fi
EOL
chmod u+x /opt/local/sbin/mdata_wrapper_${MDATA_WRAPPER}.sh
ln -fs /opt/local/sbin/mdata_wrapper_${MDATA_WRAPPER}.sh /opt/local/sbin/mdata_wrapper.sh
fi
if ! grep -q -x "## user-applcation" /var/spool/cron/crontabs/root
then
cat << "EOL" >> /var/spool/cron/crontabs/root
## user-applcation
0,10,20,30,40,50 * * * * /opt/local/sbin/mdata_wrapper.sh
EOL
svcadm restart cron
fi
## install chef-solo
if [ ! -f /opt/local/bin/chef-solo ] ; then
pkgin -y install gcc47 scmgit-base gmake ruby193-base ruby193-yajl ruby193-nokogiri ruby193-readline pkg-config
## for smf cookbook
pkgin -y install libxslt
## install chef
gem update --system
gem install --no-ri --no-rdoc bundler
gem install --no-ri --no-rdoc ohai
gem install --no-ri --no-rdoc json
gem install --no-ri --no-rdoc chef
gem install --no-ri --no-rdoc rb-readline
fi
## clone or pull application repositoly to local
if [ ! -d ${CHEF_REPOS} ] ; then
git clone ${APP_REPO} ${CHEF_REPOS}
else
cd ${CHEF_REPOS}
git pull
fi
## execute chef-solo
chef-solo -c ${CHEF_REPOS}/solo.rb -o "role[${APP_NAME}]"
#!/usr/bin/bash
# set app_name and app_repo to metadata when provisioning.
set -e
set -x
export PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/usr/sbin
MDATA_WRAPPER=001
MDATA_USERSCRIPT=/var/svc/mdata-user-script
MDATA_USERDATA=/var/svc/mdata-user-data
CHEF_REPOS=/usr/local/user-application
## add mdata-wapper script to cron
## Notice: this block must keep on top to retry fetch cyclically.
if ! exists /opt/local/sbin/mdata_wrapper_${MDATA_WRAPPER}.sh ; then
cat <<"EOL" > /opt/local/sbin/mdata_wrapper_${MDATA_WRAPPER}.sh
#!/usr/bin/bash
export PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/usr/sbin
sleep `expr $$ % 60`
svcadm restart mdata:fetch
if svcs mdata:fetch | grep -q maintenance ; then svcadm clear mdata:fetch ;fi
sleep 2
svcadm restart mdata:execute
if svcs mdata:execute | grep -q maintenance ; then svcadm clear mdata:execute ;fi
EOL
chmod u+x /opt/local/sbin/mdata_wrapper_${MDATA_WRAPPER}.sh
ln -fs /opt/local/sbin/mdata_wrapper_${MDATA_WRAPPER}.sh /opt/local/sbin/mdata_wrapper.sh
fi
if ! grep -q -x "## user-application" /var/spool/cron/crontabs/root
then
cat << "EOL" >> /var/spool/cron/crontabs/root
## user-application
0,10,20,30,40,50 * * * * /opt/local/sbin/mdata_wrapper.sh
EOL
svcadm restart cron
fi
## install chef-solo
if [ ! -f /opt/local/bin/chef-solo ] ; then
pkgin -y install gcc47 scmgit-base gmake ruby193-base ruby193-yajl ruby193-nokogiri ruby193-readline pkg-config
## for smf cookbook
pkgin -y install libxslt
## install chef
gem update --system
gem install --no-ri --no-rdoc bundler
gem install --no-ri --no-rdoc ohai
gem install --no-ri --no-rdoc json
gem install --no-ri --no-rdoc chef
gem install --no-ri --no-rdoc rb-readline
fi
## get attribute from metadata-api
_mdata_check(){
if ! mdata-get $1 ; then echo "ERROR_EXIT: missing metadata $1" ; exit 1 ; fi
export $2="`mdata-get $1`"
}
_mdata_check app_name APP_NAME
_mdata_check app_repo APP_REPO
## clone or pull application repositoly to local
if [ ! -d ${CHEF_REPOS} ] ; then
git clone ${APP_REPO} ${CHEF_REPOS}
else
cd ${CHEF_REPOS}
git pull
fi
## execute chef-solo
chef-solo -j ${MDATA_USERDATA} -c ${CHEF_REPOS}/solo.rb -o "role[${APP_NAME}]"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment