Я недавно узнал, как здорово expect
есть, теперь, когда я внезапно отвечаю за управление 150 виртуальными машинами. Я использовал его для распространения файлов конфигурации на удаленные серверы, но должен быть способ лучше, чем то, что я делаю.
В основном то, что я делаю, это такие вещи:
set server [lindex $argv 0]
set timeout -1
spawn scp -i $::env(HOME)/.ssh/key.pem file $server:/tmp/
expect ">>"
spawn ssh -i $::env(HOME)/.ssh/key.pem $server
expect ">>"
send "sudo mv /tmp/file /etc/file && sudo service foo restart\r"
expect ">>"
puts "\r\r"
Таким образом, сценарий scp передает файл на удаленный сервер, а затем ssh на сервер и перемещает файл (используя sudo, потому что это файл, принадлежащий root в / etc, например nscd.conf
) к месту назначения. Похоже, что должен быть лучший способ управлять распространением нового файла конфигурации, принадлежащего root, на группу машин.
Вы можете довольно быстро запустить что-то вроде шеф-повара или марионетки, и это избавит вас от ОЧЕНЬ головной боли в долгосрочной перспективе, но если вы не хотите использовать реальное управление конфигурацией, несколько советов по тому, как вы это делаете вещи сейчас:
1) Поместите ключ пользователя, с которым вы подключаетесь, в файл authorized_keys root, чтобы вам не приходилось делать что-то как пользователь без полномочий root, а затем войдите в систему, чтобы использовать sudo. Тогда вам вообще не нужно ожидать. 2) Остерегайтесь неполных загрузок, когда вы перезаписываете файлы конфигурации. Вам, вероятно, понадобится некоторая логика контрольных сумм, чтобы убедиться, что вы скопировали файл и он не поврежден, прежде чем переместить его на место на целевом хосте. 3) Используйте rsync поверх ssh, если вы пытаетесь сделать весь каталог или группу файлов идентичными, вместо scping их по одному или scp -r. Это сэкономит вам кучу времени, если локальное и целевое содержимое уже одинаково, и позволит вам запускать что-то из cron для их синхронизации, не опасаясь каждый раз копировать все. 4) Если вы все же запускаете что-то из cron, убедитесь, что у вас есть какая-то блокировка, чтобы задания cron не накладывались друг на друга. Также убедитесь, что вы очистили блокировку, если ваша работа не удалась, система перезагрузится и т. Д.