Python Ansible可以从本地主机连接到windows计算机,但不能从docker容器连接

Python Ansible可以从本地主机连接到windows计算机,但不能从docker容器连接,python,docker,ansible,winrm,Python,Docker,Ansible,Winrm,我可以从本地主机终端使用Ansible成功ping windows主机,但通过docker容器尝试此操作时失败,并显示以下消息: flask | fatal: [eudc2.dea.com]: UNREACHABLE! => {"changed": false, "msg": "basic: HTTPConnectionPool(host='eudc2.dea.com', port=5985): Max retries exceede

我可以从本地主机终端使用Ansible成功ping windows主机,但通过docker容器尝试此操作时失败,并显示以下消息:

flask    | fatal: [eudc2.dea.com]: UNREACHABLE! => {"changed": false, "msg": "basic: HTTPConnectionPool(host='eudc2.dea.com', port=5985): Max retries exceeded with url: /wsman (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x7fbc16d50550>, 'Connection to eudc2.dea.com timed out. (connect timeout=30)'))", "unreachable": true}
我想说这意味着问题出在docker容器中,这就是dockerfile:

FROM python
WORKDIR /app
ADD . /app
RUN pip3 install --upgrade pip
RUN pip3 install flask uwsgi requests ansible ansible_runner pywinrm
RUN apt-get update -y && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
    sshpass

CMD ["uwsgi","app.ini"]
这是hostvars:

[dc]
eudc2.dea.com 

[dc:vars]
ansible_user='username'
ansible_password='pass'
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
ansible_winrm_port=5985
ansible_winrm_transport=basic
docker容器中win_ping的详细输出:

~/Documents/Projects/user oam !5 ?7 ❯ docker exec flask ansible -i /app/ansible/inventory/hosts dc -m win_ping -vvvv                        ✘ INT
ansible 2.10.2
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.9/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.9.0 (default, Oct 13 2020, 20:14:06) [GCC 8.3.0]
No config file found; using defaults
setting up inventory plugins
host_list declined parsing /app/ansible/inventory/hosts as it did not pass its verify_file() method
script declined parsing /app/ansible/inventory/hosts as it did not pass its verify_file() method
auto declined parsing /app/ansible/inventory/hosts as it did not pass its verify_file() method
Set default localhost to localhost
Parsed /app/ansible/inventory/hosts inventory source with ini plugin
Loading callback plugin minimal of type stdout, v2.0 from /usr/local/lib/python3.9/site-packages/ansible/plugins/callback/minimal.py
META: ran handlers
redirecting (type: modules) ansible.builtin.win_ping to ansible.windows.win_ping
Loading collection ansible.windows from /usr/local/lib/python3.9/site-packages/ansible_collections/ansible/windows
Using module file /usr/local/lib/python3.9/site-packages/ansible_collections/ansible/windows/plugins/modules/win_ping.ps1
Pipelining is enabled.
<eudc2.dea.com> ESTABLISH WINRM CONNECTION FOR USER: <username_truncated> on PORT 5985 TO eudc2.dea.com
eudc2.ictv.com | UNREACHABLE! => {
    "changed": false,
    "msg": "basic: HTTPConnectionPool(host='eudc2.dea.com', port=5985): Max retries exceeded with url: /wsman (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x7f628ecd08e0>, 'Connection to eudc2.dea.com timed out. (connect timeout=30)'))",
    "unreachable": true
}

~/Documents/Projects/user oam !5 ?7 ❯ docker exec flask curl eudc2.dea.com                                                                 ✘ INT
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:16 --:--:--     0
~/Documents/Projects/user-oam!5 ?7 ❯ docker exec flask ansible-i/app/ansible/inventory/hosts dc-m win_ping-VVV✘ 国际的
表2.10.2
配置文件=无
配置的模块搜索路径=['/root/.ansible/plugins/modules','/usr/share/ansible/plugins/modules']
ansible python模块位置=/usr/local/lib/python3.9/site-packages/ansible
可执行文件位置=/usr/local/bin/ansible
python版本=3.9.0(默认值,2020年10月13日,20:14:06)[GCC 8.3.0]
没有找到配置文件;使用默认值
设置目录插件
主机列表拒绝解析/app/ansible/inventory/hosts,因为它没有通过其verify\u file()方法
脚本拒绝解析/app/ansible/inventory/hosts,因为它没有通过其verify_file()方法
自动拒绝解析/app/ansible/inventory/hosts,因为它没有通过其verify_file()方法
将默认localhost设置为localhost
使用ini插件解析/app/ansible/inventory/hosts清单源
正在从/usr/local/lib/python3.9/site-packages/ansible/plugins/callback/minimal.py加载stdout类型的最小回调插件v2.0
META:ran处理程序
将(类型:模块)ansible.builtin.win\u ping重定向到ansible.windows.win\u ping
正在从/usr/local/lib/python3.9/site-packages/ansible_collections/ansible/windows加载集合ansible.windows
使用模块文件/usr/local/lib/python3.9/site-packages/ansible\u collections/ansible/windows/plugins/modules/win\u ping.ps1
已启用管道。
在端口5985上为用户建立到eudc2.dea.com的WINRM连接
eudc2.ictv.com |无法访问!=>{
“更改”:错误,
“msg”:“basic:HTTPConnectionPool(host='eudc2.dea.com',port=5985):url:/wsman超过了最大重试次数(由ConnectTimeoutError(,'Connection to eudc2.dea.com timeout.(connect timeout=30')”,
“遥不可及”:真实
}
~/文档/项目/用户oam!5 ?7 ❯ docker exec.eudc2.dea.com✘ 国际的
%总接收百分比%x平均速度时间电流
数据加载上载总左速度
0     0    0     0    0     0      0      0 --:--:--  0:00:16 --:--:--     0

有趣的是,从容器中运行
curl
需要16秒才能完成。看起来很长时间了

对于以下操作,Ansible的WinRM超时为20秒:

一些建议:

  • 从容器内外运行一些
    curl
    请求(我认为容器与您调用的localhost运行在同一个框中);比较时间,看它们是否有显著差异
  • 从容器和本地主机运行多次
    win\u ping
    ;容器是否正常工作或本地主机是否出现故障?;运行时间(
    time ansible dc-m win\u ping
  • 更改上面链接中提到的配置
    ansible\u winrm\u operation\u timeout\u sec
    ansible\u winrm\u read\u timeout\u sec
    ,看看这是否有帮助

您可以使用
-vvv
再次运行并粘贴日志吗?显然,名称解析有效,但实际连接无效。你能登录到容器并尝试在有问题的URL上卷曲吗?@caxcaxcoatl我用你要求的信息更新了这个问题。地址
eudc2.dea.com
能在docker容器中解析吗?@Donat可以ping是的。你的卷曲测试是在默认端口(80)上进行的。试试5985:
curl eudc2.dea.com:5985/wsman
卷曲没有在16秒内完成,我只是停止了,因为它从来没有完成过。卷曲永远不会起作用。同时,将超时时间增加到60秒也没有帮助。嗯。。。从输出中不清楚旋度没有完成。你能提供更多关于设置的细节吗?您是否直接在裸机本地主机上运行容器?你用来启动它的命令是什么?另外,测试的一个想法是:尝试使用get_url模块抓取一些随机网页(例如google.com),以确认任何/所有传出连接上都出现了问题。