EC2用户数据-在满足用户数据中的所有条件后将其禁用

时间:2018-11-02 14:31:03

标签: powershell amazon-ec2 aws-automation

我正在尝试重命名主机名并将其添加到竞价型实例的AD。这是一个简单的powershell脚本。我已经阅读了文档,默认情况下,一次执行后,用户数据将被禁用;如果使用<persist>true</persist>,则不会被禁用。

我想我看到某个地方(每次启动都可以运行)是通过taskscheduler完成的,但是找不到链接。

有人满足我的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 :(得分:1)

正如我在上一个答案的评论中所说,我有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 parameter命令才能起作用。

答案 1 :(得分:0)

值得一读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,这是OP所使用的。我本来想念这个的。

在这种情况下,我认为您需要更改脚本的运行方式,而不是使用<persist>,然后尝试禁用其功能,我将删除persist标签并调用InitializeInstance.ps1 –Schedule({{ 3}})中的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'
}