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

Команда или задача оболочки зависает при использовании ssh для создания туннеля

Я использую Ansible для настройки конфигурации. У меня есть задача внутри playbook, что я хочу запустить ssh-туннель в фоновом режиме для MongoDB. Я использую команду задачи:

- name: Start tunnel service
  shell: ssh -f -N -L 27018:localhost:27017 mongo@remote-server 

Но что бы я ни делал, я не могу продолжать. Вместо этого он зависает или ведет себя так, как будто ожидает ответа. Если я запускаю эту команду в оболочке, как обычно, у нее нет проблем, и я могу подключиться к удаленному экземпляру mongo.

Сначала я подумал, потому что я настраивал новый сервер, что известные_хосты ssh ждут ответа пользователя да / нет, прежде чем двигаться дальше. В этом случае я попробовал два варианта. Сначала я попытался добавить отпечаток сервера в файл known_hosts. После запуска из оболочки он не запрашивал запись known_hosts, но ansible все еще висит. Я тоже пробовал вариант

ssh -o StrictHostKeyChecking=no -f -N -L 27018:localhost:27017 mongo@remote-server

Но этот вариант также вызывает ту же проблему с зависанием анзибла.

Я пробовал переключаться между командой ansible и модулем оболочки без каких-либо изменений в проблеме. Мой последний эксперимент заключался в том, чтобы попробовать nohup перед командой, но это тоже не работает.

nohup ssh -f -N -L 27018:localhost:27017 mongo@remote-server

Также пытаясь проявить творческий подход к мысли, что если другой процесс смог запустить команду, которая впоследствии отправит ответ обратно в ansible, я попытался обернуть ее как задачу Upstart. Я поместил команду оболочки внутри /etc/tunnel.sh файл, а также поместите сценарий выскочки в /etc/init/tunnel.conf. Но это тоже не работает, и, похоже, возникают проблемы с запуском сценария. Если я сбегу sudo service tunnel start он запустится, но не может остановиться. Хотя запуск этого через ansible как команду ничего не делает, а просто сидит и зависает, как и все другие эксперименты.

- name: Start tunnel service
  command service tunnel start

Вы также можете использовать асинхронные действия ansible (http://docs.ansible.com/playbooks_async.html)

- name: Start tunnel service
  shell: ssh -f -N -L 27018:localhost:27017 mongo@remote-server
  async: 15
  poll: 5

Это позволит ansible завершить задачу, что даст ему максимальное время выполнения 15 секунд для выполнения и опрос каждые 5 секунд для завершения.

Я провел тот же тест и обнаружил, что это потому, что команда ssh попросить подтверждение отпечатка пальца когда вы впервые используете ssh, поэтому ansible завис и не может обрабатывать удаленную подсказку.

Простым способом может быть настройка команды туннеля ssh, как показано ниже:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -f -N -L 27018:localhost:27017 mongo@remote-server 

он обойдет проверку ключа хоста и выполнит вашу доступную задачу.

Если вы используете sudo и ключ, я бы поспорил, что вы не сохраняете переменную среды SSH_AUTH_SOCK. Это потребуется для установления соединения от оркестрованной машины к экземпляру mongodb. В этой ситуации вы должны добавить что-то вроде следующего в / etc / sudoers:

Defaults        env_keep+=SSH_AUTH_SOCK
Defaults        env_reset

Вместо nohup почему бы не попробовать использовать screen вместо?

ssh user@server screen -dR command

screen намного лучше, потому что вы можете просто отсоединить сеанс с помощью CTRL-A, D, затем выйти из системы, а когда вам нужно будет вернуться к сеансу позже, просто войдите на сервер с помощью ssh и нажмите CTRL-A, 1 или просто оставьте нажимая CTRL-A, пока он не загрузит сеанс.