for host in master-db{1..3} slave-db{1..8}; do echo -n "${host} "; ssh ${host} 'grep -P '\''^#UUID=[\da-f-]+\s\/var\/lib\/mysql'\'' /etc/fstab | grep -oP '\''(?<=UUID\=)[\da-f-]+'\'''; done
Насколько я понимаю раньше шеллы использовались в качестве примитивных высокоуровневых языков. Сейчас у нас есть Perl, Python, nodejs, php...
Можно добавить в условный js новые операторы, получить новый язык и радоваться жизни.
При этом bash и sh несовместимы.
Назвать bash языком программирования у меня бы язык не повернулся,
с точки зрения любого языка программирования синтаксис bash ужасен.
Но нужно понимать что это командный процессор, а не язык, что многое объясняет.
Там есть немного про shell. Если коротко: shell - весьма жуткая вещь с кучей проблем и костылей.
Не проще ли зафорсить версии ВСЕГО софта,
Какой смысл от миллиарда устройств с bash, если на одном из них не будет wget?)
ООП бесполезная трата ресурсов, ведь все можно сделать через if и for
Но, действительно, спорить бесполезно с человеком, кто не писал ничего сложнее скриптов автоматизации
Понимаю, что для сисадмина все разработчики занимаются фигнёй, ведь все можно просто и легко сделать в bash.
Как вы это сделаете в принципе?
А wget никогда не был частью баш
Проблема большинства ООП программистов - оверинженеринг. Огромный оверинженеринг.
Контейнеры - то есть чтобы запустить скрипт установки mysql или скрипт для обновления версии httpd вы будете устанавливать докер и запускать контейнер?
Банально, скопировать файл - проще в баш, чем в python и проще чем в джава.
Банально, работать в командной строке - проще чем в баш, чем в интерпретаторе питона.
Банально, написать stop/start скрипт - проще на bash. Даже в вашей java бутспринг под капотом запускает баш скрипт, который запускает java ;)
Я к тому и веду, что, имхо!!, это временно.
Только, опять же, джава легко тестируется, более удобна, легко шерит код между проектом и "скриптами" автоматизации, не использует никакие костыли.
Это "используем современные подходящие технологии, без велосипедов и заебов". Да, намного проще запустить контейнер с клиентом мускула, что бы создать базу и намного проще обновить контейнер с httpd, чем пытатся сделать это руками/косячной автоматизацией на баш.
огромный оверинженеринг для вещей вроде копирования файла
Вам самому не смешно от этой чуши?
Баш тоже легко тестируется - +x и все
Непонятно что такое шарить код между проектом и скриптом автоматизации - скрипты на баш это просто код.
Но в продакшене, база должна просто жить, используя доступные ресурсы самостоятельно.
Именно поэтому в нормальной ситуации вы не ставите себе в облаке базу, а используете готовое облачное решение.
Зачем обновлять контейнер с httpd, если httpd это практически по дефолту уже установленный в системе сервис, и обновить его можно не косячным скриптом с контейнером, а штатным пакетным менеджером.
Ну вот, можете посмотреть на баш-скрипт посложнее: https://github.com/sfkulyk/jks-manager/wiki
Но давайте поговорим не о копировании файла, а, например, о билде и деплое проекта.
Я про автоматические тесты.
Из банального:
- погрупировать таски
- записывать время выполнения каждой мелкой таски
- проверять что она не завалилась
- репортить все это в какой-нить слэк в конце
- делать ролбек в случае неудачи
- подчищать за собой остатки
Все это делается очень легко с помощью нормального языка. С bash это адская боль.
Ну, например в проекте есть код, вытаскивающий актуальную версию чего-то там с помощью какого-нить github SDK. Потом эта версия понадобилась в каком-то скрипте. Если проект и скрипты на одном языке - это элементарно шерится. Если на разных - проще вообще не шерить.
Ну да. Как часто вы обновляте базы на продакшене? Девелоперы хотят делать это условно раз в месяц, но без контейнеров заниматся этим будут в лучшем случае раз в два-три года.
Да нет, не использую. Над таким "облачным решением" обычно ноль контроля - оно падает когда захочет, обновляется только руками в дешборде, отстает по версиям от self-hosted.
Затем что обновлять его нужно одновременно у девов, QA, на тестовых, на стейдже, на продакшене. На каждом хосте ручками ставить нужную версию? А она же еще совпадать должна!
Автоматические тесты не имеют отношения к конкретному языку программирования.
Каждый уважающий себя язык программирования имеет свои библиотеки и инструменты для юнит тестов и автотестов, поэтому тут не должно быть некоего универсального языка.
Это должно решаться средствами того языка, на котором пишется проект.
как девопс
Я это решаю в первую очередь CI/CD инструментом, в котором может использоваться и простые bash скрипты и сложные технические решения вроде GRP в оракле или kubernetes.
Вот каким именно нормальным ЯЗЫКОМ вы это решаете
А в чем проблема, если каждый инструмент будет лезть в github своим методом?
Апгрейд версии?
База в кластере, апгрейдим по очереди ноды, соблюдая инструкции совместимости и все.
Значит у вас нет потребности в стабильности крупной базы, если self-hosted достаточна.
Опять таки, в большом проекте апгрейдиться на каждую минорную версию совершенно неподходящее решение.
Совпадать опять таки должна не всегда, httpd редко вызывает несовместимость, это же не php
Ваша проблема, что вы кидаетесь словами подразумевая какой-то свой локализированный случай, но при этом пытаетесь сказать что ваш опыт в конкретном проекте с конкретной инфраструктурой обязательно должен подойти всем.
Это отличный универсальный скриптовый язык программирования, библиотеками к которому становится любая консольная команда, особенно соблюдающая posix стандарты.
Все современные скриптовые языки - монструозные по сравнению с баш. При этом их функционал - в первую очередь это библиотеки, которые привязаны к языку, и они обновляются вместе с языком.
В то время как баш пользуется просто консольными программами, которые универсальны, и которых уже есть достаточно, и обновление конкретных программ независимо от баш.
либо вы не понимаете, как работает баш, либо не знаете что в баш даже отдельно существуют типы данных integer string и array. И внутренняя реализация этого вполне достаточна для баш скриптов.
Примитивный анализатор ;))))) это смешно.
Проблема большинства ООП программистов - оверинженеринг. Огромный оверинженеринг.
Контейнеры - то есть чтобы запустить скрипт установки mysql или скрипт для обновления версии httpd вы будете устанавливать докер и запускать контейнер?
Не понимаю какое вообще отношение ООП имеет к if и for, вы точно считаете, что знаете что такое ООП? ;)
Кроме того, я не сисадмин и в свое время работал с Си со всей заморочкой с указателями и работой с памятью.
Примитивный - это не попытка обидеть вашу любимую игрушку, это констатация факта. Если в python вы положите команду в переменную, она не начнет выполнятся при выводе на экран.
$ A="echo B"
$ echo $A
echo B
Верно. И у bash нет нормальных тест-фреймворков.
Конечно, да. Но тут либо CI/CD решает 100% задач, либо приходится допиливать что-то. И, опять же, редко когда удается допилить требя строчками bash скрипта.
Ну вот помимо существующих CI/CD, с радостью попробую kotlin script.
В том, что этот метод нужно поддерживать в двух местах, вместо одного? Насобирать три-четыре таких места и никто не захочет это трогать.
И как это решает то, что люди (девопсы) за*бутся апгрейдить ее постоянно ручками? Да никак, проекты тупо забивают и скедьюлят "апгрейд архитектуры" раз в миллион лет - ну потому что не будут же они обновлятся раз в месяц. А фиксы, нужные фиксы базы, релизятся раз в месяц, если не чаще.
Если вам в жизни удастся поуправлять самолетом, вы не станете пилотом.
А вы пишите, что вполне нормально копировать все страницы памяти, для простейших операций.
Но писать про это предлагая взамен полное копирование всех страниц памяти интерпретатора (fork) даже при элементарных операциях - это показывать полное непонимание на чем можно экономить
Но, работая с Си, вы должны были заметить отличия в разделении кода и данных, кастомных типах позволяющих создавать сложные типы данных и огромное кол-во функционала который позволяет назвать Си универсальным языком программироавния в отличии bash специализирующего на запуске команд.
я смотрю на это со стороны девопсотлично – вам баш не очень и нужно.
Который требует компиляции и джава машины для запуска? Ладно еще для автотестов с метриками и так далее, но для базовых простых задач? или того же апгрейда базы данных? ... печально
А если у вас 5 микросервисов, у вас будет 5 мест или одно?
Непонятно что такое за разные места и в чем заключается сложность. Я редко встречал проекты, написанные один в один - как минимум бэк и фронт зачастую разные фреймворки, а то и разные языки программирования, вот уже два места вместо одного. И в чем собственно проблема?
Фиксы для базы, которые могут вызвать несовместимость данных
При этом автоматизировать апгрейд на том же баше - да нет никаких проблем. В этой штуке автоматизация сложна в первую очередь на организационном уровне, а именно - когда делать апгрейд, сколько времени он займет (потребуется ли конвертация самих данных), будет ли даунтайм приложения, если все пойдет не так, сколько времени займет откат назад, и соответственно согласование этих этапов.
Вот вы пишете на фреймворке, а к нему выходят те же обновления уязвимости. Как вы его обновляете каждый месяц? Или фреймворк вы так часто не обновляете, и почему-то считаете что уязвимости в базе важны, а в фреймворке нет?
новые патч версии наоборот более стабильны. Возможно выше назвал их "минорными" - если так, то имел в виду именно патч. В них только багфиксы, они априори не могут быть менее стабильными)
А ваши апгрейды базы не требуют доп. зависимостей? Вот прям никаких? На голом alpine все запустится? Не смешите.
чем тонна непонятных бинарников на уровне системы непонятных версий и, как сказали выше, с непредсказуемым IO.
Одно, конечно же. Либо один микросервис, либо одна общая библиотека.
Да не будет никаких проблем, поднимая патч версию. А остальное - о чем я и говорю. Поднимать версию руками так точно никто не станет чаще раза в год. Если оно обновляется по указанной где-то там версии само, одновременно на всех енвайронментах и у всех девов - та хоть раз в месяц.
Я не говорил про уязвимости) Я говорил про очевидные баги базы, вызывающие проблемы у конечных юзеров проекта.
Да, если в фреймворке есть таковые и оно решено в новых версиях - мы поднимаем версию, конечно.
И обновляем мы его меняя циферки версии в одном файле, diff на одну строчку :)
новые патч версии наоборот более стабильны. Возможно выше назвал их "минорными" - если так, то имел в виду именно патч. В них только багфиксы, они априори не могут быть менее стабильными)
Обычно апгрейды самой базы не требуют никаких дополнительных зависимостей. Все зависимости которые нужны - они нужны для работы самой базы и уже установлены. А вот ставить дополнения и зависимости для "скрипта, который запустит обновлялку" - imho перебор.
Все нужные для работы баша бинарники
То есть фронт и бек у вас всегда один микросервис? И написан на одном фреймворке?
Я не понимаю. Почему для вас баш - это обновление руками?
плохую базу...
Зачастую смена версии фреймворка может потребовать неслабых изменений в коде.
У вас очень, очень, очень простой проект.
Вдобавок вероятно нет аудита и возможность ставить что хочется из инета напрямую.
Ну мы же для примера взяли базу и вообще процесс обновления) Явно не может быть такого, что всегда обойдется без зависимостей, это нонсенс.
Для баша? Или для типичных (опять же, типичных в моем понимании) скриптов на нем? Первое - это понятно, а второе - отписал выше)
Нет. Вы же спросили про "метод", я про него и ответил. Фронт и бэк априори не могут быть на одном фреймворке, но легко могут использовать библиотеку, написанную на одном языке.
Ну не прям руками. Но и не автоматически. Опять же: есть у вас 50 девов и в придачу еще 6-8 стейдж/прод енвов. На каждом будете вручную запускать скрипт, даже если допустить, что он универсально выполнится на linux/macos/docker разработчиков и условный ubuntu/docker стейджов? А если через день найдется бажок и нужно будет откатить? Опять все руками?
Это, все таки, разные вещи. Если вас в команде 3 человека и у вас только стейдж и прод - ок, это терпимо. Но с любым более-менее большим проектом это совсем не работает.
Патч и даже минорная - нет, не требует, иначе вам стоит сменить фреймворк. Если мажорную - конечно, но мажорные версии любых больших продуктов выходят не чаще раза в год. Там подготовка, согласование и костыли при апдейте - вполне нормальны.
Вообще я не понимаю, как это связанно с тем, о чем мы разговариваем. Но все проходит через пулл реквесты, встроенные автоматические секьюрити чеки и проверку лицензий. Если имеется в виду ручной аудит, то это либо просто еб*нутые конторы, которым некуда потратить сотни тысяч на разработку собственных решений (вместо тех, которые предполагаемо не пройдут аудит), либо очень большие конторы, которым это даже выгодно.
подавляющее количество софта при обновлении новых зависимостей не требует.
gnu tools - популярные утилиты.
Баш тоже может использовать библиотеку, написанную на том же языке.
Ну значит вы не понимаете, что баш это не оркестратор. Можно запускать не вручную, а через jenkins, можно использовать ansible/chef/puppet и другие вещи.
Зачем тащить баш именно туда, где уже есть популярные инструменты, которые НЕ являются другими "более современными" языками программирования, а именно инструментами оркестрации???
То есть автоматический апдейт вообще без вмешательства - невозможен, ибо это в первую очередь организационный момент. Про это я и говорил.
Автоматические секьюрити чеки всегда работают на отлично?
Что вы делаете - обновляете руками эту библиотеку в фреймворке, или обновляете весь фреймворк?
А если нет версии этой библиотеки без уязвимости (по словам вашего секьюрити чека), как вы обходите завалившийся чек?
И самое интересное, как это у вас все выполняется полностью автоматически?
Я уверен что регулярно приходится что-то делать руками.
Я поэтому и уточнил, что мы взяли этот кейс для примера.
Речь вообще может идти не об обновлении. И даже если говорить об обновлении, то аргумент "подавляющее большинство" не валиден, ибо если есть хоть одна софтинка, которой нужно что-то кроме нее самой, то с этим подходом в корне уже что-то не так, раз он не универсален.
Имел в виду то, что для самих скриптов может быть нужно что-то еще. Такие же доп. зависимости, какие могут быть нужны и в примере выше.
Понятно, что простенькие баш скрипты скорее всего будут работать везде. Но даже у этого нет никаких гарантий! Если у ls на макоси или у ls на ubuntu 10 какого-то одного флажка нет, потому что там ls кастомный или старой версии, то даже с "популярными" gnu tools ваш скрипт завалится.
Условная котлин библиотека не компилируется в баш и, обьективно, никогда не будет. А использовать такую библиотеку как executable вы не сможете, так как это библиотека, а не executable :/
Я вел к тому, что решения типа докер компоуза подходят сюда намного лучше, чем любая полу-ручная автоматизация.
Принимаем решение исходя из цены и выгоды обеих решений.
Обьективно, уязвимости находятся довольно редко.
Как выяснилось, пример совершенно нерелевантный, потому что и для базы и для большинства других вещей как раз именно баш лучше всего подходит.
Ничего не нужно.
У любого языка есть свои кастомные штуки при работе в разных ОС.
И совершенно непонятно, почему наличие всего одного флажка вдруг вызывает завал скрипта. Этот флажок может и не использоваться, и в 99% неиспользуется, если ты пишешь скрипт с желанием сделать совместимо.
На джаве легко написать код, который не запустится в 1.8
или не запустится в макос.
Что значит "компилироваться в баш"? Если мне нужно сделать чекалку подключений к монго в джаве, то я могу написать библиотеку на джава именно с нужной версией джава драйвера, и из баша запускать ее с разными коннекшенами. И это будет проще и универсальнее, чем писать на джава все целиком.
Или вы про использование latest в докерфайле?
Или можете привести адекватный пример технического решения проблемы путем замена на более современный скриптовый язык?
Другими словами, вы делаете это вручную, а не используете "более современный язык программирования", о чем и идет речь.
В этом и проблема - все приведенные примеры для пояснения ваших слов на деле выясняются проблемами либо организации, либо оркестрации, и ни один из примеров не решается тем, что вместо баша универсально используется какой-то один другой, более высокоуровневый язык.
Да даже копируя простой tail --lines=100 из ответа стаковерфлоу
Вы не правы, совсем. Языки прячут os-specific штуки за абстракциями. Добится неработоспособности какого-то кода на одной из платформ - очень и очень сложно. Нужно прямо хорошенько постаратся.
.. нет, не можете. То, что вы хотите, называется не библиотека, а целое консольное приложение. Что бы у нее была точка входа, парсер аргументов, вывод exit code, stdout и stderr. Это в разы дольше и сложнее, чем просто библиотека, которую можно использовать только как зависимость к другому проекту и никак иначе.
Не могу, к сожалению. Этот конкретный пример - вообще не место для скриптового языка. А другого примера не знаю, но уверен, что у скриптовых языков есть применение. И именно о таких местах надо было говорить изначально)
Покажите мне этот ответ из стек оверфлоу. Я очень удивлюсь, чтобы кто-то писал --lines=100 вместо -n 100 (а -n поддерживается в макос).
Обратиться к c:\ ?
Обратиться к c:\ ?
Или вы так не делаете? А почему? А может потому что изначально пишете код платформонезависимо?
Так а почему в баш не можете так делать и приводите платформозависимые примеры с --lines=100 ?
Мне как бы никто не мешает вызывать java метод из джарника, вызывая джаву из баша. Я собственно так и сделал - написал маленький код на java, который использует java driver и провожу тесты с разными версиями mongo драйвера. Чтобы тест был релевантным и я мог бы уверенно сказать разработчикам, какие версии java драйвера точно работают.
Так если не можете привести пример, на чем основывается тогда уверенность, что баш давно пора заменить на другой более мощный и современный язык?
баш в качестве универсального языка и оболочки - пока что самый удобный, и альтернативы у него, как я уже писал - ksh или zsh
На примере того же tail все по-другому. tail под linux и tail под macos - может быть вообще двумя разными бинарниками, написанными на разных языках
Могут легко между версиями поубирать флажки, подобавлять новых, поменять вывод, переназвать команды.
Ну да. На каждую либу и метод - по джарнику писать? А если вывод сложнее, чем exit code 1/0? А если нужно аргументы передать, будете парсить ввод? Как костыль - ок, но к хорошему решению этому далеко.
Ну тут наши мнения сильно расходятся. У современных языков есть вся мощь: асинхронность, параллельность, экосистема, синтаксис. Все это далеко не всегда нужно.
Но когда оно нужно, вы все равно будете писать отдельную софтинку на другом языке, даже если используете ее в одном скрипте в одном месте.
Использовать как shell язык программирования просто избыточно
если я правильно понимаю у нас есть язык баш, т.е набор команд, а есть оболочка, куда мы эти команды вводим
просмотр истории команд выполняется внешней утилитой history
баш хранит историю команд в памяти и в файл ее скидывает только при выход
Про Ctrl+C это не проблема, но кто-то должен продавить опцию запуска того же питона без возможности его прервать по ctrl-C, и внедрить это в глобальный репозиторий.
зачем нужна оболочка - понятно, вопрос зачем нужен такой язык как башда непонятно вам ничего: bash (как и любой другой unix–shell) – не отдельный язык, который специально устанавливается, это и есть командная оболочка. со встроенными возможностями скриптования (которые являются "примитивным" ЯП и которые отличаются по возможностям между разными оболочками).