在使用ansible进行发布citrix应用时,思路是通过ansible脚本远程执行powershell脚本,传递参数给powershell脚本,具体工作由powershell执行。,
描述一下发布应用的步骤,powershell脚本由ansible传递到DDC上执行,应用是在VDA的远程机器上,首先获取应用的默认图标,然后再用此图标发布应用。
这个脚本直接在DDC上执行没问题,一旦由ansible执行,则报错,提示找不到location,经分析,是获取应用图标时无法访问路径。遭遇了second-hop问题
如图所示
第一步ansible通过PSSession登录到DDC是没问题的,但在这个Session中,如果要再访问VDA_Server的内容,则属于第二跳了,默认是没有登录凭证的。
解决办法:
使用CredSSP认证方式
- 在ansible中,配置windows的认证协议为CredSSP
ansible_user: Username
ansible_password: Password
ansible_connection: winrm
ansible_winrm_transport: credssp
2.关闭TLS v1.2(可选)
ansible_winrm_credssp_disable_tlsv1_2: true
3.安装CredSSP库
pip install pywinrm[credssp]
- 在windows机器上打开credssp,这里也就是需要在DDC上操作,让DDC可代理登录凭证(把凭证传给其他机器用于登录)
Enable-WSManCredSSP -Role Server -Force
这样就可以了。
问题2:发布中文应用名时出错
解决上一个问题后,发布可以了,但一旦有中文应用名,则powershell执行时显示名称参数不正确,不允许控制字符。
经排查,是ansible-semaphore接受的参数就是乱码了,再排查,发现是通过rest接口调用ansible-semaphore时,传递请求没有指明编码为utf-8。
解决:
发送http请求时,设定编码:
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", "application/json;charset=utf-8");
....
StringEntity vars =new StringEntity(jsonStr,"UTF-8");
vars.setContentEncoding("UTF-8");
vars.setContentType("application/json");
httpPost.setEntity(vars);
使用这样的方式,即可解决中文名问题。