我使用ansible设置了ftp服务器,并通过从我的本地主机手动执行lftp验证了它的工作能力
当我执行ls时,我使用put上传了文件,并能够在ftp服务器中找到该文件。
我写了一部剧本,将文件上传到ftp服务器,并且总是返回成功。但是,我找不到我在游戏中上传的文件。然后我编辑了我的游戏以显示结果寄存器并发现了警告。见下文
---
- name: test ftp upload
hosts: localhost
tasks:
- name: install lftp
yum:
name: lftp
- name: upload file
shell: >
lftp ansible1.example.com<<EOF
cd pub
put /etc/hosts
bye
EOF
register: result
- name: display result
debug:
var: result
下面是我运行播放后得到的输出
PLAY [test ftp upload] ****************************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************************
ok: [localhost]
TASK [install lftp] *******************************************************************************************************************************************************************
ok: [localhost]
TASK [upload file] ********************************************************************************************************************************************************************
changed: [localhost]
TASK [display result] *****************************************************************************************************************************************************************
ok: [localhost] => {
"result": {
"changed": true,
"cmd": "lftp ansible1.example.com<<EOF cd pub put /etc/hosts bye EOF\n",
"delta": "0:00:00.010150",
"end": "2020-04-04 09:15:26.305530",
"failed": false,
"rc": 0,
"start": "2020-04-04 09:15:26.295380",
"stderr": "/bin/sh: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')",
"stderr_lines": [
"/bin/sh: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')"
],
"stdout": "",
"stdout_lines": []
}
}
PLAY RECAP ****************************************************************************************************************************************************************************
localhost : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
我无法理解警告,没有EOF部分,如果这是文件上传失败的原因。因为,我使用下面的shell脚本(与播放过程基本相同)来上传文件,并且效果很好。
lftp ansible1.example.com<<EOF
cd pub
put /etc/hosts
bye
EOF
您的Shell命令使用了错误的标量块样式指示符(请参见documentation)。
您需要将新行保留在您的Shell代码中。在这种情况下,您必须使用文字标量块指示符:|
您已经使用了折叠的标量块指示器(>
),它将基本上将新行转换为空格(尽管它有些复杂,如this other source中所述)
以下内容应解决您当前的问题:
- name: upload file
shell: |
lftp ansible1.example.com<<EOF
cd pub
put /etc/hosts
bye
EOF
register: result