我正在尝试使用Ansible 1.9.0.1来configuration使用域用户名的Windows服务器。 我已经成功地安装了Linux Ansible控制盒,并且已经能够使用基本authentication来运行可靠/可靠的剧本播放。 但是,与域用户一起运行失败。 在Windows节点上启用Kerberos:
winrm get winrm/config/client/auth Auth Basic = true Digest = true Kerberos = true Negotiate = true Certificate = true CredSSP = true
我试图运行的剧本只是引用了ansible的win_ping模块,下面是输出:
PLAY [Manage SMI] ************************************************************* TASK: [Ping] ****************************************************************** <host1> ESTABLISH WINRM CONNECTION FOR USER: on PORT 5985 TO >host1 <host1> ESTABLISH WINRM CONNECTION FOR USER: on PORT 5985 TO >host2 <host1> REMOTE_MODULE win_ping <host1> EXEC (New-Item -Type Directory -Path $env:temp -Name >"ansible-tmp-1429639247.03-231225138744234").FullName | Write-Host -Separator >''; <host2> REMOTE_MODULE win_ping <host2> EXEC (New-Item -Type Directory -Path $env:temp -Name >"ansible-tmp-1429639247.03-8060403929807").FullName | Write-Host -Separator ''; FATAL: all hosts have already failed -- aborting PLAY RECAP ******************************************************************** to retry, use: --limit @/home/deck/test.retry host1 : ok=0 changed=0 unreachable=1 failed=0 host2 : ok=0 changed=0 unreachable=1 failed=0
根据系统事件日志,用户正在进行正确的身份validation,看起来像文件传输到tmp目录失败。
任何帮助是极大的赞赏。
一位同事找到了解决这个问题的办法。 在使用kerberos时,pywinrm出现问题,导致模块在尝试调用Transport.py中的KerbosTicket时死亡。 如果您使用以下方法修补transport.py:
class KerberosTicket: """ Implementation based on http://ncoghlan_devs-python-notes.readthedocs.org/en/latest/python_kerberos.html """ def __init__(self, service): # added line below self.test=1 ignored_code, krb_context = kerberos.authGSSClientInit(service) kerberos.authGSSClientStep(krb_context, '') # TODO authGSSClientStep may raise following error: #GSSError: (('Unspecified GSS failure. Minor code may provide more information', 851968), # ("Credentials cache file '/tmp/krb5cc_1000' not found", -1765328189)) self._krb_context = krb_context gss_response = kerberos.authGSSClientResponse(krb_context) self.auth_header = 'Negotiate {0}'.format(gss_response)
我们不是100%确定为什么这个工作,但现在是我们的解决方法。