Как случайно написать Web-GUI для Haproxy

Современный мир системных администраторов обленил нас красивыми web-face-ами, что даже не охота ставить софт, где нет этого самого «гуя» (чувствую сейчас полетят камни от правоверных строчкеров), ну не через строку же постоянно туда лазить, правда? Все бы ничего, если софт поставил, настроил и забыл, а что делать, если туда надо постоянно лазить, править, ну и конечно же нет лога всех действий, не писать же каждый раз cp cfg cfg_back, со временем запутаешься и забьешь на это дело.



Много лет назад познакомился я с таким чудесным балансером, как Haproxy. Все чудесно и красиво. Стало у меня их много и задумался я о поиске GUI к нему, но его на удивление не было. Очень популярный софт, к тому же достаточно старый, ну да ладно подумал я и продолжил изредка править ручками в своем любимом vi и иметь кучу открытых вкладок со статистикой всех активных серверов. Но настало время и мне пришлось удовлетворять «хотелки» людей, которые писали софт для работы через http, вот тут и началось интересное…

Ручки зачесались, глазки загорелись и я приступил. Точнее начал думать на чем писать, вспоминать давно-давным забытый PHP, как-то не хотелось, да и казалось, что он не совсем подходит для этого дела. В итоге выбор пал на Python, в будущем точно пригодится подумал я и началось впитывание информации.

В начале задачи стояли не такие уж и сложные: возможность редактировать конфиги из веб интерфейса из одной точки входа, сохранения предыдущих версий конфигов. Данный, не особо большой функционал получилось реализовать достаточно быстро, но тут во мне взыграла то ли админская лень, то ли пресловутый перфекционизм и мне этого показалось конечно же мало. И тут начали появляться такие фичи как: сравнение двух конфигов, логирование всех действий связанных с конфигами, Runtime API и добавления секций, через web.



И как порядочный UNIX администратор живущий за счет свободного ПО я решил поделится с миром, а в друг кому-то пригодится? Но для этого надо было сделать все так, чтобы не приходилось лазить в код, но максимум в конфиг приклады(Сейчас большинство настроек переехало в базу. Как по мне их стало удобней редактировать и при обновлении не будет ошибок из-за отсутствия в конфиге какого-либо параметра).

Спустя месяц я выложил свою поделку на Github особо не на что не рассчитывая. А зря, софт оказался слегка востребованным и тут началось самое интересное… Активная «допилка» идет уже почти год. Порой есть желание все это бросить, т.к. мои потребности перекрыты уже давно. Ну вот зачем мне возможность развернуть «кластер» с keepalived и HAProxy через веб морду, если у меня это занимает от силы пару минут? А людям оказывается надо, да и мне интересно, и есть чем заняться. Хотя конечно же есть и нужные мне функции, например, как мониторинг бэкенд серверов, доступны ли они для Haproxy. У нас конечно же есть корпоративный мониторинг, но там сидят люди, которые могут достаточно долго реагировать, + т.к. мой отдел занимается разработкой и софт то появляется, то исчезает достаточно долго пробиваться через бюрократию.



В общем решил поделится, ведь получается, что это единственный бесплатный GUI. А вдруг кому пригодится? Ссылка на GitHub.
Поделиться публикацией
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 23
    +6
    Все классно и уверен, что gui нужен, но вот пары моментов в install.sh меня содрогнуло:
    apt-get install… apache2…
    и ниже установка maria-db
    Эээээ зачем вы так сразу с горяча?
    Предоставьте право выбора и установки пакетов админу, ну не используют я апачь и ради gui он мне не нужен, а вы тут сразу его ставите, и мария у меня может стоит уже, причем из оф. репозитария.

    Гораздо правильней написать инструкцию как ставить ваш софт под ту или иную конфигурацию, чем писать инсталлятор. Инсталлятор в 99% случаев не заработает на сервере где уже куча зоопарка.

    А еще лучше создать docker контенер со всем что нужно.

    А так спасибо за gui.
      +2
      согласен на счет докер образа.
        +5
        Спасибо за все классно )

        Docker образ есть, а инструкция спрашивает насчет выбора базы — предлагает на выбор sqlite и mariadb, если выбрать марию, то на выбор будет 2 пункта: установить или использовать уже имеющийся сервер. Так же есть инструкция по ручной установке для Apache, думаю не трудно будет ее применить для того же Nginx-a

        Все это описано в Readme репозитория :)
          +1
          Ох уж этот яблокофон у меня, Readme то он как раз по умолчанию и не показал, а там и вправду все есть. Прошу прощения.
        +2
        а что делать, если туда надо постоянно лазить, править, ну и конечно же нет лога всех действий, не писать же каждый раз cp cfg cfg_back, со временем запутаешься и забьешь на это дело.

        Конфиг Haproxy в Ansible, Ansible в гит. И никаких проблем с версионированием изменений. Плюс без проблем разливается на кучу серверов.
        Для сбора статистики — экспортер в Prometheus, откуда можно вытягивать данные в Grafana и строить красивые графики.

        Ваш подход без сомнения имеет право на жизнь, но по моему описанное выше больше соответствует UNIX-way, т.к. легче масштабируется до десятков-сотен серверов и очень легко умеет в автоматизацию. Накрутить дополнительной логике в Ansible дело нескольких минут, на крайний случай часов, и вот у вас уже есть например авто дискавери бэкендов или автоматическое указание веса бэкенда в зависимости от количества процессорных ядер на нем и все остальное, что вы только сможете придумать. ;)
          0
          В статье забыл указать еще одну причину написания веб интерфейса — чтобы меня реже дергали ) Чтобы некоторые программеры, которые совсем не админы могли сами периодически что-то делать, а на сервера их пускать не хотелось. Ну и как не крути, сейчас у веб морды больше возможностей чем у ansible

          Но вообще спасибо за идею, можно избавится от скриптов и перейти на ansible
          –3
          Я может что то упустил, но почему в статья ни слова о технической составляющей проекта? Ну например:
          — почему питон? Php изначально был заточен под веб, а у вас вроде как вебморда
          — использовали какой то Фреймворк? Если да, то почему этот. Делали какое то сравнение?
          — с какими необычными проблемами столкнулись и как их в итоге решили

          Ну и т.д.

          P.S.
          У вас очепятка в readme.md, user-frendly пропущена буква i

          P.P.S
          Bash скрипты без -eu, как минимум, это рано или поздно — выстрел себе в ногу
            +1
            Я может что то упустил, но почему в статья ни слова о технической составляющей проекта?

            Потому что это не техническая статья )
            Но если вам интересно, то я с удовольствием расскажу

            — я вроде описал почему он. PHP — да, был заточен под веб, но именно под веб, а питон под систему и так как много придется работать именно с системой, то мне подумалось, что он лучше подходит. К тому же сейчас кучу-кучную пишут на питоне для веба
            — в начале только Python и JQuery, со временем прикрутил Jinja2, т.к. стало поддерживать «макаронный» код стало сложно. Надеюсь, что когда-нибудь перейду на Flask или Django, но это не точно )
            — самая интересная, так это то, что я не могу заставить работать апач с пост, вообще ужас… поэтому в некоторых формах пришлось использовать ajax для большей «секурности», но пост был бы лучше. Раздражает, что браузеры кэшируют по разному: ФФ кэширует формы, а хром скрипты, пару раз были из-за этого проблемы )

            P.S. спасибо, поправлю
            P.P.S. в принципе согласен, но пока хромых не замечал, даже как-то мигрировал продуктивное облако openstack в другое облако с помощью скрипта )
            0
            Страшно представить, что бы у вас вышло если бы вы написали этот гуй специально…
            Так держать! :)
              0
              Ну не так что бы уж очень и страшно, скорее лень и интерес

              Спасибо)
              0
              В README.md есть описание как развернуть образ из aidaho/haproxy-wi, а можно ли увидеть Dockerfile?
                +1
                Разве при скачке образа его нельзя посмотреть?

                А так вот он:

                FROM centos
                MAINTAINER Pavel Loginov (https://github.com/Aidaho12/haproxy-wi)
                
                ENV http_proxy ip:3128
                ENV https_proxy ip:3128
                
                COPY epel.repo /etc/yum.repos.d/epel.repo
                
                RUN yum -y install git nmap-ncat python34 dos2unix python34-pip httpd yum-plugin-remove-with-leaves svn gcc-c++ gcc gcc-gfortran python34-devel
                
                COPY haproxy-wi.conf /etc/httpd/conf.d/haproxy-wi.conf
                
                RUN git clone https://github.com/Aidaho12/haproxy-wi.git /var/www/haproxy-wi
                
                RUN mkdir /var/www/haproxy-wi/keys/
                RUN mkdir /var/www/haproxy-wi/app/certs/
                RUN chown -R apache:apache /var/www/haproxy-wi/
                RUN pip3 install -r /var/www/haproxy-wi/requirements.txt --no-cache-dir
                RUN chmod +x /var/www/haproxy-wi/app/*.py
                RUN chmod +x /var/www/haproxy-wi/app/tools/*.py
                WORKDIR /var/www/haproxy-wi/app
                RUN ./update_db.py
                RUN chown -R apache:apache /var/www/haproxy-wi/
                RUN chown -R apache:apache /var/log/httpd/
                RUN tools/checker_master.py &
                
                RUN yum -y erase git python34-pip python34-devel gcc-c++  gcc-gfortran gcc --remove-leaves
                RUN yum -y autoremove yum-plugin-remove-with-leaves
                RUN yum clean all
                RUN rm -rf /var/cache/yum
                RUN rm -f /etc/yum.repos.d/*
                
                EXPOSE 80
                VOLUME /var/www/haproxy-wi/
                
                CMD /usr/sbin/httpd -DFOREGROUND
                  0
                  Помните что каждая команда в докере — это слой? Однородные команды лучше в одну строку запиливать. Да, и по возможности, все эти update/install выносите в самый конец, чтобы остальные слои не затрагивать при обновлениях пакетов.
                  Вообще, вы молодец, много кто просто боится выложить свои наработки.
                    +1
                    и сам себе отвечу, если вам сборка была нужна только чтобы получить бинарник или выполнить скрипт (ы), используйте мульти-стейдж сборку, в конечном образе не будет мусора. Ведь эти uninstall/purge уже не помогут, файлы останутся в низлежащих слоях образа.
                      0
                      Ну надеюсь не зря выложил )

                      Надо почитать, не сильно углублялся в сборку образов, спасибо за совет
                        0
                        Воспользовался вашим советом и объединил все в один слой, теперь образ стал на 107 МБ меньше, и dockerfile выглядит так:

                        FROM centos 
                        MAINTAINER Pavel Loginov (https://github.com/Aidaho12/haproxy-wi) 
                        
                        COPY epel.repo /etc/yum.repos.d/epel.repo 
                        
                        RUN yum -y install httpd
                        
                        COPY haproxy-wi.conf /etc/httpd/conf.d/haproxy-wi.conf 
                        
                        RUN yum -y install git nmap-ncat python34 dos2unix python34-pip yum-plugin-remove-with-leaves svn gcc-c++ gcc gcc-gfortran python34-devel && \ 
                        git clone https://github.com/Aidaho12/haproxy-wi.git /var/www/haproxy-wi && \ 
                        mkdir /var/www/haproxy-wi/keys/ && \ 
                        mkdir /var/www/haproxy-wi/app/certs/ && \
                        chown -R apache:apache /var/www/haproxy-wi/ && \ 
                        pip3 install -r /var/www/haproxy-wi/requirements.txt --no-cache-dir && \ 
                        chmod +x /var/www/haproxy-wi/app/*.py && \ 
                        chmod +x /var/www/haproxy-wi/app/tools/*.py && \ 
                        chown -R apache:apache /var/www/haproxy-wi/ && \ 
                        chown -R apache:apache /var/log/httpd/ && \ 
                        yum -y erase git python34-pip python34-devel gcc-c++ gcc-gfortran gcc --remove-leaves && \
                        yum -y autoremove yum-plugin-remove-with-leaves && \ 
                        yum clean all && \ rm -rf /var/cache/yum && \ 
                        rm -f /etc/yum.repos.d/* && \ 
                        cd /var/www/haproxy-wi/app && \ 
                        ./update_db.py 
                        
                        EXPOSE 80 VOLUME /var/www/haproxy-wi/ 
                        
                        CMD /usr/sbin/httpd -DFOREGROUND
                      0
                      Спасибо, что показали Dockerfile. У Вас не automated build образ, посмотрите в эту сторону по возможности. И ещё бы рекомендовал делать на Alpine, но это из личных убеждений…
                        0
                        Читал, когда только создал репозиторий, но я понял так, что мне это не подходит
                          0
                          Получилось запустить, прям CI получился )

                          Как бы теперь сделать, чтобы не хранить мусор для образа в основной репе… Пока создал другой репозиторий
                      0

                      В софтварном маршрутизаторе pfsense пакет haproxy тоже как и все остальное в нем настраивается через gui.

                        0
                        Это да, но тут суть чуть-чуть другая. В pfsanse или snapt, ты можешь управлять только одним сервисом Haproxy, в случае pfsanse так еще и куча левого софта будет. А тут только хапрокси и огромное любое количество серверов… Ну и плюс плюшки, которых нет в pfasnse и snapt
                          0
                          ну как бы pfSense это шлюз, да его нет смысла держать ради HAproxy одного. HAproxy в pfSense это доп плюшка всеголишь, и он может работать в режиме Master и Slave если включить High Availability между 2мя pfSense.
                            0
                            HAProxy тоже умеет мастер/слэйв, достаточно добавить keepalived и данная веб морда может помочь вам это сделать ;)

                            ну как бы pfSense это шлюз, да его нет смысла держать ради HAproxy одного. HAproxy в pfSense это доп плюшка всеголишь

                            ну я вот собственно о том же…

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое