Thanks a ton. It works as expected now. I appreciate your support. Have a great day ahead. Stay safe.
Regards, Darshan On Thursday, July 30, 2020 at 1:08:03 PM UTC+9:30, [email protected] wrote: > > This part '"*'{{ SITE }}'*"' means it will template the raw PowerSHell > script as 'Get-WebSite -Name "*'cdu'*" (with the inner single quotes). My > guess is you want this to be 'Get-Website -Name "*{{ SITE }}*"'. There's no > need to quote a jinja2 block unless you are starting the YAML value with {. > > I would test to see once you've fixed the Name part to see if it even > found any websites. It's best to make sure that this has returned the site > you need before trying to integrate it into the script. > On Thursday, July 30, 2020 at 9:44:14 AM UTC+10 [email protected] wrote: > >> 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/e9012ea3-79e6-4bec-9668-9fdad0f558dao%40googlegroups.com.
