Scripting deployment of clusters in asgard
We use asgard at work to do deployments in both qa and production. Our general flow is to check in, have jenkins build, an AMI is created, and then … we have to manually go to asgard and deploy it. That sucks.
However, its actually not super hard to write some scripts to find the latest AMI for a cluster and prepare an automated deployment pipeline from a template. Here you go:
function asgard(){
verb=$1
url="https://my.asgard.com/us-east-1/$2"
shift
http ${VERB} --verify=no "$url" -b
}
function next-ami(){
cluster=$1
prepare-ami $cluster true | \
jq ".environment.images | reverse | .[0]"
}
function prepare-ami(){
cluster=$1
includeEnv=$2
asgard GET "deployment/prepare/${cluster}?deploymentTemplateName=CreateAndCleanUpPreviousAsg&includeEnvironment=${includeEnv}"
}
function get-next-ami(){
cluster=$1
next=`next-ami ${cluster} | jq ".id"`
prepare-ami ${cluster} "false" | jq ".lcOptions.imageId |= ${next}"
}
function start-deployment(){
cluster=$1
payload=$2
echo $payload | asgard POST "deployment/start/${cluster}"
}
The gist here is to
Find the next AMI image of a cluster
Get the prepared JSON for the next deployment
Update the prepared json with the new ami image
To use it you’d do
\> clusterName="foo"
\> next=`get-next-ami $clusterName`
\> start-deployment $clusterName $next
{
"deploymentId": "1773"
}
And thats it!