Я пытаюсь создать сценарий для копирования в блоке ожидания/ответа ansible
с ssh
на удаленный хост. Я бы хотел избежать написания промежуточных файлов.
У меня есть две проблемы:
- Ansible, кажется, выполняет некоторую обработку в
command
, которая портит многострочные сценарииbash
, но я могу обойти это с помощью/bin/bash -c 'my \ multi \ line \ command'
(на самом деле несколько строк) - Кажется, я не могу правильно указать метку EOF для heredoc внутри вызова
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')", "", "[email protected]'s password: "]
А содержимое myscript.sh
либо не корректно оставлено (т.е. все $...
развернуто), либо содержит последнее EOF
(поскольку оно не распознается как разделитель и просто читается до конца командного блока, отсюда и предупреждение.
Каков правильный способ справиться с этим?
(Обратите внимание, что я делегирую localhost
, потому что не хочу полагаться на python
на целевом хосте, это минимальные системы только с ssh
).
EOF
состоит только из символов TAB, а не из пробелов. - person Barmar   schedule 08.09.2020Syntax Error while loading YAML. found a tab character where an indentation space is expected
- person ppenguin   schedule 09.09.2020EOF
с отступом. - person Barmar   schedule 09.09.2020