Я пытаюсь автоматизировать создание виртуальных машин Windows в Azure, используя шаблон и DSC. Мои коллеги знакомы с шаблонами, но не с PowerShell, и мне нужно как можно меньше взаимодействовать с DSC или запускаемыми командлетами. Если я не могу делать все с помощью шаблона, я хочу использовать портал Azure.
Я изо всех сил пытаюсь найти способ, отличный от PowerShell, для добавления пользователей и групп в локальную группу администраторов. Я думаю, что самый простой процесс:
В шаблоне есть параметр
membersOfLocalAdmins
. Его значение будет одной строкой типаmydomain\username,mydomain\groupname...
.Шаблон создает переменную в учетной записи автоматизации под названием
membersOfLocalAdmins-*New VM Name*
. Его значение - строка администраторов.Конфигурация DSC должна прочитать эту переменную. В настоящее время у него есть параметр для имени виртуальной машины. На портале Azure мы перейдем в учетную запись службы автоматизации, выберем конфигурацию и нажмем «Скомпилировать». Видим запрос имени ВМ и набираем его, жмем ОК.
Конфигурация DSC должна будет прочитать переменную учетной записи автоматизации с именем membersOfLocalAdmins-*New VM Name*
. Затем разделите значение переменной на массив и перенесите его в ресурс Group. Я пробовал что-то вроде этого кода ниже, но он не компилируется, я думаю, что единственное место в конфигурации, где я могу использовать PowerShell, - это ресурс скрипта. Есть ли способ сделать это или лучший способ?
Я также столкнулся с проблемой, когда форма конфигурации компиляции DSC на портале Azure не может принимать массивы. Он читает mydomain\username,mydomain\groupname...
как одну строку. Это нормально, если я могу использовать PowerShell, чтобы разделить его до того, как он попадет в ресурс Group. Но где бы я поместил эту 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
}