Назад | Перейти на главную страницу

запустить длинную команду оболочки на удаленных серверах с помощью ansible

У меня есть задача, в которой я хочу запустить команду ниже в оболочке на удаленных серверах, но всякий раз, когда я запускаю свою книгу воспроизведения, она всегда вызывает исключение:

  - 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

ура