У меня есть задача, в которой я хочу запустить команду ниже в оболочке на удаленных серверах, но всякий раз, когда я запускаю свою книгу воспроизведения, она всегда вызывает исключение:
- name: copy files
shell: "machines=(machineA machineB machineC); for machine in $(shuf -e ${machines[@]}); do ssh -o StrictHostKeyChecking=no david@$machine 'ls -1 /process/snap/{{ folder }}/*' | parallel -j{{ threads }} 'scp -o StrictHostKeyChecking=no david@${machine}:{} /data/files/'; [ $? -eq 0 ] && break; done"
Ниже приведена ошибка: я не могу понять, что я здесь делаю не так?
"stderr": "/bin/sh: 1: Syntax error: \"(\" unexpected", "stderr_lines": ["/bin/sh: 1: Syntax error: \"(\" unexpected"], "stdout": "", "stdout_lines": []}
Я могу запустить эту команду непосредственно в оболочке на любых удаленных серверах, но у меня возникают проблемы при работе через ansible.
Это мой сценарий, который я преобразовал в одну строку и использовал в модуле оболочки:
machines=(machineA machineB machineC)
for machine in $(shuf -e ${machines[@]}); do
ssh -o StrictHostKeyChecking=no david@$machine 'ls -1 /process/snap/{{ folder }}/*' | parallel -j{{ threads }} 'scp -o StrictHostKeyChecking=no david@${machine}:{} /data/files/'
[ $? -eq 0 ] && break
done
Обновить:
Я пробовал вот так сейчас, и это дает мне другое исключение.
- name: copy files
shell: |
set -x
machines=(machineA machineB machineC)
for machine in $(shuf -e ${machines[@]}); do
ssh -o StrictHostKeyChecking=no david@$machine 'ls -1 /process/snap/{{ folder }}/*' | parallel -j{{ parallelism }} 'scp -o StrictHostKeyChecking=no david@${machine}:{} /data/files/'
[ $? -eq 0 ] && break
done
args:
executable: /bin/bash
Полная ошибка: (я сократил)
фатальный: [some_machine]: НЕ ВЫПОЛНЕНО! => {"changed": true, "cmd": "machines = (machineA machineB machineC) \ n для машины в $ (shuf -e $ {machines [@]}); do \ n ssh -o StrictHostKeyChecking = no david @ $ machine 'ls -1 / process / snap / 20180422 / *' | parallel -j10 'scp -o StrictHostKeyChecking = no david @ $ {machine}: {} / data / files /' \ n [$? -eq 0 ] && break \ n done "," delta ":" 0: 00: 37.546329 "," end ":" 2018-04-29 23: 27: 44.003538 "," msg ":" ненулевой код возврата "," rc ": 1," start ":" 2018-04-29 23: 27: 06.457209 "," stderr ":" ssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или сервис неизвестен \ r \ nssh: не удалось разрешить имя хоста: имя или сервис неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или сервис неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или сервис неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: удалось не разрешить hostnam e: Имя или служба неизвестны \ r \ nssh: Не удалось разрешить имя хоста: Имя или служба неизвестны \ r \ nssh: Не удалось разрешить имя хоста: Имя или служба неизвестны \ r \ nssh: Не удалось разрешить имя хоста: Имя или служба неизвестно \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестно \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или сервис неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или сервис неизвестно \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или сервис неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или сервис не известно \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или сервис неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или сервис неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или сервис неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба не известна \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны \ r \ nssh: не удалось разрешить имя хоста: имя или служба неизвестны "," ssh: не удалось разрешить имя хоста: имя или служба неизвестны "," ssh: не удалось разрешить имя хоста: имя или служба не известна "]," stdout ":" "," stdout_lines ": []}
Также я попробовал эту базовую вещь, и это прошло без каких-либо ошибок, поэтому я предполагаю, что это работает?
- name: copy files
shell: |
set -x
machines=(machineA machineB machineC)
for machine in $(shuf -e ${machines[@]}); do
echo $machine
[ $? -eq 0 ] && break
done
args:
executable: /bin/bash
Я считаю, что это какая-то проблема, может быть, с моим утверждением scp? Я не уверен, просто догадываюсь?
Я не могу точно сказать, в чем именно заключается ваша проблема, но ошибка указывает на то, что в вашей команде есть синтаксическая ошибка. Что почти наверняка связано с тем, что что-то было экранировано или неправильно переведено при выполнении.
Я должен предложить пару вещей. Сначала используйте синтаксис yaml, чтобы включить блок текста, который включает окончания строк.
- name: Run Script
shell: |
machines=(machineA machineB machineC)
for machine in $(shuf -e ${machines[@]}); do
ssh -o StrictHostKeyChecking=no david@$machine 'ls -1 /process/snap/{{ folder }}/*' |
parallel -j{{ threads }} 'scp -o StrictHostKeyChecking=no david@${machine}:{} /data/files/'
[ $? -eq 0 ] && break
done
Я думаю, что в вашем фрагменте может быть башизмы. Вам может потребоваться указать, что ваш скрипт будет выполняться через трепать вместо того /bin/sh
.
- name: Run command that requires bash
shell: echo 'not a very good example.
args:
executable: /bin/bash
Вы также можете добавить set -x
как первая строка вашего фрагмента. Более подробный вывод оболочки должен помочь вам понять, в чем именно заключается ошибка.
Конечно, я также предлагаю вам попробовать использовать для этого модули Ansible. Я подозреваю, что, возможно, модуль синхронизации в сочетании с асинхронные функции.
Поскольку вы сказали, что вы можете запустить эту команду прямо в оболочке на любых удаленных серверах, попробуйте модуль сценария с Ansible.
- name: Run a script with arguments
script: /some/local/script.sh --some-argument 1234
Документация здесь: https://docs.ansible.com/ansible/latest/modules/script_module.html
ура