如何解决在期望/命令块中用Ansible引号heredoc在期望命令中找不到定界符/多行命令
我正在尝试生成一个脚本,该脚本将与ansible
一起在ssh
期望/响应块中复制到远程主机。我想避免编写中间文件。
我有两个问题:
- Ansible似乎在
command
中进行了一些处理,弄乱了多行bash
脚本,但我可以使用/bin/bash -c 'my \ multi \ line \ command'
来解决它(实际上是多行) - 在
bash
调用中(见下文),我似乎无法正确地为Heredoc的EOF标记正确
- name: Generate script on the fly
expect:
command: |
/bin/bash -c 'ssh -o PubkeyAuthentication=no -p {{ ansible_ssh_port }} {{ ansible_user }}@{{ ansible_host }} "cat - > {{ tgtdir }}/myscript.sh" <<-'EOF'
#! /bin/env sh
a="/$0"; a=${a%/*}; a=${a#/}; a=${a:-.}; THIS=$(cd "$a"; pwd)
echo "Script dir == ${THIS}"
echo "{{ someansiblevar }}"
EOF
'
responses:
(.*)password: "{{ ansible_ssh_pass }}"
delegate_to: localhost
(请注意,在此示例中,我显然在单引号内使用了单引号,但是其他变体也都失败了。)
我试图以不同的方式对第一个EOF
周围的引号进行转义,但是我总是得到警告:
"stdout_lines": ["/bin/bash: line 10: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')","","admin@192.168.1.111's password: "]
myscript.sh
的内容要么没有正确地保留(即所有$...
扩展),要么包含最后的EOF
(因为它不被识别为定界符,而只是在读取到命令块的末尾,因此发出警告。
处理此问题的正确方法是什么?
(请注意,我委托给localhost
是因为我不想依赖目标主机上的python
,这是只有ssh
的最小系统)。
解决方法
将关闭的EOF移动两个空格。目前,它不是从其行的开头开始,因此bash不会将其视为定界符。
在bash手册页中:
此处文档
这种重定向指示外壳程序从 当前源,直到仅包含定界符(无 尾随空白)。至此为止的所有行都是 然后用作命令的标准输入。格式 这里的文档是:
<<[-]word here-document delimiter
不执行参数扩展,命令替换,算术扩展或路径名扩展 在
word
上。如果引用了word
中的任何字符,则delimiter
是word
上的引号删除结果以及此文档中的行 没有扩展。如果word
未引用,则此文档的所有行 进行参数扩展,命令替换和 算术扩展。在后一种情况下,字符序列 \将被忽略,并且必须使用\来引号字符\, $和`。如果重定向操作符为 <<-
,则所有前导选项卡 从输入行中删除字符,并且包含delimiter
。这使得shell脚本中的here-documents 以自然的方式缩进。
因此,您将需要从EOF
行中删除缩进,或者使用TAB(而不是空格)对所有内容进行缩进。我建议前一种选择更简单。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。