微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在期望/命令块中用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')","","admin@192.168.1.111's password: "]

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

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

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

解决方法

将关闭的EOF移动两个空格。目前,它不是从其行的开头开始,因此bash不会将其视为定界符。

在bash手册页中:

此处文档

这种重定向指示外壳程序从 当前源,直到仅包含定界符(无 尾随空白)。至此为止的所有行都是 然后用作命令的标准输入。格式 这里的文档是:

<<[-]word
        here-document 
delimiter 

不执行参数扩展,命令替换,算术扩展或路径名扩展 在word上。如果引用了word中的任何字符,则delimiterword上的引号删除结果以及此文档中的行 没有扩展。如果word未引用,则此文档的所有行 进行参数扩展,命令替换和 算术扩展。在后一种情况下,字符序列 \ 将被忽略,并且必须使用\来引号字符\, $和`。如果重定向操作符为<<-,则所有前导选项卡 从输入行中删除字符,并且包含 delimiter。这使得shell脚本中的here-documents 以自然的方式缩进。

因此,您将需要从EOF行中删除缩进,或者使用TAB(而不是空格)对所有内容进行缩进。我建议前一种选择更简单。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。