【问题标题】:EC2 Windows User Data: Powershell does not run as expectedEC2 Windows 用户数据:Powershell 未按预期运行
【发布时间】:2017-11-06 15:50:56
【问题描述】:

我正在尝试通过用户数据中的 Powershell 命令引导 EC2 Windows 实例。我试图通过用户数据执行的步骤是:

  • 安装巧克力
  • 使用 Chocolatey 安装 Python
  • 使用 Chocolatey 安装 AWS CLI
  • 使用 AWS CLI 从 S3 下载 Powershell 脚本
  • 运行那个 Powershell 脚本

用户数据非常简单:

<powershell>
Set-ExecutionPolicy Bypass -Force;
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'));
choco install python3 -y;
choco install awscli -y

refreshenv

$BootstrapScript = (Join-Path $env:TEMP "NewBootstrap.ps1")
& aws s3api get-object --bucket my-bucket-name --key bootstrap/WindowsBootstrap.ps1 "$BootstrapScript"

iex "$BootstrapScript"
</powershell>

引导脚本永远不会被下载或执行。如果我登录到实例并查看日志,输出表明正在发生一些奇怪的事情:

  • 在日志顶部有抱怨'aws' is not recognized as the name of a cmdlet 的错误。为什么在尝试安装 aws cli 之前会出现此错误?
  • 之后the term 'C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1' is not recognized as the name of a cmdlet, function, script file。再说一遍 - 为什么在我们尝试获取该文件之前出现此错误?
  • 然后日志显示 choco、python 和 awscli 实际上正确安装。

我不明白执行顺序发生了什么。如果我登录该框并执行包含在 C:\Windows\Temp 中的完全相同的用户数据脚本,它将完全按预期运行。

任何有关理解或调试的帮助将不胜感激。

C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log 的输出,为简洁起见省略了一些 choco 输出

2017/11/06 12:11:49Z: Userdata execution begins
2017/11/06 12:11:49Z: Zero or more than one <persist> tag was not provided
2017/11/06 12:11:49Z: Unregistering the persist scheduled task
2017/11/06 12:11:54Z: Zero or more than one <runAsLocalSystem> tag was not provided
2017/11/06 12:11:54Z: Zero or more than one <script> tag was not provided
2017/11/06 12:11:54Z: Zero or more than one <powershellArguments> tag was not provided
2017/11/06 12:11:54Z: <powershell> tag was provided.. running powershell content
2017/11/06 15:13:42Z: Userdata execution begins
2017/11/06 15:13:42Z: Zero or more than one <persist> tag was not provided
2017/11/06 15:13:42Z: Unregistering the persist scheduled task
2017/11/06 15:13:54Z: Zero or more than one <runAsLocalSystem> tag was not provided
2017/11/06 15:13:54Z: Zero or more than one <script> tag was not provided
2017/11/06 15:13:54Z: Zero or more than one <powershellArguments> tag was not provided
2017/11/06 15:13:55Z: <powershell> tag was provided.. running powershell content
2017/11/06 15:16:11Z: Userdata:  is currently executing. To end it kill the process with id: 2828
2017/11/06 15:17:40Z: Message: The errors from user scripts: & : The term 'aws' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the 
spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\Windows\TEMP\UserScript.ps1:15 char:3
+ & aws s3api get-object --bucket my-bucket-name --key bootstra ...
+   ~~~
    + CategoryInfo          : ObjectNotFound: (aws:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1 : The term 
'C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1' is not recognized as the name of a cmdlet, function, 
script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is 
correct and try again.
At line:1 char:1
+ C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Users\Admini...ewBootstrap.ps1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException


2017/11/06 15:17:40Z: Message: The output from user scripts: This is the new bootstrap

Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
d-----        11/6/2017   3:14 PM                chocInstall                                                           
Getting latest version of the Chocolatey package for download.
Getting Chocolatey from https://chocolatey.org/api/v2/package/chocolatey/0.10.8.

... Chocolatey Install output ...

Chocolatey (choco.exe) is now ready.
You can call choco from anywhere, command line or powershell by typing choco.
Run choco /? for a list of functions.
You may need to shut down and restart powershell and/or consoles
 first prior to using choco.
Ensuring chocolatey commands are on the path
Ensuring chocolatey.nupkg is in the lib folder
Installing awscli
Chocolatey v0.10.8
Installing the following packages:
python3


 .. Python Download / Install output ...

Download of python-3.6.3-amd64.exe (30.16 MB) completed.
Hashes match.
Installing python3...
python3 has been installed.
Installed to 'C:\Python36'
  python3 can be automatically uninstalled.
Environment Vars (like PATH) have changed. Close/reopen your shell to
 see the changes (or in powershell/cmd.exe just type `refreshenv`).
 The install of python3 was successful.
  Software installed as 'EXE', install location is likely default.

Chocolatey installed 1/1 packages. 
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).
Chocolatey v0.10.8
Installing the following packages:
awscli

 .. AWS CLI Download / Install output ...

 The install of awscli was successful.
  Software installed as 'msi', install location is likely default.

Chocolatey installed 1/1 packages. 
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).
Refreshing environment variables from registry for cmd.exe. Please wait...Finished..

2017/11/06 15:17:40Z: Userdata execution done

【问题讨论】:

    标签: windows powershell amazon-web-services amazon-ec2 user-data


    【解决方案1】:

    问题是,当作为云初始化进程的一部分安装时,Powershell 配置文件无法导入 Chocolatey。这意味着软件包将通过choco install 正常安装,但在环境中不可用,即使您调用refreshenv(因此即使安装成功,我对aws 的调用也失败。)

    要解决此问题,您可以通过编辑您的 Powershell 配置文件手动强制 Powershell 导入 Chocolatey 模块。

    # Updated profile content to explicitly import Choco
    $ChocoProfileValue = @'
    $ChocolateyProfile = "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1"
    if (Test-Path($ChocolateyProfile)) {
      Import-Module "$ChocolateyProfile"
    }
    '@
    
    # Write it to the $profile location
    Set-Content -Path "$profile" -Value $ChocoProfileValue -Force
    
    # Source it
    . $profile
    

    您可以在chocolatey troubleshooting guide 中阅读更多信息

    【讨论】:

      猜你喜欢
      • 2020-06-02
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 2014-11-12
      • 1970-01-01
      相关资源
      最近更新 更多