Finalized azure-setup for creating all of the requisite resources in the target subscription

This commit is contained in:
Chris Bednarski 2016-03-04 01:22:20 -08:00
parent 3ad8bf266a
commit 507efda4f4
1 changed files with 149 additions and 32 deletions

179
contrib/azure-setup.sh Normal file → Executable file
View File

@ -1,40 +1,43 @@
#!/usr/bin/env bash
set -e
AZURE_APP_NAME=
AZURE_RESOURCE_GROUP=
AZURE_STORAGE_ACCOUNT=
AZURE_APPLICATION_NAME=
AZURE_APPLICATION_URL=
meta_name=
azure_client_id= # Derived from application after creation
azure_client_name= # Application name
azure_client_secret= # Application password
azure_group_name=
azure_storage_name=
azure_subscription_id= # Derived from the account after login
azure_tenant_id= # Derived from the account after login
showhelp() {
echo "azure-setup"
echo ""
echo " azure-setup helps automate setting up an Azure account for packer builds"
echo " azure-setup helps you generate packer credentials for Azure"
echo ""
echo " The script walks through the process of creating a resource group,"
echo " storage account, application, service principal, and permissions"
echo " and then creates the account and shows you the identifiers you need"
echo " to configure packer."
echo " The script creates a resource group, storage account, application"
echo " (client), service principal, and permissions and displays a snippet"
echo " for use in your packer templates."
echo ""
echo " azure-setup is meant to be run interactively and will prompt you"
echo " for input. Also, it assumes you will run this against an account"
echo " that has not previously been configured, or that you are OK with"
echo " creating all new resources in Azure. If you want to skip or"
echo " customize these steps, please use the azure-cli directly."
echo " For simplicity we make a lot of assumptions and choose reasonable"
echo " defaults. If you want more control over what happens, please use"
echo " the azure-cli directly."
echo ""
echo " If the script fails partway through you will have to clean up the"
echo " lingering resources yourself."
echo " Note that you must already have an Azure account, username,"
echo " password, and subscription. You can create those here:"
echo ""
echo " - https://account.windowsazure.com/"
echo ""
echo "REQUIREMENTS"
echo ""
echo " You must install the azure-cli from"
echo " https://azure.microsoft.com/en-us/documentation/articles/xplat-cli-install/"
echo " and jq from https://stedolan.github.io/jq/"
echo " - azure-cli"
echo " - jq"
echo ""
echo " azure-setup will verify these tools are available before starting"
echo " Use the requirements command (below) for more info."
echo ""
echo "USAGE"
echo ""
echo " ./azure-setup.sh requirements"
echo " ./azure-setup.sh setup"
echo ""
}
@ -65,21 +68,135 @@ requirements() {
fi
}
askResourceGroup() {
echo -n "Choose a name for the resource"
read
askSubscription() {
azure account list
echo ""
echo "Please enter the Id of the account you wish to use. If you do not see"
echo "a valid account in the list press Ctrl+C to abort and create one."
echo "If you leave this blank we will use the Current account."
echo -n "> "
read azure_subscription_id
if [ "$azure_subscription_id" != "" ]; then
azure account set $azure_subscription_id
else
azure_subscription_id=$(azure account show --json | jq -r .[].id)
fi
azure_tenant_id=$(azure account show --json | jq -r .[].tenantId)
echo "Using subscription_id: $azure_subscription_id"
echo "Using tenant_id: $azure_tenant_id"
}
askName() {
echo ""
echo "Choose a name for your resource group, storage account, and client"
echo "client. This is arbitrary, but it must not already be in use by"
echo "any of those resources. ALPHANUMERIC ONLY. Ex: mypackerbuild"
echo -n "> "
read meta_name
}
askSecret() {
echo ""
echo "Enter a secret for your application. We recommend generating one with"
echo "openssl rand -base64 24. If you leave this blank we will attempt to"
echo "generate one for you using openssl. THIS WILL BE SHOWN IN PLAINTEXT."
echo "Ex: mypackersecret8734"
echo -n "> "
read azure_client_secret
if [ "$azure_client_secret" = "" ]; then
azure_client_secret=$(openssl rand -base64 24)
if [ $? -ne 0 ]; then
echo "Error generating secret"
exit 1
fi
echo "Generated client_secret: $azure_client_secret"
fi
}
createResourceGroup() {
echo "==> Creating resource group"
azure group create -n $meta_name -l westus
if [ $? -eq 0 ]; then
azure_group_name=$meta_name
else
echo "Error creating resource group: $meta_name"
exit 1
fi
}
createStorageAccount() {
echo "==> Creating storage account"
azure storage account create -g $meta_name -l westus --type LRS $meta_name
if [ $? -eq 0 ]; then
azure_storage_name=$meta_name
else
echo "Error creating storage account: $meta_name"
exit 1
fi
}
createApplication() {
echo "==> Creating application"
azure_client_id=$(azure ad app create -n $meta_name -i http://$meta_name --home-page http://$meta_name -p $azure_client_secret --json | jq -r .appId)
if [ $? -ne 0 ]; then
echo "Error creating application: $meta_name @ http://$meta_name"
exit 1
fi
}
createServicePrinciple() {
echo "==> Creating service principal"
azure ad sp create $azure_client_id
if [ $? -ne 0 ]; then
echo "Error creating service principal: $azure_client_id"
exit 1
fi
}
createPermissions() {
echo "==> Creating permissions"
azure role assignment create -o "Owner" --spn http://$meta_name -c /subscriptions/$azure_subscription_id
# We want to use this more conservative scope but it does not work with the
# current implementation which uses temporary resource groups
# azure role assignment create --spn http://$meta_name -g $azure_group_name -o "API Management Service Contributor"
if [ $? -ne 0 ]; then
echo "Error creating permissions for: http://$meta_name"
exit 1
fi
}
showConfigs() {
echo ""
echo "Use the following configuration for your packer template:"
echo ""
echo " \"tenant_id\": \"$azure_tenant_id\","
echo " \"subscription_id\": \"$azure_subscription_id\","
echo " \"client_id\": \"$azure_client_id\","
echo " \"client_secret\": \"$azure_client_secret\","
echo " \"resource_group_name\": \"$azure_group_name\","
echo " \"storage_account\": \"$azure_storage_name\","
echo ""
}
setup() {
requirements
echo ""
echo "Note: Please only use alphanumeric names for Azure resources. For"
echo "example:"
echo ""
echo " Good: packertest"
echo " Bad: packer-test"
echo ""
azure login
askSubscription
askName
askSecret
createResourceGroup
createStorageAccount
createApplication
createServicePrinciple
# It seems that if we continue to the next step too quickly this resource
# is not actually available, so let's wait a few seconds.
sleep 5
createPermissions
showConfigs
}
case "$1" in