当我跑步时:
ansible all -a "/bin/echo hello" -u myuser
我回复说:
mydomain.myhost.com | FAILED => failed to open a SFTP connection (Channel closed.)
我尝试连接的托管节点上的 SFTP 子系统已被禁用。
管理节点上是否需要 SFTP?Ansible 文档没有具体提到 SFTP:http://docs.ansible.com/intro_installation.html#managed-node-requirements
我尝试设置此值在 ansible.cfg 中:
scp_if_ssh=True
...但没起什么作用。(感谢神奇狗狗弗雷德建议。
我还确保我的非交互式 shell 不会产生任何输出正如这里建议的那样。
答案1
是的,ansible 依赖于能够将文件传输到远程计算机。默认情况下,它使用 sftp 来执行此操作。你可以覆盖它以使用 scp
scp_if_ssh
Occasionally users may be managing a remote system that doesn’t have SFTP enabled. If set to True, we can cause scp to be used to transfer remote files instead:
scp_if_ssh=False
There’s really no reason to change this unless problems are encountered, and then there’s also no real drawback to managing the switch. Most environments support SFTP by default and this doesn’t usually need to be changed.
以上信息取自此页面:
http://docs.ansible.com/intro_configuration.html#openssh-specific-settings
答案2
以下是我最终做的事情:
- 复制
/etc/ansible/ansible.cfg
到~/.ansible.cfg
- 已编辑
~/.ansible.cfg
。 - 变成
#scp_if_ssh = False
scp_if_ssh = True
- 已添加
ssh_args =
到[ssh_connection]
部分。 -c SSH
使用flag运行我的命令
谢谢神奇魔法狗弗雷德为我指明了正确的方向。
答案3
您可以使用connection: paramiko
。即使stfp
和scp
都不可用,它也能正常工作。在底层,它使用与“普通”ssh 相同的 ssh,因此即使~/.ssh/config
适用。
或者,可以通过环境变量、在命令行上通过-c
开关以及在中指定连接类型ansible.cfg
。
例如:
- hosts: all
connection: paramiko
tasks:
command: echo ok
或者
ansible all -c paramiko -a "/bin/echo hello" -u myuser
如果未安装 paramiko,则可能必须通过 pip ( pip install paramiko
) 或使用特定于发行版的包管理器进行安装(apt install python3-paramiko
如果您在 python3 中使用 ansible,请检查使用ansible --version
)