簡體   English   中英

Ansible 在expect/command 塊中引用了heredoc 在expect 命令中找不到分隔符/多行命令

[英]Ansible quoted heredoc in expect/command block not finding delimiter / multiline command in expect command

我正在嘗試使用ssh生成要在ansible expect/response 塊中復制到遠程主機的腳本。 我想避免編寫中間文件。

我有兩個問題:

  1. Ansible 似乎在command進行了一些處理,這會弄亂多行bash腳本,但是我可以使用/bin/bash -c 'my \\ multi \\ line \\ command' (在實際的多行上)來解決它
  2. 我似乎無法引用的范圍內正確的定界符的EOF標記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中的任何字符被引用,則delimiterword上引用刪除的結果,並且 here-document 中的行不會被擴展。 如果word被引用,here-document 的所有行都會進行參數擴展、命令替換和算術擴展。 在后一種情況下,字符序列 \\<newline> 將被忽略,並且必須使用 \\ 來引用字符 \\、$ 和 `。 如果重定向運算符是<<- ,則所有前導制表符都將從輸入行和包含delimiter的行中刪除。 這允許 shell 腳本中的 here-document 以自然的方式縮進。

因此,您要么需要從EOF行中刪除縮進,要么使用制表符而不是空格縮進所有內容。 我建議前一種選擇更簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM