Revert "azure-cli output config check added"

This reverts commit 0f0fc1b99c.
This commit is contained in:
andrew-best-diaxion 2018-04-16 07:45:17 +10:00
parent 0f0fc1b99c
commit e911f03b6d
1 changed files with 192 additions and 202 deletions

View File

@ -12,267 +12,257 @@ azure_tenant_id= # Derived from the account after login
location= location=
azure_object_id= azure_object_id=
azureversion= azureversion=
azurecliconfig=
create_sleep=10 create_sleep=10
showhelp() { showhelp() {
echo "azure-setup" echo "azure-setup"
echo "" echo ""
echo " azure-setup helps you generate packer credentials for azure" echo " azure-setup helps you generate packer credentials for azure"
echo "" echo ""
echo " The script creates a resource group, storage account, application" echo " The script creates a resource group, storage account, application"
echo " (client), service principal, and permissions and displays a snippet" echo " (client), service principal, and permissions and displays a snippet"
echo " for use in your packer templates." echo " for use in your packer templates."
echo "" echo ""
echo " For simplicity we make a lot of assumptions and choose reasonable" 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 " defaults. If you want more control over what happens, please use"
echo " the azure-cli directly." echo " the azure-cli directly."
echo "" echo ""
echo " Note that you must already have an Azure account, username," echo " Note that you must already have an Azure account, username,"
echo " password, and subscription. You can create those here:" echo " password, and subscription. You can create those here:"
echo "" echo ""
echo " - https://account.windowsazure.com/" echo " - https://account.windowsazure.com/"
echo "" echo ""
echo "REQUIREMENTS" echo "REQUIREMENTS"
echo "" echo ""
echo " - azure-cli" echo " - azure-cli"
echo " - jq" echo " - jq"
echo "" echo ""
echo " Use the requirements command (below) for more info." echo " Use the requirements command (below) for more info."
echo "" echo ""
echo "USAGE" echo "USAGE"
echo "" echo ""
echo " ./azure-setup.sh requirements" echo " ./azure-setup.sh requirements"
echo " ./azure-setup.sh setup" echo " ./azure-setup.sh setup"
echo "" echo ""
} }
requirements() { requirements() {
found=0 found=0
azureversion=$(az --version) azureversion=$(az --version)
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
found=$((found + 1)) found=$((found + 1))
echo "Found azure-cli version: $azureversion" echo "Found azure-cli version: $azureversion"
else else
echo "azure-cli is missing. Please install azure-cli from" echo "azure-cli is missing. Please install azure-cli from"
echo "https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest" echo "https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest"
echo "Alternatively, you can use the Cloud Shell https://docs.microsoft.com/en-us/azure/cloud-shell/overview right from the Azure Portal or even VS Code." echo "Alternatively, you can use the Cloud Shell https://docs.microsoft.com/en-us/azure/cloud-shell/overview right from the Azure Portal or even VS Code."
fi fi
azurecliconfig=$(cat $HOME/.azure/config | grep output | awk -F'[ ]' '{print $3}') jqversion=$(jq --version)
if [ "$azurecliconfig" == "json" ]; then if [ $? -eq 0 ]; then
found=$((found +1)) found=$((found + 1))
echo "Found correct azure-cli output configuration: output = $azurecliconfig." echo "Found jq version: $jqversion"
else else
echo "azure-cli is configured for $azurecliconfig output." echo "jq is missing. Please install jq from"
echo "Please reconfigure your azure-cli client to output using json." echo "https://stedolan.github.io/jq/"
fi fi
jqversion=$(jq --version) if [ $found -lt 2 ]; then
if [ $? -eq 0 ]; then exit 1
found=$((found + 1)) fi
echo "Found jq version: $jqversion"
else
echo "jq is missing. Please install jq from"
echo "https://stedolan.github.io/jq/"
fi
if [ $found -lt 3 ]; then
exit 1
fi
} }
askSubscription() { askSubscription() {
az account list -otable az account list -otable
echo "" echo ""
echo "Please enter the Id of the account you wish to use. If you do not see" 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 "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 "If you leave this blank we will use the Current account."
echo -n "> " echo -n "> "
read azure_subscription_id read azure_subscription_id
if [ "$azure_subscription_id" != "" ]; then if [ "$azure_subscription_id" != "" ]; then
az account set --subscription $azure_subscription_id az account set --subscription $azure_subscription_id
else else
azure_subscription_id=$(az account list | jq -r '.[] | select(.isDefault==true) | .id') azure_subscription_id=$(az account list | jq -r '.[] | select(.isDefault==true) | .id')
fi fi
azure_tenant_id=$(az account list | jq -r '.[] | select(.id=="'$azure_subscription_id'") | .tenantId') azure_tenant_id=$(az account list | jq -r '.[] | select(.id=="'$azure_subscription_id'") | .tenantId')
echo "Using subscription_id: $azure_subscription_id" echo "Using subscription_id: $azure_subscription_id"
echo "Using tenant_id: $azure_tenant_id" echo "Using tenant_id: $azure_tenant_id"
} }
askName() { askName() {
echo "" echo ""
echo "Choose a name for your resource group, storage account and client" 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 "client. This is arbitrary, but it must not already be in use by"
echo "any of those resources. ALPHANUMERIC ONLY. Ex: mypackerbuild" echo "any of those resources. ALPHANUMERIC ONLY. Ex: mypackerbuild"
echo -n "> " echo -n "> "
read meta_name read meta_name
} }
askSecret() { askSecret() {
echo "" echo ""
echo "Enter a secret for your application. We recommend generating one with" 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 "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 "generate one for you using openssl. THIS WILL BE SHOWN IN PLAINTEXT."
echo "Ex: mypackersecret8734" echo "Ex: mypackersecret8734"
echo -n "> " echo -n "> "
read azure_client_secret read azure_client_secret
if [ "$azure_client_secret" = "" ]; then if [ "$azure_client_secret" = "" ]; then
azure_client_secret=$(openssl rand -base64 24) azure_client_secret=$(openssl rand -base64 24)
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Error generating secret" echo "Error generating secret"
exit 1 exit 1
fi
echo "Generated client_secret: $azure_client_secret"
fi fi
echo "Generated client_secret: $azure_client_secret"
fi
} }
askLocation() { askLocation() {
az account list-locations -otable az account list-locations -otable
echo "" echo ""
echo "Choose which region your resource group and storage account will be created. example: westus" echo "Choose which region your resource group and storage account will be created. example: westus"
echo -n "> " echo -n "> "
read location read location
} }
createResourceGroup() { createResourceGroup() {
echo "==> Creating resource group" echo "==> Creating resource group"
az group create -n $meta_name -l $location az group create -n $meta_name -l $location
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
azure_group_name=$meta_name azure_group_name=$meta_name
else else
echo "Error creating resource group: $meta_name" echo "Error creating resource group: $meta_name"
return 1 return 1
fi fi
} }
createStorageAccount() { createStorageAccount() {
echo "==> Creating storage account" echo "==> Creating storage account"
az storage account create --name $meta_name --resource-group $meta_name --location $location --kind Storage --sku Standard_LRS az storage account create --name $meta_name --resource-group $meta_name --location $location --kind Storage --sku Standard_LRS
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
azure_storage_name=$meta_name azure_storage_name=$meta_name
else else
echo "Error creating storage account: $meta_name" echo "Error creating storage account: $meta_name"
return 1 return 1
fi fi
} }
createApplication() { createApplication() {
echo "==> Creating application" echo "==> Creating application"
echo "==> Does application exist?" echo "==> Does application exist?"
azure_client_id=$(az ad app list | jq -r '.[] | select(.displayName | contains("'$meta_name'")) ') azure_client_id=$(az ad app list | jq -r '.[] | select(.displayName | contains("'$meta_name'")) ')
if [ "$azure_client_id" != "" ]; then
echo "==> application already exist, grab appId"
azure_client_id=$(az ad app list | jq -r '.[] | select(.displayName | contains("'$meta_name'")) .appId')
else
echo "==> application does not exist"
azure_client_id=$(az ad app create --display-name $meta_name --identifier-uris http://$meta_name --homepage http://$meta_name --password $azure_client_secret | jq -r .appId)
fi
if [ "$azure_client_id" != "" ]; then if [ $? -ne 0 ]; then
echo "==> application already exist, grab appId" echo "Error creating application: $meta_name @ http://$meta_name"
azure_client_id=$(az ad app list | jq -r '.[] | select(.displayName | contains("'$meta_name'")) .appId') return 1
else fi
echo "==> application does not exist"
azure_client_id=$(az ad app create --display-name $meta_name --identifier-uris http://$meta_name --homepage http://$meta_name --password $azure_client_secret | jq -r .appId)
fi
if [ $? -ne 0 ]; then
echo "Error creating application: $meta_name @ http://$meta_name"
return 1
fi
} }
createServicePrincipal() { createServicePrincipal() {
echo "==> Creating service principal" echo "==> Creating service principal"
azure_object_id=$(az ad sp create --id $azure_client_id | jq -r .objectId) azure_object_id=$(az ad sp create --id $azure_client_id | jq -r .objectId)
echo $azure_object_id "was selected." echo $azure_object_id "was selected."
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Error creating service principal: $azure_client_id" echo "Error creating service principal: $azure_client_id"
return 1 return 1
fi fi
} }
createPermissions() { createPermissions() {
echo "==> Creating permissions" echo "==> Creating permissions"
az role assignment create --assignee $azure_object_id --role "Owner" --scope /subscriptions/$azure_subscription_id az role assignment create --assignee $azure_object_id --role "Owner" --scope /subscriptions/$azure_subscription_id
# If the user wants to use a more conservative scope, she can. She must # If the user wants to use a more conservative scope, she can. She must
# configure the Azure builder to use build_resource_group_name. The # configure the Azure builder to use build_resource_group_name. The
# easiest solution is subscription wide permission. # easiest solution is subscription wide permission.
# az role assignment create --spn http://$meta_name -g $azure_group_name -o "API Management Service Contributor" # az role assignment create --spn http://$meta_name -g $azure_group_name -o "API Management Service Contributor"
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Error creating permissions for: http://$meta_name" echo "Error creating permissions for: http://$meta_name"
return 1 return 1
fi fi
} }
showConfigs() { showConfigs() {
echo "" echo ""
echo "Use the following configuration for your packer template:" echo "Use the following configuration for your packer template:"
echo "" echo ""
echo "{" echo "{"
echo " \"client_id\": \"$azure_client_id\"," echo " \"client_id\": \"$azure_client_id\","
echo " \"client_secret\": \"$azure_client_secret\"," echo " \"client_secret\": \"$azure_client_secret\","
echo " \"object_id\": \"$azure_object_id\"," echo " \"object_id\": \"$azure_object_id\","
echo " \"subscription_id\": \"$azure_subscription_id\"," echo " \"subscription_id\": \"$azure_subscription_id\","
echo " \"tenant_id\": \"$azure_tenant_id\"," echo " \"tenant_id\": \"$azure_tenant_id\","
echo " \"resource_group_name\": \"$azure_group_name\"," echo " \"resource_group_name\": \"$azure_group_name\","
echo " \"storage_account\": \"$azure_storage_name\"," echo " \"storage_account\": \"$azure_storage_name\","
echo "}" echo "}"
echo "" echo ""
} }
doSleep() { doSleep() {
local sleep_time=${PACKER_SLEEP_TIME-$create_sleep} local sleep_time=${PACKER_SLEEP_TIME-$create_sleep}
echo "" echo ""
echo "Sleeping for ${sleep_time} seconds to wait for resources to be " echo "Sleeping for ${sleep_time} seconds to wait for resources to be "
echo "created. If you get an error about a resource not existing, you can " echo "created. If you get an error about a resource not existing, you can "
echo "try increasing the amount of time we wait after creating resources " echo "try increasing the amount of time we wait after creating resources "
echo "by setting PACKER_SLEEP_TIME to something higher than the default." echo "by setting PACKER_SLEEP_TIME to something higher than the default."
echo "" echo ""
sleep $sleep_time sleep $sleep_time
} }
retryable() { retryable() {
n=0 n=0
until [ $n -ge $1 ] until [ $n -ge $1 ]
do do
$2 && return 0 $2 && return 0
echo "$2 failed. Retrying..." echo "$2 failed. Retrying..."
n=$[$n+1] n=$[$n+1]
doSleep doSleep
done done
echo "$2 failed after $1 tries. Exiting." echo "$2 failed after $1 tries. Exiting."
exit 1 exit 1
} }
setup() { setup() {
requirements requirements
az login az login
askSubscription askSubscription
askName askName
askSecret askSecret
askLocation askLocation
# Some of the resources take a while to converge in the API. To make the # Some of the resources take a while to converge in the API. To make the
# script more reliable we'll add a sleep after we create each resource. # script more reliable we'll add a sleep after we create each resource.
retryable 3 createResourceGroup retryable 3 createResourceGroup
retryable 3 createStorageAccount retryable 3 createStorageAccount
retryable 3 createApplication retryable 3 createApplication
retryable 3 createServicePrincipal retryable 3 createServicePrincipal
retryable 3 createPermissions retryable 3 createPermissions
showConfigs showConfigs
} }
case "$1" in case "$1" in
requirements) requirements)
requirements requirements
;; ;;
setup) setup)
setup setup
;; ;;
*) *)
showhelp showhelp
;; ;;
esac esac