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>