在期望/命令块中用Ansible引号heredoc在期望命令中找不到定界符/多行命令

问题描述

我正在尝试生成一个脚本,该脚本将与ansible一起在ssh期望/响应块中复制到远程主机。我想避免编写中间文件。

我有两个问题:

  1. Ansible似乎在command中进行了一些处理,弄乱了多行bash脚本,但我可以使用/bin/bash -c 'my \ multi \ line \ command'来解决它(实际上是多行)
  2. 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')","","[email protected]'s password: "]

myscript.sh的内容要么没有正确地保留(即所有$...扩展),要么包含最后的EOF(因为它不被识别为定界符,而只是在读取到命令块的末尾,因此发出警告。

处理此问题的正确方法是什么?

(请注意,我委托给localhost是因为我不想依赖目标主机上的python,这是只有ssh的最小系统)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)