Мы пытаемся запустить команду одиночного приготовления ножа на удаленных машинах. Когда мы последовательно выполняем команду на каждой машине, она работает без сбоев. Мы попытались распараллелить это, используя гем Parallel следующим образом:
Parallel.each(machines, in_threads => machines.size) do |machine|
knife solo cook machine.user + ":" + machine.ip <options>
end
При этом поток, который запускается первым, выполняется, как и ожидалось. Однако другие потоки не выполняются и останавливаются с ошибкой: EADDRINUSE: Адрес уже используется — bind(2) для 127.0.0.1:8889.
Мы добавили команду netstat в то же место, где вызывали knife solo cook
для расследования, и обнаружили, что сокет Listen был открыт на порту 8889 первым потоком. Мы открывали какие-либо сокеты и не нашли никаких указаний на то, что нож или Net:SSH (который используется ножом) делают это.
Кто-нибудь знает, кто открывает этот сокет? Или есть ли какой-нибудь файл конфигурации для него?
Спасибо!
Редактировать: забыл упомянуть, мы делаем то же самое для knife solo prepare
перед вызовом cook
, и это прекрасно работает. Кроме того, на всех удаленных машинах правильно настроен шеф-повар.