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

Я пытаюсь переименовать имя хоста и добавить в 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>

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Как я уже говорил в комментариях к предыдущему ответу, у меня было 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 при запуске сервера.

0 голосов
/ 02 ноября 2018

Стоит прочитать документацию 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>, а затем попытаться отключить его функциональность, я бы удалил тег persist и вызвал InitializeInstance.ps1 –Schedule ( ссылка на документацию ) в вашем if для условий, которые вы хотите, чтобы пользовательские данные перезапускались:

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'
}
...