EC2 User data - отключите его после того, как все условия будут выполнены в пользовательских данных.

Я пытаюсь переименовать имя хоста и добавить в AD точечного экземпляра. Это простой скрипт powershell. Я прочитал документы, которые по умолчанию пользовательские данные будут отключены после того, как они будут выполнены один раз, и если <persist>true</persist> используется, он не будет отключен.

Я думаю, что где-то видел (это позволяет запускаться при каждом запуске) осуществляется с помощью taskcheduler, но не могу найти ссылку.

Может кто-то указать мне на работу планировщика задач или способ вручную отключить пользовательские данные, как только мой if условия соблюдены.

<powershell>
Set-ExecutionPolicy unrestricted -Force

$instanceName = "test-name5"

$username = "domain\username"
$password = "password" | ConvertTo-SecureString -AsPlainText -Force
$cred = New-Object -typename System.Management.Automation.PSCredential($username, $password)


Start-Sleep -s 5

$hostname = hostname
$domain = (Get-WmiObject win32_computersystem).Domain
if (!($hostname -eq $instanceName)){
     Rename-Computer -NewName $instanceName -restart -force
}Elseif (!($domain -eq 'my.domain.local')){
     Start-Sleep -s 5
     Add-Computer -DomainName my.domain.local -OUPath "OU=Windows,OU=QAServers,OU=Servers,DC=my,DC=domain,DC=local" -Credential $cred -Force -Restart -erroraction 'stop'
}Else {
     ####code to disable the running of userdata once above conditions 
     are met####
}
</powershell>
<persist>true</persist>

3 ответа

Решение

Стоит прочитать документацию по ec2config-service, так как там есть ссылка на нужный параметр.

Вы хотите Ec2HandleUserData настройка, которая настраивается в Config.xml,

Powershell может легко обновить этот параметр:

$path = 'C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml'
$xml = [xml](Get-Content $path)
$state = $xml.Ec2ConfigurationSettings.Plugins.Plugin | where {$_.Name -eq 'Ec2HandleUserData'}
$state.State = 'Disabled'
$xml.Save($path)

Я использую этот код при создании пользовательских AMI для повторного включения обработки пользовательских данных ($state.State = 'Enabled').


РЕДАКТИРОВАТЬ: выше для ec2config не ec2launch это то, что использует ОП. Я пропустил это изначально.

В этом случае я думаю, что вам нужно изменить способ выполнения сценария, а не использовать <persist> а затем попытаться отключить его функциональность, я бы удалил тег и сохраняю InitializeInstance.ps1 –Schedule ( ссылка на документацию) в вашем if для условий, которые вы хотите перезапустить userdata:

if ($hostname -ne $instanceName) {
    & C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 -Schedule
    Rename-Computer -NewName $instanceName -Restart -Force
}
elseif ($domain -ne 'my.domain.local') {
    & C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 -Schedule
    Add-Computer -DomainName aws.macmillan.local -OUPath "OU=Windows,OU=QAServers,OU=Servers,DC=my,DC=domain,DC=local" -Credential $cred -Force -Restart -ErrorAction 'stop'
}

Как я уже говорил в комментариях к предыдущему ответу, у меня было 3 варианта, и, поскольку я нашел запланированное задание aws, я выбрал последний вариант. Отвечая на мой собственный вопрос, так как будет легко определить код.

<powershell>
Set-ExecutionPolicy unrestricted -Force

#Enter instance hostname here 
$instanceName = "test-name8"

$username = "domain\username"
#Using ssm parameter store to avoid having the password in plaintext
$password = (Get-SSMParameterValue -Name AD-Password -WithDecryption $True -Region us-east-1).Parameters[0].Value | ConvertTo-SecureString -asPlainText -Force
Start-Sleep -s 3
$cred = New-Object -typename System.Management.Automation.PSCredential($username, $password)


Start-Sleep -s 5

$hostname = hostname
$domain = (Get-WmiObject win32_computersystem).Domain
if ($hostname -ne $instanceName){
     Rename-Computer -NewName $instanceName -restart -force
}Elseif ($domain -ne 'my.domain.local'){
     Start-Sleep -s 5
     Add-Computer -DomainName my.domain.local -OUPath "OU=Windows,OU=QAServers,OU=Servers,DC=my,DC=domain,DC=local" -Credential $cred -Force -Restart -erroraction 'stop'
}Else {
     Disable-ScheduledTask -TaskName "Amazon Ec2 Launch - Userdata Execution"
     Unregister-ScheduledTask -TaskName "Amazon Ec2 Launch - Userdata Execution"
}
</powershell>
<persist>true</persist>

примечание: для запуска этой команды параметра ssm должна быть прикреплена роль с политиками ssm при запуске сервера.

Я решал аналогичную проблему, и мне пришлось изменить имя хоста Windows Server 2016 и зарегистрировать его в Elastic Server Fleet. Также я не мог разрешить перезагрузку экземпляра. Я использовал этот код, чтобы решить эту проблему.

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

      <powershell>
$ComputerName = "MyPCRandomName"
Set-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -name "Hostname" -value $ComputerName
elastic-agent enroll --enrollment-token 123 --url=321
</powershell>
Другие вопросы по тегам