Передача нескольких параметров в одном скрипте хранилища Azure для различных сред - PullRequest
0 голосов
/ 12 мая 2019

У меня есть сценарий powershell, который создает учетную запись хранилища и BLOB-объектов для данной подписки, которая работает нормально. Имя подписки, группа ресурсов постоянно меняется для разных сред, таких как DEV, UAT, PROD

СТРУКТУРА МОЕГО ШАБЛОНА / КОДА:


param(

 [string] $subscriptionName ="ABC",
 [string] $resourceGroupName = "XYZ",
 [string] $resourceGroupLocation ="westus",
 [string] $templateFilePath = "template.json",
 [string] $parametersFilePath = "parameters.json"
)

Function RegisterRP {
    Param(
        [string]$ResourceProviderNamespace
    )

    Write-Host "Registering resource provider '$ResourceProviderNamespace'";
    Register-AzureRmResourceProvider -ProviderNamespace $ResourceProviderNamespace;
}

$ErrorActionPreference = "Stop"
$confirmExecution = Read-Host -Prompt "Hit Enter to continue."
if($confirmExecution -ne '') {
    Write-Host "Script was stopped by user." -ForegroundColor Yellow
    exit
} 
# sign in
Write-Host "Logging in...";
Login-AzureRmAccount;

# select subscription
Write-Host "Selecting subscription '$subscriptionName'";
Select-AzureRmSubscription -SubscriptionName $subscriptionName;

# Register RPs
$resourceProviders = @("microsoft.storage");
if($resourceProviders.length) {
    Write-Host "Registering resource providers"
    foreach($resourceProvider in $resourceProviders) {
        RegisterRP($resourceProvider);
    }
}

#Create or check for existing resource group
$resourceGroup = Get-AzureRmResourceGroup -Name $resourceGroupName -ErrorAction SilentlyContinue
if(!$resourceGroup)
{
    Write-Host "Resource group '$resourceGroupName' does not exist. To create a new resource group, please enter a location.";
    if(!$resourceGroupLocation) {
        $resourceGroupLocation = Read-Host "resourceGroupLocation";
    }
    Write-Host "Creating resource group '$resourceGroupName' in location '$resourceGroupLocation'";
    New-AzureRmResourceGroup -Name $resourceGroupName -Location $resourceGroupLocation
}
else{
    Write-Host "Using existing resource group '$resourceGroupName'";
}

# Start the deployment
Write-Host "Starting deployment...";
if(Test-Path $parametersFilePath) {
   New-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName -Name $deploymentName -TemplateFile $templateFilePath -TemplateParameterFile $parametersFilePath -storageAccounts_name $storageAccountName
} else {
   New-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName -Name $deploymentName -TemplateFile $templateFilePath; -storageAccounts_name $storageAccountName
}

Подход 1: Создано несколько сценариев PowerShell для каждой среды Создан 1 Сценарий PowerShell на основе меню, который вызывает другой скрипт и выполняется следующим образом: Выберите 1 для Dev, 2 для UAt, 3 для PROD, этот подход работает, но не эффективен.

Подход 2:

Я хотел бы объединить все сценарии и иметь только один сценарий для всех сред, а выбор на основе должен позволить мне создавать учетные записи хранения. Только изменение подписки и группы ресурсов, остальная структура PowerShell остается неизменной.

Я попытался использовать командлеты функции GET, и он выбирает, но все равно выдает ошибку



 [string] $subscriptionName = Get-AzureSubscription,
 [string] $resourceGroupName = Get-AzureRmLocation,


Если я попытаюсь использовать его, используя подход на основе массива, например, передачу значений, как показано ниже, я не смогу понять, как передать эти значения на основе массива в код и заставить его работать.

$environment=@('DEV','TEST','QA','PROD')
$resourcegroupname = @('test','test1','test2','test3')
$subscriptionName = @('devsub1','devsub2','test3','prod4')

Я пытаюсь вызвать функции, используя:

$environment[0]
$subscriptionName[0]

Возвращает значение, как показано ниже, если я выполняю его отдельно, но как передать эти значения в мой сценарий для создания учетной записи хранения?

DEV 
devsub1 

Запрос помощи эксперта, если кто-то сталкивался с такими сценариями ранее, и если вы можете помочь изменить вышеуказанный код и предоставить проверенный код, который будет очень полезен.

ПОДХОД 3:


$subscription = @(Get-AzureRmSubscription)
$resourcegroup = @(Get-AzureRmResourceGroup)
$Environment = @('DEV','TEST','QA','PROD')
$resourceGroupName = $resourcegroup | Out-GridView -PassThru -Title 'Pick the environment'
$subscriptionName = $subscription | Out-GridView -PassThru -Title 'Pick the subscription'

Write-Host "Subscription:" $subscriptionName
Write-Host "ResourceGroup:" $resourcegroup

ВЫХОД:
Если вы посмотрите на группу ресурсов, она не сможет выбрать опцию для группы ресурсов.

Подписка: <возвращает имя подписки>
ResourceGroup: Microsoft.Azure.Commands.ResourceManager.Cmdlets.SdkModels.PSResourceGroup Microsoft.Azure.Commands.ResourceManager.Cmd lets.SdkModels.PSResourceGroup Microsoft.Azure.Commands.ResourceManager.Cmdlets.SdkModels.PSResourceGroup Microsoft.Azure.Commands.Res ourceManager.Cmdlets.SdkModels.PSResourceGroup


1 Ответ

0 голосов
/ 12 мая 2019

То, что вы предлагаете, является интересным подходом. Я бы, скорее всего, использовал входной параметр, который определяет, в какой среде будет выполняться работа, а затем имел бы условный блок, который устанавливает динамические переменные для этой среды. Было бы некоторое дублирование кода инициализации для каждой среды, но основной блок кода все равно был бы унифицирован.

...