添加Deployment段后OpenStack Heat模板PowerShell命令无法执行求助
First, let's tackle the immediate issue with your template failing after adding the OS::Heat::SoftwareDeployment resource. I spot a couple of critical mistakes that are likely causing the failure:
1. Typos in Outputs
In your outputs section, you have {get_attr: [deployent]} — that's a typo! It should be deployment (missing an 'm'). That alone would break template validation or execution.
2. Incorrect SoftwareConfig Group for PowerShell
You're using group: ungrouped for your PowerShell script, but for Windows instances, you should explicitly set group: Powershell to ensure Heat handles the script correctly as a PowerShell execution.
3. Missing Signal Transport (Optional but Recommended)
For Windows deployments, adding signal_transport: TEMP_URL_SIGNAL or NO_SIGNAL helps Heat properly track the deployment status. Without it, Heat might wait indefinitely for a signal that never arrives, causing timeouts.
Corrected Template Snippet
Here's the fixed version of your relevant resources and outputs:
heat_template_version: 2016-10-14 description: Template to install HyperV Feature in Server parameters: parameter1: type: string description: Sample parameter for the script volumename: type: string description: Name for the Cinder volume resources: # ... (keep your existing floating_ip, instance, volume resources as-is) ps_script: type: OS::Heat::SoftwareConfig properties: group: Powershell # Fixed group for Windows PowerShell config: str_replace: template: | #ps1_sysnative $logPath = "C:\check_file.txt" $log = New-Item $logPath -Type File -Force # Use -Force to overwrite if exists Start-Sleep -Seconds 20 # Capture the output of the feature install $installOutput = Install-WindowsFeature -Name DNS -IncludeManagementTools -Verbose $installOutput | Out-File -FilePath $logPath -Append Start-Sleep -Seconds 60 $pass = "_parameter_1_" Add-Content $logPath $pass # Optional: Send a signal back to Heat with the log content Write-Output $installOutput | ConvertTo-Json | heat-signal params: _parameter_1_: {get_param: parameter1} deployment: type: OS::Heat::SoftwareDeployment properties: config: {get_resource: ps_script} server: {get_resource: instance} signal_transport: TEMP_URL_SIGNAL # Add this for proper status tracking outputs: instance_ip: description: Ipaddress value: {get_attr: [instance, addresses]} result: description: Checkoutput value: {get_attr: [deployment, output]} # Use 'output' attribute to get deployment results
Alternative Methods to Capture PowerShell Output
If you still run into issues with the deployment resource, here are other reliable ways to get your script's output:
Directly Write to a Log File + Retrieve via Remote Access:
Your script already writes toC:\check_file.txt. Once the instance is up, you can RDP into it or use PowerShell Remoting to pull the log file. For example:Invoke-Command -ComputerName <instance-ip> -ScriptBlock { Get-Content C:\check_file.txt } -Credential $credUse Cloud-Init Logs:
Windows instances with cloud-init will log PowerShell script execution inC:\ProgramData\cloud-init\log\cloud-init.log. You can check this file for any errors or output from your script.Send Output to Heat via
heat-signal:
As shown in the corrected script, usingheat-signal(available in the Heat agent on Windows) lets you send custom output back to the deployment resource. This output will be available in thedeploymentresource'soutputattribute, which you can expose in your template outputs.
I've helped several users troubleshoot similar Heat deployment issues with Windows instances, and fixing the group setting, typos, and adding signal transport usually resolves most execution failures.
内容的提问来源于stack exchange,提问作者hgoyal

