我必须认为这是一个已经解决的问题,但我只是没有让它发挥作用。所以我带着这个问题来找你StackOverflow:
我有一台运行在amazon ec2中的Windows Server 2016机器。我在config目录中有一个machine.ps1脚本。
我创建了一个盒子的图像。 (我试过检查noreboot并取消选中它) 当我创建一个新的图像实例时,我希望它在启动时运行machine.ps1来设置计算机名称,然后为该框设置路由和一些配置设置。目标是在不登录框的情况下执行此操作。
我已阅读并尝试过: Running Powershell scripts at Start up 并使用它来确保用户数据传入: EC2 Powershell Launch Tools
我已经尝试设置一个在启动时运行machine.ps1的计划任务(它只是挂起) 我在启动任务中看到了initializeInstance.ps1,并试图甚至合作替换该行来运行userdata与该行来运行我的脚本。什么都没有。
如果我登录到该框并运行machine.ps1,它将重新启动计算机并设置计算机名称,然后我需要再次运行它来设置路由。这是手动工作。我只需要找到一种自动化的方法。
我想从powershell启动这些实例,而不是启动配置和自动缩放。
答案 0 :(得分:0)
您可以使用用户数据 无论何时部署新服务器,工作站或虚拟机,几乎总是需要在系统准备好使用之前对系统进行最终更改。通常,这通常使用可能在启动时手动触发的部署后脚本完成,也可能是Configuration Manager任务序列中的最后一步,或者如果使用Azure,则可以使用自定义脚本扩展。那么如何在Amazon Web Services(AWS)中使用EC2实例实现类似的功能呢?如果您已经创建了自己的亚马逊机器映像(AMI),则可以将脚本设置为从Runonce注册表项运行,但这可能是一种麻烦的方法,特别是如果您要对脚本进行更改并将其嵌入到映像中。 AWS提供了一种更加动态的方法来注入脚本,以便在启动时通过称为用户数据的功能运行。
请参阅以下链接:
答案 1 :(得分:0)
Windows通常不允许Powershell脚本调用另一个Powershell脚本,除非它以管理员身份运行。这是一个奇怪的“安全”功能。但是,完全可以加载ps1文件并使用其中的任何功能。
UserData脚本通常作为“系统”运行。您会认为这会通过要求。但是失败了...
解决方案:而是将所有脚本转换为powershell函数。
在您的machine.ps1中-使用函数语法包装内容
function MyDescriptiveName { <original script contents> }
然后在UserData中-使用类似这样的功能
# To use a relative path
Set-Location -Path <my location>
# Load script file into process memory
. <full-or-relpath>/machine.ps1
# Call function
MyDescriptiveName <params-if-applicable>
如果该函数需要调用其他函数(又称脚本),则需要将这些脚本放入函数中,并将脚本文件也加载到UserData中的进程存储器中。