Я использую 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, пока он не загрузит сеанс.