Revert "azure-cli output config check added"
This reverts commit 0f0fc1b99c
.
This commit is contained in:
parent
0f0fc1b99c
commit
e911f03b6d
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue