I have started trying to replicate some of the things that we are currently doing with Chef, but with Ansible. One of these is installing Microsoft Sharepoint (on Windows 2008 R2).
In Chef, I do this using some Powershell scripting, so I am trying to do that with Ansible.
I am using this simple Playbook which I found and modified to run a Powershell script:
It seems like when the .ps1 is run under Ansible, the two lines with “Start-Process” are not executing. The first one, which runs setup.exe is supposed to cause copying the Sharepoint files, etc. and then the second is supposed to run psconfig.exe.
I’ve also tried modifying the ps1 file to eliminate the “Start-Process” and then run the playbook again, but it seems to hang. I can tell because when this script runs normally (not with Ansible) it creates some directories and files on E:, but when i run under Ansible, nothing is being created on E:.
FYI, I’ve also tried changing from using Start-Process to Invoke-Command, but it still seems to do the same thing (hangs) when I try to run the ps1 via Ansible. I don’t know if this’ll help, but here’s the output with -vvvv:
Enter code here...
[root@centos65 ansible_test]# ansible windows -i host -m installit -vvvv
<ansibleclient1.whatever.com> ESTABLISH WINRM CONNECTION FOR USER: administrator on PORT 5985 TO ansibleclient1.whatever.com
<ansibleclient1.whatever.com> WINRM CONNECT: transport=plaintext endpoint=http://ansibleclient1.whatever.com:5985/wsman
<ansibleclient1.whatever.com> REMOTE_MODULE installit
<ansibleclient1.whatever.com> EXEC (New-Item -Type Directory -Path $env:temp -Name “ansible-tmp-1438288265.32-170673722533874”).FullName | Write-Host -Separator ‘’;
<ansibleclient1.whatever.com> WINRM EXEC ‘PowerShell’ [‘-NoProfile’, ‘-NonInteractive’, ‘-EncodedCommand’, ‘KABOAGUAdwAtAEkAdABlAG0AIAAtAFQAeQBwAGUAIABEAGkAcgBlAGMAdABvAHIAeQAgAC0AUABhAHQAaAAgACQAZQBuAHYAOgB0AGUAbQBwACAALQBOAGEAbQBlACAAIgBhAG4AcwBpAGIAbABlAC0AdABtAHAALQAxADQAMwA4ADIAOAA4ADIANgA1AC4AMwAyAC0AMQA3ADAANgA3ADMANwAyADIANQAzADMAOAA3ADQAIgApAC4ARgB1AGwAbABOAGEAbQBlACAAfAAgAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAtAFMAZQBwAGEAcgBhAHQAbwByACAAJwAnADsA’]
<ansibleclient1.whatever.com> WINRM RESULT <Response code 0, out “C:\Users\Administrat”, err “”>
<ansibleclient1.whatever.com> PUT /tmp/tmpJaC2C3 TO C:\Users\Administrator\AppData\Local\Temp\ansible-tmp-1438288265.32-170673722533874\installit
<ansibleclient1.whatever.com> WINRM PUT /tmp/tmpJaC2C3 to C:\Users\Administrator\AppData\Local\Temp\ansible-tmp-1438288265.32-170673722533874\installit.ps1 (offset=0 size=2030)
<ansibleclient1.whatever.com> WINRM PUT /tmp/tmpJaC2C3 to C:\Users\Administrator\AppData\Local\Temp\ansible-tmp-1438288265.32-170673722533874\installit.ps1 (offset=2030 size=2030)
<ansibleclient1.whatever.com> WINRM PUT /tmp/tmpJaC2C3 to C:\Users\Administrator\AppData\Local\Temp\ansible-tmp-1438288265.32-170673722533874\installit.ps1 (offset=4060 size=2030)
<ansibleclient1.whatever.com> WINRM PUT /tmp/tmpJaC2C3 to C:\Users\Administrator\AppData\Local\Temp\ansible-tmp-1438288265.32-170673722533874\installit.ps1 (offset=6090 size=2008)
<ansibleclient1.whatever.com> PUT /tmp/tmputTM97 TO C:\Users\Administrator\AppData\Local\Temp\ansible-tmp-1438288265.32-170673722533874\arguments
<ansibleclient1.whatever.com> WINRM PUT /tmp/tmputTM97 to C:\Users\Administrator\AppData\Local\Temp\ansible-tmp-1438288265.32-170673722533874\arguments (offset=0 size=2)
<ansibleclient1.whatever.com> EXEC PowerShell -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -File C:\Users\Administrator\AppData\Local\Temp\ansible-tmp-1438288265.32-170673722533874\installit.ps1 C:\Users\Administrator\AppData\Local\Temp\ansible-tmp-1438288265.32-170673722533874\arguments; Remove-Item "C:\Users\Administrator\AppData\Local\Temp\ansible-tmp-1438288265.32-170673722533874" -Force -Recurse;
<ansibleclient1.whatever.com> WINRM EXEC ‘PowerShell’ [‘-NoProfile’, ‘-NonInteractive’, ‘-EncodedCommand’, ‘UABvAHcAZQByAFMAaABlAGwAbAAgAC0ATgBvAFAAcgBvAGYAaQBsAGUAIAAtAE4AbwBuAEkAbgB0AGUAcgBhAGMAdABpAHYAZQAgAC0ARQB4AGUAYwB1AHQAaQBvAG4AUABvAGwAaQBjAHkAIABVAG4AcgBlAHMAdAByAGkAYwB0AGUAZAAgAC0ARgBpAGwAZQAgAEMAOgBcAFUAcwBlAHIAcwBcAEEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIAXABBAHAAcABEAGEAdABhAFwATABvAGMAYQBsAFwAVABlAG0AcABcAGEAbgBzAGkAYgBsAGUALQB0AG0AcAAtADEANAAzADgAMgA4ADgAMgA2ADUALgAzADIALQAxADcAMAA2ADcAMwA3ADIAMgA1ADMAMwA4ADcANABcAFwAaQBuAHMAdABhAGwAbABpAHQALgBwAHMAMQAgAEMAOgBcAFUAcwBlAHIAcwBcAEEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIAXABBAHAAcABEAGEAdABhAFwATABvAGMAYQBsAFwAVABlAG0AcABcAGEAbgBzAGkAYgBsAGUALQB0AG0AcAAtADEANAAzADgAMgA4ADgAMgA2ADUALgAzADIALQAxADcAMAA2ADcAMwA3ADIAMgA1ADMAMwA4ADcANABcAFwAYQByAGcAdQBtAGUAbgB0AHMAOwAgAFIAZQBtAG8AdgBlAC0ASQB0AGUAbQAgACIAQwA6AFwAVQBzAGUAcgBzAFwAQQBkAG0AaQBuAGkAcwB0AHIAYQB0AG8AcgBcAEEAcABwAEQAYQB0AGEAXABMAG8AYwBhAGwAXABUAGUAbQBwAFwAYQBuAHMAaQBiAGwAZQAtAHQAbQBwAC0AMQA0ADMAOAAyADgAOAAyADYANQAuADMAMgAtADEANwAwADYANwAzADcAMgAyADUAMwAzADgANwA0AFwAIgAgAC0ARgBvAHIAYwBlACAALQBSAGUAYwB1AHIAcwBlADsA’]
What ansible version are you using? If I recall we had a problem in the past with execution policy being set differently under some circumstances, which I speculate might be causing your problems.
As a ‘get-you-going’ suggestion, you could try running the problematic commands (without the start-process) using the ‘raw’ module.
I’m running Ansible 1.9.2, which is I think the latest (just downloaded it a couple of days ago).
I’ve tried running the setup.exe and psconfig.exe without Start-Process but within the .ps1 still, and that has the same problem.
I’ll try to break out setup.exe and psconfig.exe and run them with raw in playbook task and see if that works differently. I think that’s what you’re suggesting, right?
BTW, it’s really hard to understand what is actually happening? From logging from the setup.exe, it looks like it is running but only partially. Logging looks strange. I can see that it starts running but then the logging just ends, with no errors. Then, I suspect because setup.exe is stopping/ending, the psconfig.exe can’t run because the files haven’t been fully laid down.
TASK: [raw ./setup.exe -ArgumentList “xxxxxx” -Wait] **************
failed: [ansibleclient1.whatever.com] => {“rc”: 1}
stderr: ‘.’ is not recognized as an internal or external command,
operable program or batch file.
I realized that the “-Wait” param was left over from when I was using Start-Process, so I got rid of the “-Wait” and tested again, but still got exactly the same error.
I was doing “cd” to set the current directory and then running the ./setup.exe, but it didn’t work, so I use /setup.exe instead and that seems to have worked.
As I mentioned, I am trying to install Sharepoint, which uses AD, so when I do the installation, I have to be logged into the target machine as a domain administrator. However, when I try to use “domain2\administrator” in the group_vars/windows.yml I get the above error.
I don’t know if it’s possible to get past this, but even if I can, I’ve just realized that there may be another problem. As I said, I have to be able to log into the machine as a domain admin. When I did the Chef implementation, I found that I could only do that if I did the log in from a domain member machine. However, since Ansible controller only runs on Linux, that seems to mean that this is all going to be impossible (or can a Linux machine be a domain member?)?
Since our use case is heavily Windows-based, that is leading me to think that Ansible may not be suitable for us?
A linux machine can function as a domain member. Or you can set things up so that your ansible machine can authenticate against the domain as needed and then ansible can connect as a domain user (and a domain administrator).
If that’s not it… can you share your current playbook and group_vars/windows settings (minus passwords of course)? - Its easier to get an idea of what might be happening.
Also, looking at your messages above I am surprised you can treat your powershell script as if it is an ansible module so instead of
ansible windows -i host -m installit -vvvv
try
ansible windows -i host -m script -a installit.ps1 -vvvv
It looks to me like if the user name in group_vars\windows.yml has format “\username”, then Ansible tries to connect to port 5985 using httpS/SSL and I get the SSL errors, but if username has format “username” and I don’t get SSL error.
As I said, the target machine is only listening on 5985 and not listening on 5986 at all.
Am I supposed to do something (other than pip kerberos above) to enable SSL at the node? is the node supposed to be listening on 5986?
Thanks,
Jim
P.S. And BTW, yes, I am still a little confused above what a module is vs. what a playbook is in Ansible, especially a Powershell module vs. a Playbook that runs Powershell scripts.
However, if I change the username in windows.yml to \administrator, and do “ansible windows -i host -m win_ping” it fails with a 401 error (not authorized).
Hopefully using that you should be able to get it working.
Once that’s done you’ll probably see another problem, which is around kerberos and double-hop remoting. Basically if you use Kerberos to authenticate from your ansible controller to your windows node you can’t use the same kerberos “session” to authenticate from the windows node to a third windows node (such as a database with integrated auth or whatever). This problem relates to Kerberos in general and doesn’t have anything to do with Ansible. People are working on tweaking Ansible to better support different auth schemes so that it’s possible to authenticate from Ansible using basic auth via domain creds, but that support isn’t currently there.
I’ll take a look at that, but, and I know that this is jumping around a bit, but… going back to earlier in the thread: Any idea why when I was using scripts it was failing, whereas going to raw and individual commands was necessary (and also Start-Process didn’t seem to work even under raw)?
As I said, I’m basically trying to replicate some things that we already have working with Chef, but with Ansible, and so far, there are a number of significant issues like these.
I understand these issues are with Windows targets, but unfortunately, that (Windows) is a large part of our infrastructure.
Well, thanks for your page, I’ve made some progress. I am able to authenticate with the domain admin user now. I even have an “echo $(whoami)” that I run in the playbook as raw and that is outputting the domain admin username (\administrator).
However still have the following problems:
When the setup.exe is run (raw) it doesn’t seem to complete. It just kind of sits there until I kill it.
When I run the Sharepoint psconfig.exe, it’s giving me this error:
TASK: [raw C:/Progra~1/Common~1/Micros~1/WebSer~1/12/BIN/psconfig.exe -cmd evalprovision provision] ***
failed: [ansible1.domain2.whatever.com] => {“rc”: 4294967295}
Copyright (C) Microsoft Corporation 2005. All rights reserved.ard version 12.0.6413.1000
Performing configuration task 1 of 3
Initializing SharePoint Products and Technologies configuration…
Successfully initialized the SharePoint Products and Technologies configuration.
Performing configuration task 2 of 3
Creating sample data…
Failed to create sample data.
An exception of type Microsoft.SharePoint.PostSetupConfiguration.PostSetupConfigurationTaskException was thrown. Additional exception information: The evalprovision command is invalid or a failure has been encountered.
Cannot create sample data because this computer is not part of a server farm. Run this configuration wizard again to create or join a server farm.
I think I’ve seen that before, when I was originally doing the Chef implementation, and if I recall, it occurs because I’m not logged into the Sharepoint machine as the right user, so it can’t “join the farm”.
Is this the double-hop problem you mentioned? So there is no way to get this working with Ansible?
commands that are run inside a powershell script/ps1 using the “script” module are running under the user that I have in the group_vars/windows.yml, but
commands that get run under “raw” are not being run as that user.
the setup.exe and psconfig.exe are being run and the returned immediately when they are in a script/ps1 file
I don’t know WHAT user is used for the ‘raw’ commands though, as I’ve tried “echo $(whoami)” redirecting the output to a file, but when I do that I get access denied:
Remember that you need to use single quotation marks around params which contain the dollar sign. This works fine on my box:
ansible -m raw -a ‘echo $(whoami)’ windows_web
It’s difficult to try and help you as there seems to be so much going on. I would advise you to test this using powershell remoting from another windows box. Might be easier to track down errors that way, and then move to ansible when you have everything working. As for the double-hop problem a normal way to solve it is to have a script which sets up a scheduled job where the installer is run.