[英]Ansible quoted heredoc in expect/command block not finding delimiter / multiline command in expect command
我正在尝试使用ssh
生成要在ansible
expect/response 块中复制到远程主机的脚本。 我想避免编写中间文件。
我有两个问题:
command
进行了一些处理,这会弄乱多行bash
脚本,但是我可以使用/bin/bash -c 'my \\ multi \\ line \\ command'
(在实际的多行上)来解决它bash
调用(见下文) - 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 手册页:
这里的文件
这种类型的重定向指示 shell 从当前源读取输入,直到看到仅包含分隔符(没有尾随空格)的行。 然后将读取到该点的所有行用作命令的标准输入。 here-document 的格式为:
<<[-]word here-document delimiter
不会对
word
执行参数扩展、命令替换、算术扩展或路径名扩展。 如果word
中的任何字符被引用,则delimiter
是word
上引用删除的结果,并且 here-document 中的行不会被扩展。 如果word
被引用,here-document 的所有行都会进行参数扩展、命令替换和算术扩展。 在后一种情况下,字符序列 \\<newline> 将被忽略,并且必须使用 \\ 来引用字符 \\、$ 和 `。 如果重定向运算符是<<-
,则所有前导制表符都将从输入行和包含delimiter
的行中删除。 这允许 shell 脚本中的 here-document 以自然的方式缩进。
因此,您要么需要从EOF
行中删除缩进,要么使用制表符而不是空格缩进所有内容。 我建议前一种选择更简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.