Автоматизация работы *nix системного администратора

    О ssh и системных администраторах:

    С давних пор *nix системные администраторы используют ssh для удаленного управления серверами.
    Некоторые из них делают себе готовые наборы скриптов для обновлений софта, раскладки из репозитория, и так далее.
    До определенных размахов бедствия можно обходить парк машин одну за одной. Однако рано или поздно парк машин вырастет до вполне себе солидных размеров и тогда простейшая раскладка по фронтэндам новых скриптов становится головной болью нескольких часов.

    Вот здесь вот и начинается самое интересно:
    одни системные администраторы запускают свои скрипты в несколько потоков, другие придумывают как отмазаться от части машин.


    SSH robot:

    Долгое время я использовал его только для своих нужд в mail.ru, потом долгое время у меня не было большого зоопарка машин и вот теперь он снова понадобился. Эта версия была за последние 3 недели полностью переписана с нуля:

    Последняя стабильная версия:
    http://myau.su/robot-0.2.5.tgz

    Последняя стабильная версия из репозитория:
    svn co svn://myau.su/robot/tags/robot-0.2.5 robot

    Транк:
    svn co svn://myau.su/robot/trunk robot

    Список того что потребуется для сборки и как собирать можно найти в папке doc.

    На выходе получите 2 бинаря:
    passfile — для генерации зашифрованного файла с паролями
    robot — собственно сам робот

    Немножко о том чему робот уже обучен:

    1) Асинхронно выполнять скрипты на машинах
    2) Загружать / скачивать файлы посредством ssh(sftp)
    3) Проверять exit code
    4) Ждать заданную строку после выполнения команды
    5) Группировать машины и исполнять разные скрипты для разных групп
    6) Отображать прогресс и вывод с машин
    7) Использовать зашифрованный файл с паролями

    Автоматизируемся:


    Сейчас мы рассмотрим несколько простых примеров без использования зашифрованного файла паролей. Полная документация по синтаксису макрос файлов есть в папке doc там же и все остальное.

    1) Обновление web-скриптов с перезапуском апача:

    Первое что нам понадобится это описать какие машины у нас есть и как с ними соединяться:

    @host {
    @user = user_zero # пользователь по умолчанию для всех хостов
    @pass = password_zero # пароль по умолчанию для всех хостов

    192.168.0.1
    192.168.0.2
    user_2@192.168.0.3 # а вот тут вот у нас уже другой пользователь
    user_2:pass2@192.168.0.4 # а тут еще и пароль отличается
    192.168.0.5
    192.168.0.6
    }


    Просто лаконично и красиво )
    Теперь давайте опишем 2 разные группы, потому что путь до каталога со скриптами там разный:

    @group path_1 {
    192.168.0.1
    192.168.0.2
    192.168.0.3
    }

    @group path_2 {
    192.168.0.4
    192.168.0.5
    192.168.0.6
    }


    Обратите внимание что логин и пароль здесь не пишутся только имя хоста.

    А теперь сами скрипты:

    @script path_1 {
    command su # Хочу быть владычицей морской
    expect Password # ждем пока нас спросят о пароле
    command MegArOooOtPas$ # вводим его
    exitcode 0 # ждем экзит кода
    command cd /path_to_www1/ # идем туда куда надо
    exitcode 0 #ждем экзит кода
    command svn up # обновляем код
    exitcode 0 #ждем экзит кода
    command /etc/init.d/apache restart # перезапуск апатча
    exitcode 0 #ждем экзит кода
    }

    @script path_2 {
    command su
    expect Password
    command MegArOooOtPas$
    exitcode 0
    command cd /path_to_www2/ # для этой группы путь другой
    exitcode 0
    command svn up
    exitcode 0
    command /etc/init.d/apache restart
    exitcode 0
    }


    Вот так вот: сначала будет обновлена группа 1 потом группа 2.

    2) загрузка файлов и обновление криптов с перезапуском апача:

    Возьмем набор групп и хостов из прошлого примера и напишем к ним новый скрипт:

    @script path_1 {
    command su # Хочу быть владычицей морской
    expect Password # ждем пока нас спросят о пароле
    command MegArOooOtPas$ # вводим его
    exitcode 0 # ждем экзит кода
    upload local_code.tgz /tmp/remote.tgz
    command cd /path_to_www1/ # идем туда куда надо
    exitcode 0 #ждем экзит кода
    command tar xzpf /tmp/remote.tgz # обновляем код
    exitcode 0 #ждем экзит кода
    command /etc/init.d/apache restart # перезапуск апатча
    exitcode 0 #ждем экзит кода
    }

    @script path_2 {
    command su
    expect Password
    command MegArOooOtPas$
    exitcode 0
    upload local_code.tgz /tmp/remote.tgz
    command cd /path_to_www2/ # для этой группы путь другой
    exitcode 0
    command tar xzpf /tmp/remote.tgz
    exitcode 0
    command /etc/init.d/apache restart
    exitcode 0
    }


    вот так вот просто и быстро можно решать объемные задачи в короткие сроки,
    кстати попробуйте на досуге сделать тоже самое мышкой на 10 win машинах.

    От автора(catdog):

    Сайта программы пока нету и вряд ли у меня есть на него время, однако багфиксы и улучшения по мере возникновения будут выкладываться в репозиторий. Так же если у вас есть замечания и предложения то пишите мне на мыло в профиле. Кармы у меня не хватает на публикацию так что ищите обновления вот тут вот:

    svn.myau.su/listing.php?repname=robot

    в tags находятся стабильные версии в trunk нестабильная.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 46

      0
      я использую cssh
      • UFO just landed and posted this here
      • UFO just landed and posted this here
          +3
          я ж тебе говорил — fabric / capistrano
          • UFO just landed and posted this here
              0
              А чем капистрано не подходит? Требование к знаниям языка опускаем, ибо в тасках все просто как грабли (если особо не вдаваться в подробности).
              Там есть и группы, и shell, и ssh (авторизация по ключу). Да и судо тоже. И загрузка/скачивание файлов посредством разных транспортов.
                0
                capistrano на руби, это добро обычно по умолчанию, например, в Ubuntu не стоит.

                C/C++ все же пока, если силы воли и времени много, резонней.
                  0
                  Себе его поставить совершенно несложно (благо, ставить-то единожды). А на удаленных машинах ничего (кроме ssh-ключей) и не нужно.
                    0
                    Ну это да, без проблем, конечно.

                    Однако, традиционно ценятся утилиты, написанные без тяжелых зависимостей и на Си.
                      0
                      Я бы оспоспорил это утверждение. Для многих юзабельность и расширяемость решения, а также затачиваемость его под свою специфику играет решающую роль.

                      Например, по той же причине для деплоймента я использую Capistrano, хотя Vlad быстрее и легче. Но я банально не смог на нем сделать то чего хотел.
                        –1
                        Конечно, спору нет. Если есть очевидные плюсы, то спорить не приходится.

                        Но при всех прочих равных условиях я предпочту утилиту на Си.
            0
            > @script path_1 {
            Одно имя скрипта для разных групп? А как они тогда идентифицируются какой группе какую процедуру выполнять?
            Может все-же для первой группы "@script path_1 {" а для второй "@script path_2 {"
            • UFO just landed and posted this here
                0
                > @group path_2 {
                > 192.168.0.4
                > 192.168.0.5
                > 192.168.0.6
                > }
                > Обратите внимание что логин и пароль здесь не пишутся только имя хоста.
                А если все-же на данных серверах разные логин\пароль (что в принципе логично с точки зрения безопастности), то как быть в таком случае?
                • UFO just landed and posted this here
                  –1
                  Оно умеет результат программы передавать по пайпу программе на локальном хосте?

                  >кстати попробуйте на досуге сделать тоже самое мышкой на 10 win машинах
                  мышкой? powershell же
                  • UFO just landed and posted this here
                  • UFO just landed and posted this here
                      0
                      по поводу паролей — а не проще ли использовать ключи?
                      • UFO just landed and posted this here
                          0
                          эм… а как вы соеденяетесь по SSH?
                          просто если через ssh то это на уровне самого ssh как бе…
                          • UFO just landed and posted this here
                        +12
                        — Знаешь, что он сделал? он наблюдал за моей работой 10 минут, а потом начал придумывать простую часть программы, которая заменила бы меня!
                        — А это вообще возможно?
                        — Как оказалось — да…

                        Теория большого взрыва (The Big Bang Theory)
                          0
                          clusterssh?
                            0
                            Интересная вещь! А только через GUI умеет? Можно её через тот же ssh запустить удалённо и переключаться, скажем как между screen -r?
                              0
                              Ммм, а почему бы её через тот же ssh не не запустить удалённо, и работать через GUI?
                                0
                                через ssh запустить X? я пускаю через VNC — но трафик поболее чем с ssh.
                                  0
                                  Угу. ssh -X.
                                    0
                                    хмм, ни разу не пробовал. Putty умеет этот выкрутас?
                                      0
                                      умеет, там в настройках есть перенаправление Х на локальную машину, но все равно нужно пускать Х манагер типа рефлекшена чтоб окошки на локалке отрисовывало )
                                0
                                эххх, вот бы вас на каналы типа 9600bps, как бывало ранее неоднократно (async leased line или дохлый провайдерский диалап) — о гуях даже и не думали бы =)

                                только скрином и спасался =)
                                  0
                                  во время ддоса испытать такую скорость — вполне возможно :D
                              +2
                              есть еще cfengine и puppet например
                                +1
                                Puppet лучше, имхо.
                                  0
                                  да они оба лучше самодельного огорода, на мой взгляд =) хотя если много свободного времени и огонь в глазах почему нет?

                                  но, опять же, чтобы создать интересный продукт нужно знать что умеют уже существующие продукты в этом классе =)
                                +1
                                товарищи, плюсуйте автора — catdog, а не меня
                                  +3
                                  Puppet ?

                                  Puppet, the configuration management solution.

                                  The Puppet framework provides a means to describe IT infrastructure as policy, execute that policy to build services then audit and enforce ongoing changes to the policy.

                                  Puppet helps accomplish the goal of a hands-off, automated infrastructure. The benefits of automated infrastructure go beyond policy-enforced consistency and auditing. The impact of hardware failure and other disaster scenarios can be mitigated, as services can be quickly restored by Puppet. In conjunction with virtualizaton, the ability to reliably create new systems running consistent services can be leveraged to create autoscaling applications as well as test systems identical to production environments.
                                    0
                                    Когда-то использовал dsh.
                                    dsh executes command remotely on several different machines at the same time
                                      +1
                                      А не проще было авторизацию по ключу настроить, чем пароли шифровать?
                                      • UFO just landed and posted this here
                                        0
                                        В качестве дополнения: если парк управляемых машин небольшой и подобные задачи возникают сравнительно редко, то можно обойтись и [полу]штатными средствами. у меня на всех серверах настроена аутентификация по ключу, а в konsole настроены профили сеансов ко всем серверам, так что для того чтобы зайти на нужный сервер достаточно просто начать соответствующий новый сеанс (при желании их можно сгруппировать в отдельных окнах konsole). Потом в меню konsole выбираем пункт меню «Копируем ввод во вкладку» и выбираем — куда сообственно копировать ввод. Полуштатными я назвал это все потому, что не все используют KDE, а про Гном и другие DE я ничего сказать не могу, но уверен что и там есть нечто подобное (вывод сразу на несколько сессий одновременно), но авторизация по ключам — это вещь к DE никоим образом непривязанная.
                                        P.S. Хабралюди, а можно ли копировать вывод в различные окна screen?
                                          0
                                          А есть еще Expect, который тоже здорово автоматизирует консольные команды.
                                            0
                                            насколько я знаю — он автоматизирует диалоги вообще.

                                            но умеет ли он обходить группу машин по ssh?
                                            • UFO just landed and posted this here
                                          • UFO just landed and posted this here
                                            • UFO just landed and posted this here

                                            Only users with full accounts can post comments. Log in, please.