Convergência contínua com o chef-solo na joyent smartmachine e API de meta-dados.

Crie um livro de receitas para aplicativos.

  1. escrever receitas.
  2. criar função como nome do aplicativo que contém lista de execução para receitas.

Provisione smartmachine com os seguintes metadados.

  • script de usuário: Adicionar cron job que busca o repositório e executa chef-solo ciclicamente.
  • use-data: dados Json para chef-solo para forçar a substituição de atributos. Geralmente, é um json vazio como “{}”.
  • app_repo: uri do repositório Git.
  • app_name: nome da função a ser passado para o Chef solo.

O script do usuário funciona em 3 etapas.

  1. buscar e atualizar o script do usuário e os dados do usuário.
  2. inicializar ou atualizar livros de receitas do repositório git.
  3. execute o chef-solo com a função nomeada por app_name.

Exemplo de script de usuário.

Essência

#!/usr/bin/bash

set appname and apprepo to metadata when provisioning.

set -e
set -x

export PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/usr/sbin

MDATAWRAPPER=001
MDATAUSERSCRIPT=/var/svc/mdata-user-script
MDATAUSERDATA=/var/svc/mdata-user-data
CHEFREPOS=/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/mdatawrapper${MDATAWRAPPER}.sh ; then
cat <<"EOL" > /opt/local/sbin/mdatawrapper${MDATAWRAPPER}.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/mdatawrapper${MDATAWRAPPER}.sh
ln -fs /opt/local/sbin/mdatawrapper${MDATAWRAPPER}.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

mdatacheck(){
if ! mdata-get $1 ; then echo "ERROR_EXIT: missing metadata $1" ; exit 1 ; fi
export $2="mdata-get $1"
}

mdatacheck appname APPNAME
mdatacheck apprepo APPREPO

clone or pull application repositoly to local

if [ ! -d ${CHEFREPOS} ] ; then
git clone ${APPREPO} ${CHEFREPOS}
else
cd ${CHEFREPOS}
git pull
fi

execute chef-solo

chef-solo -j ${MDATAUSERDATA} -c ${CHEFREPOS}/solo.rb -o "role[${APP_NAME}]"</code></pre>

Modifications to the repository is automatically reflected in the machine.