Я пытаюсь автоматизировать создание виртуальных машин Windows в Azure, используя шаблон и DSC. Мои коллеги знакомы с шаблонами, но не с PowerShell, и я хочу как можно меньше взаимодействовать с DSC или выполнять командлеты. Если я не могу сделать все с помощью шаблона, я хочу использовать портал Azure.
Я изо всех сил пытаюсь найти не-PowerShell способ добавления пользователей и групп в локальную группу администраторов. То, что я думаю, будет самым простым процессом, это:
В шаблоне есть параметр с именем membersOfLocalAdmins
. Его значение будет одной строкой типа mydomain\username,mydomain\groupname...
.
Шаблон создает переменную в учетной записи автоматизации, которая называется membersOfLocalAdmins-*New VM Name*
. Его значение - строка администраторов.
Конфигурация DSC должна прочитать эту переменную. В настоящее время у него есть параметр для имени виртуальной машины. На портале Azure мы перейдем к учетной записи Automation, выберите конфигурацию и нажмите Compile. Мы видим запрос на имя виртуальной машины и вводим его, нажимаем OK.
Конфигурация DSC должна прочитать переменную учетной записи автоматизации, которая называется membersOfLocalAdmins-*New VM Name*
. Затем разбейте значение переменной на массив и получите его в ресурс группы. Я попробовал что-то вроде этого кода ниже, но он не скомпилируется, я думаю, что единственное место в конфигурации, где я могу использовать PowerShell - это ресурс сценария. Есть ли способ сделать это или лучше?
Я также столкнулся с проблемой, когда форма конфигурации DSC компиляции на портале Azure не может принимать массивы. Читается mydomain\username,mydomain\groupname...
как одна строка. Это нормально, если я могу использовать PowerShell, чтобы разделить его, прежде чем он попадет в ресурс группы. Но куда бы я поместил этот PowerShell в конфигурации?
Я думаю, что мне придется использовать ресурс Script, разделить строку на массив и добавить ее к администраторам самостоятельно. Грязное.
$DomainUserName = Get-AutomationVariable -Name 'Internal_Domain_Username'
$DomainUserPassword = Get-AutomationVariable -Name 'Internal_Domain_Password'
$DomainCredential = New-Object -TypeName System.Management.Automation.PSCredential($DomainUserName, (ConvertTo-SecureString $DomainUserPassword -AsPlainText -Force))
Configuration TestConfiguration1Win10 {
param(
[string[]]$ComputerName = "localhost"
,
[string[]]$membersOfLocalAdmins
)
# This if statement here causes the compile to fail. Is there anywhere else in the configuration I could put it?
if (!$membersOfLocalAdmins){
$membersOfLocalAdmins = $(Get-AutomationVariable -Name "membersOfLocalAdmins-@($ComputerName)[0]").Split(',')
}
Import-DscResource –ModuleName 'PSDesiredStateConfiguration'
Import-DSCResource -Module xNetworking -Name xFirewallProfile
Import-DSCResource -Module xSystemSecurity -Name xIEEsc
Import-DscResource -ModuleName DeleteDscTmpFile
Node $ComputerName {
Group AddToLocalAdmins {
GroupName ='Administrators'
Ensure = 'Present'
MembersToInclude = $membersOfLocalAdmins
Credential = $DomainCredential
}