我想在我的机器上执行docker中的命令,来控制其他机器。当我执行以下命令时:
- name: Add header
command: docker exec cli bash -l -c "echo '{"payload":{"header":{"channel_header":{"channel_id":"gll", "type":2}},"data":{"config_update":'$(cat jaguar_update.json)'}}}' | jq . > jaguar_update_in_envelope.json"
通过ansible playbook,我得到了下面显示的错误。
fatal:[
command-task
]:FAILED! =>{
"changed":true,
"cmd":[ ],
"delta":"0:00:00.131115",
"end":"2019-07-11 17:32:44.651504",
"msg":"non-zero return code",
"rc":4,
"start":"2019-07-11 17:32:44.520389",
"stderr":"mesg: ttyname
failed: Inappropriate ioctl for device\nparse error: Invalid numeric
literal at line 1, column 9",
"stderr_lines":[
"mesg: ttyname failed:
Inappropriate ioctl for device",
"parse error: Invalid numeric literal
at line 1, column 9"
],
"stdout":"",
"stdout_lines":[
]
}
但是,如果我在Docker容器中手动执行命令,则可以正常工作,不会出现任何问题。
编辑: 如建议所示,我尝试使用
shell
模块。shell: docker exec cli -it bash -l -c "echo '{"payload":{"header":{"channel_header":{"channel_id":"gll", "type":2}},"data":{"config_update":'$(cat jaguar_update.json)'}}}' | jq . > jaguar_update_in_envelope.json"
但是我遇到以下错误:
致命错误:[command-task]:FAILED! => {"changed": true,"cmd": "docker exec cli-it bash -l -c echo '{\"payload\":{\"header\":{\"channel_header\":{\"channel_id\":\"gll\",\"type\":2}},\"data\":{\"config_update\":'$(cat jaguar_update.json)'}}}' | jq . > jaguar_update_in_envelope.json","delta": "0:00:00.110341","end": "2019-07-12 10:21:45.204049","msg": "非零返回代码","rc": 4,"start": "2019-07-12 10:21:45.093708","stderr": "cat:jaguar_update.json:没有那个文件或目录\n解析错误:第1行,第4列的数字文字非法","stderr_lines":["cat:jaguar_update.json:没有那个文件或目录","解析错误:第1行,第4列的数字文字非法"],"stdout":","stdout_lines":[]}
所有文件'jaguar_update.json'都在工作目录中。 我已确认工作目录。
如果我将这些命令放在一个shell脚本文件中,然后从ansible执行该shell脚本,则可以运行以上命令。
docker exec -it cli bash -l -c
命令,其中-it
选项用于交互式终端。试试看吧。 - mchawreshell
而不是command
。command
无法使用管道和重定向。下一个问题将是嵌套引号。 - Vladimir Botka