Ansible无法将文件传输到/command。

33

最近我一直在使用ansible进行各种自动化。但是,在对特定Web服务器框进行自动Tomcat6重启的测试过程中,我遇到了无法解决的新错误。

FAILED => failed to transfer file to /command

看文档说是因为sshd_config中没有sftp-server,但实际上已经存在了。

以下是我在web服务器主机上运行的命令。

ansible all -a "/usr/bin/sudo /etc/init.d/tomcat6 restart" -u user --ask-pass --sudo --ask-sudo-pass

每个盒子上都有一个名为.ansible的隐藏文件夹,所以我知道它已经到达了它们,但它没有执行命令。

运行-vvvv后,我得到了以下结果:

EXEC ['sshpass', '-d10', 'ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-o',    'ControlPersist=60s', '-o', 'ControlPath=/home/vagrant/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'GSSAPIAuthentication=no', '-o', 'PubkeyAuthentication=no', '-o', 'User=user', '-o', 'ConnectTimeout=10', '10.10.10.103', "/bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1400791384.19-262170576359689 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1400791384.19-262170576359689 && echo $HOME/.ansible/tmp/ansible-tmp-1400791384.19-262170576359689'"]

那么

10.10.10.103 | FAILED => failed to transfer file to /home/user/.ansible/tmp/ansible-tmp-1400791384.19-262170576359689/command

非常感谢您对这个问题的帮助。
谢谢,
编辑: 为了增加谷歌搜索能力,这里是所选答案修复的错误的另一种表现形式。
运行命令ansible-playbook -i inventory hello_world.yml会给每个主机都发出此警告。
[WARNING]: sftp transfer mechanism failed on [host.example.com]. Use ANSIBLE_DEBUG=1 to see detailed information

当您以 ANSIBLE_DEBUG=1 ansible-playbook -i inventory hello_world.yml 重新运行该命令时,您将获得的额外信息只有:

>>>sftp> put /var/folders/nc/htqkfk6j6h70hlxrr43rm4h00000gn/T/tmpxEWCe5 /home/ubuntu/.ansible/tmp/ansible-tmp-1487430536.22-28138635532013/command.py

请问您能否发布失败的任务? - ProfHase85
@ProfHase85 它无法将命令文件传输到.ansible/tmp/ansible-tmp..../command。上面是我正在运行的ansible命令。ansible all -a "/usr/bin/sudo /etc/init.d/tomcat6 restart" -u user --ask-pass --sudo --ask-sudo-pass - Nvasion
你能否也检查一下远程机器上~/.ansible目录及其子目录的权限? - hkariti
7个回答

45

您在远程服务器的sshd中是否启用了sftp子系统? 您可以在/etc/sshd/sshd_config文件中进行检查,配置文件名称取决于您的发行版...无论如何,请在那里查找:

Subsystem      sftp    /usr/lib/ssh/sftp-server
如果这行被注释掉了,sftp就被禁用了。要修复它,你可以启用sftp,或者更改Ansible配置。我更喜欢更改Ansible配置,请查看ansible.cfg并添加/更改:
[ssh_connection]
scp_if_ssh=True

1
我已经在 ansible.cfg[defaults] 部分中设置了 scp_if_ssh=True,但它并没有阻止错误的发生。创建一个 [ssh_connection] 部分才解决了问题。非常感谢! - Bruno Bronosky
天啊,你刚刚帮我解决了2个小时的头疼问题。非常感谢你。我刚创建了一个20.04虚拟机,试图运行Ansible playbook。当我重新启动ssh时,它就起作用了。 - DevOpsSauce
安装了Python3的CentOS 7新系统。我展示了Subsystem sftp /usr/libexec/openssh/sftp-server,但Ansible抱怨sftp无法工作。如果我再次运行ANSIBLE_DEBUG=1,stdout会显示sftp成功。 - Arrow_Raider

8

无需更改/etc/ansible/ansible.cfg

如果只有一个主机受影响,则可以在hosts文件中按以下方式逐个主机进行纠正:

alias ansible_host=192.168.1.102 ansible_ssh_transfer_method=scp

这个解决方案需要使用版本为 2.3 或更高的 ansible

[来源]


1
可能的取值:smart|sftp|scp|piped - gavenkoa

5

虽然这个曾经在2014年@stibi 初次解决问题时有效:

[ssh_connection]
scp_if_ssh=True

现在在ansible.cfg中已经被以下语句所取代,之前由@Serge Stroobandt提到过作为内联主机选项:

[ssh_connection]
transfer_method = scp

scp的可能值为:

sftp  = use sftp to transfer files
scp   = use scp to transfer files
piped = use 'dd' over SSH to transfer files
smart = try sftp, scp, and piped, in that order [default]

当您指定scp而不使用默认设置时,可以避免传输机制关于sftp的警告。


2

最近我因为完全不同的原因收到了这样的消息。我有一些偏离正常文本的东西,这是由于我的~/.bashrc文件中有一个cd -命令导致的。我通过像这样过滤输出来解决了这个问题:

我的~/.bashrc文件

...
cd ~/ansible/hacking/ > /dev/null 2>&1 && . env-setup -q && cd - > /dev/null 2>&1
...

如果不将cd命令重定向到/dev/null,我会收到以下消息。

TASK [setup] *******************************************************************
ok: [app02]
ok: [app03]
fatal: [app01]: FAILED! => {"failed": true, "msg": "failed to transfer file to /home/admin/.ansible/tmp/ansible-tmp-1474747432.93-129438354708729/setup:\n\n/home/admin\n"}

我的ansible.cfg

我情况中的另一个有趣细节是,我已经在我的ansible.cfg文件中使用了以下内容:

[ssh_connection]
scp_if_ssh=True

在问题列表中的服务器app01是我正在运行Ansible playbook的服务器。我的错误信息末尾的文本部分“74747432.93-129438354708729/setup:\n\n/home/admin\n”引起了我的注意。这是在处理我的“~/.bashrc”文件时,在登录期间运行 cd ... 时产生的输出。请注意保留HTML标签。

1
我有类似的症状,由于Ansible传输失败,我的.bashrc文件相当简单。我将.bashrc移动到bashrc(禁用它),症状消失了。由于它已经检查了交互式会话,所以我将代码从.bashrc移动到.bash_profile。 - CODE-REaD

2

在CentOS8中,我必须替换/etc/ssh/sshd_config文件中的这行内容:

Subsystem sftp /usr/libexec/openssh/sftp-server

使用

Subsystem sftp internal-sftp

然后使用以下命令重新启动sshd服务:

systemctl restart sshd

当您以非root用户身份登录并使用become: yes时,此解决方案可行。 - pfrenssen

0
这个解决方案可行:
步骤1:
在主机文件(/etc/ansible/hosts)中,使用ipaddress作为"root@192.168.1.102",而不是"192.168.1.102"
步骤2:
取消注释"/etc/ansible/ansible.cfg"文件中的属性。
scp_if_ssh=True

-3
你可以尝试这个解决方案:
rm -rf ~/.ansible

然后

ansible-galaxy install cbrunnkvist.ansistrano-symfony-deploy --force

再试一次

ansible-playbook -i  etc/deploy/config/inventory.yml etc/deploy/deploy.yml

2
这并没有解释为什么它应该有所帮助,建议安装第三方代码并使用 --force - Richlv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接