Thank you very much for your response and for explaining the issue in 
detail.

 I have tried this and it worked as expected. In the playbook which you 
provided below, I  would like to define the "cdu" as a variable since I 
have to identify it dynamically. (Actually, this playbook will be called by 
a bash script which will pass an extra argument to the playbook) I tried to 
do that by modifying the playbook bit. 


 - hosts: CF-DEV-B

  gather_facts: no

  vars:

    SITE: cdu

  tasks:

    - name: restart website service

      win_shell: |

       $site = Get-Website -Name "*'{{ SITE }}'*" | Where-Object { 
$_.Bindings.Collection.bindingInformation -like '*:80:*' }

       $serviceName = "ColdFusion 9 - {0}" -f $site.Name.Split(' ')[0]


       Stop-Service -Name $serviceName

       #Start-Service -Name $serviceName



Also, tried to use the wildcard expression within the curly braces by 
escaping them but I ended up in the error. 

I am sending the error for your reference. 

 FAILED! => {"changed": true, "cmd": "$site = Get-Website -Name \"*'cdu'*\" 
| Where-Object { $_.Bindings.Collection.bindingInformation -like '*:80:*' 
}\n$serviceName = \"ColdFusion 9 - {0}\" -f $site.Name.Split(' 
')[0]\n\nStop-Service -Name $serviceName\n#Start-Service -Name $serviceName"
, "delta": "0:00:00.763000", "end": "2020-07-29 11:31:36.584755", "msg": 
"non-zero 
return code", "rc": 1, "start": "2020-07-29 11:31:35.821755", "stderr": "You 
cannot call a method on a null-valued expression.\r\nAt line:2 char:1\r\n+ 
$serviceName = \"ColdFusion 9 - {0}\" -f $site.Name.Split(' ')[0]\r\n+ 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n    + 
CategoryInfo          : InvalidOperation: (:) [], RuntimeException\r\n    + 
FullyQualifiedErrorId : InvokeMethodOnNull\r\n \r\nStop-Service : Cannot 
bind argument to parameter 'Name' because it is null.\r\nAt line:4 
char:20\r\n+ Stop-Service -Name $serviceName\r\n+                    
~~~~~~~~~~~~\r\n    + CategoryInfo          : InvalidData: (:) 
[Stop-Service], ParameterBindin \r\n   gValidationException\r\n    + 
FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,M 
\r\n   icrosoft.PowerShell.Commands.StopServiceCommand", "stderr_lines": ["You 
cannot call a method on a null-valued expression.", "At line:2 char:1", "+ 
$serviceName = \"ColdFusion 9 - {0}\" -f $site.Name.Split(' ')[0]", "+ 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", "    + 
CategoryInfo          : InvalidOperation: (:) [], RuntimeException", "    + 
FullyQualifiedErrorId : InvokeMethodOnNull", " ", "Stop-Service : Cannot 
bind argument to parameter 'Name' because it is null.", "At line:4 char:20", "+ 
Stop-Service -Name $serviceName", "+                    ~~~~~~~~~~~~", "    + 
CategoryInfo          : InvalidData: (:) [Stop-Service], ParameterBindin ", " 
  gValidationException", "    + FullyQualifiedErrorId : 
ParameterArgumentValidationErrorNullNotAllowed,M ", "   
icrosoft.PowerShell.Commands.StopServiceCommand"], "stdout": "", 
"stdout_lines": []}


Thank you again for your your help on this. 

Regards,
Darshan
On Monday, July 27, 2020 at 5:45:43 PM UTC+9:30, [email protected] wrote:
>
> So breaking down your error message you get the following PowerShell 
> error(s)
>
> FINDSTR: Bad command line
>
> Stop-Service : Cannot find any service with service name 'ColdFusion 9 - '.
> At C:\Users\Administrator\Documents\servicerestart.ps1:7 char:1
>     + Stop-Service -Name "ColdFusion 9 - $ServiceName"
>     + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>     + CategoryInfo : ObjectNotFound: (ColdFusion 9 - :String) 
> [Stop-Service], ServiceCommandException
>     + FullyQualifiedErrorId : 
> NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.StopServiceCommand
>
> Start-Service : Cannot find any service with service name 'ColdFusion 9 - 
> '.
> At C:\Users\Administrator\Documents\servicerestart.ps1:8 char:1
>     + Start-Service -Name "ColdFusion 9 - $ServiceName"
>     + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>     + CategoryInfo : ObjectNotFound: (ColdFusion 9 - :String) 
> [Start-Service], ServiceCommandException
>     + FullyQualifiedErrorId : 
> NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.StartServiceCommand
>
> The first error 'FINDSTR: Bad command line' is saying that the call to 
> findstr in your script didn't have a valid argument. My guess is that 
> 'findstr 
> $SITE' is the culprit and '$SITE' isn't actually set to anything hence it's 
> just calling findstr with no arguments. The remaining 2 errors are due to 
> it trying to restart the service 'ColdFusion 9 - ' with not service name at 
> the end because the first command failed to find a value. My advice to you 
> is to keep things simple and stop mixing files and technologies. You should
>
>    - Stop using findstr and focus on pure PowerShell cmdlets
>    - Get-Website produces an object so there's no reason to parse text as 
>    an output making findstr or other string matching tools unneeded at all
>       - Matching strings can also be dangerous as sometimes strings don't 
>       match the output you expect, a new entry might shift things to places 
> that 
>       you weren't checking before
>       - By utilising PowerShell's object handling you shouldn't have to 
>       match strings unless the object value itself is a string
>       - While it can be possible just embed the script contents in the 
>    win_shell task instead of relying on the file being present on the remote 
>    host
>
> So what I would do is the following win_shell task
>
> - name: restart website service
>   win_shell: |
>     $site = Get-Website -Name '*cdu*' | Where-Object { 
> $_.Bindings.Collection.bindingInformation -like '*:80:*' }
>     $serviceName = "ColdFusion 9 - {0}" -f $site.Name.Split(' ')[0]
>
>     Stop-Service -Name $serviceName
>     Start-Service -Name $serviceName
>
> This will get any site that matches the name '*cdu*' and has a binding on 
> port 80. I'm not sure where the findstr production aspect comes here so if 
> you need any futher help filtering the object I would need to know more 
> information about the environment. I also used the yaml multiline string 
> format 'key: |' where the next indented lines are treated like a normal 
> string value. This pretty much enables you to inline the PowerShell script 
> in the task itself keeping the task closer to what it is actually doing.
>
> On Monday, July 27, 2020 at 2:29:32 PM UTC+10 [email protected] wrote:
>
>> Hello All,
>>
>> I have a PowerShell script that actually takes an argument and 
>> stops/starts a service based on the argument passed. 
>>
>> The script works well on the Windows machine when running locally. But 
>> fails when attempted to run via Ansible playbook. 
>> I am posting a stack overflow link in the email which has full details of 
>> the issue. 
>>
>>
>> https://stackoverflow.com/questions/63100158/powershell-script-runs-locally-fine-but-throws-error-when-executed-via-ansibble?noredirect=1#comment111595021_63100158
>> Any support on this would be much appreciable. 
>>
>> Sorry for not including all the details on the email. I believe it is 
>> more readable on stack-overflow. 
>>
>> Regards,
>> Darshan
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/e9643bc1-5a04-430b-a08f-494910e13e3do%40googlegroups.com.

Reply via email to