Обучение DevOps на открытом воздухе (7 части серии)
Во-первых, некоторые уборки. Я уже могу сказать, что придумать ежедневное сообщение, будет сложнее, чем мой приятель Алекс с его работой SVG. У него была одна анимация для завершения каждый день. Я трачу весь месяц, работая на одну большую цель.
Тем не менее, я сделаю все возможное, чтобы поделиться чем-то, я учусь каждый день, даже если он маленький.
Фон
Я купил Книга Nigel Poulton’s Bundle от Leanpub И начинаю копать в тех, но научился что-то аккуратное недавно, что я думал, что буду поделиться.
Когда я все еще был в судах, я учил себя, как использовать контейнеры так быстро, как я их реализую в проектах. Узнав, как управлять несколькими наборами контейнеров, я говорил с моими друзьями колледжа, которые были в DEVOPS-Y ролях о использованных они использовались. Это шокировало меня слышать, что все говорят одно и то же:
Вы обычно начинаете с Docker Run
CLI-команды и выпускник для инструментов с большим количеством абстракции, как вам нужны. Docker-Compose
Следующий следующий, за которым следует автоматизировать несколько команд с помощью сценариев Bash, которая в конечном итоге последовала Kubernetes.
Когда я провалил наследие приложений в контейнеры, мне пришлось много перезапустить свои контейнеры. Это привело к мне, научившись использовать сценарии Bash, чтобы автоматизировать много этой боли в моей жизни. Я научил себя вместе, вместе разные фрагменты, которые я нашел на стойке. Это все хорошо и хорошо, но я никогда не читаю книгу или что-нибудь, чтобы действительно получить основы вниз.
На моей новой работе я использую Bash для автоматизации некоторых процессов, и я многому научился на самом деле быть вокруг других разработчиков. [Побочная примечание. Быть правительством одним человеком DEV-магазин становится действительно одиноким.]
Задача
Недавно я недавно поручил создать инструмент, который автоматизировал процесс, который принимает нашу команду из трех человек примерно 0,5 — 1,5 человека каждый день. Это включает в себя много операций Git, поскольку мы готовим к развертыванию производства. Он должен иметь пару глаз на это почти каждый шаг пути. Это утомительно.
К счастью, я смог воспользоваться сценарием, над которым работал коллеги, бросил его в контейнер докеров и использовал это в качестве основы. Эта версия по-прежнему требовала одного из нас, чтобы запустить его снова и снова, пока наш список задач не был завершен. Это не собиралось летать — это необходимо, чтобы быть автоматизированным до конца, и это необходима фактическая обработка ошибок, чтобы сообщить нам, когда что-то сломалось.
После его создания, у меня был хороший маленький CLI-инструмент, который имел горстку различных флагов, которые изменили бы, как скрипт управлял в зависимости от задачи под рукой. Я построил такие вещи, как это для суда, и никогда не побежал в любых проблемах, так как я просто строил инструменты для моего собственного использования.
Мой коллеги посмотрел на него и спросил «Почему эти флаги должны быть в определенном порядке?»
Честно говоря, я даже не считал этого. Было шесть флагов, а не все они использовались каждый раз. Если в правильном порядке они не были добавлены в правильном порядке, скрипт сломался, а дерево филиала GIT может быть скомпрометирована.
Нет Буэно.
Решение
Я очень быстро познакомился с переключателями Bash и всем весельем, который идет с ними. Сейчас я пишу код в течение нескольких лет, поэтому я знал достаточно, чтобы настроить быстрый коммутатор после поиска Google, но я не знал правильного способа обрабатывать ошибки.
#!/bin/bash # Basic switch to handle a couple of flags case "$1" in a ) printf "Option A \n" exit 1 ;; b ) printf "Option B \n" exit 1 ;; esac
И есть все виды ошибок с коммутаторами, чтобы обрабатывать флаги в инструменте CLI:
- Пользователь может просто не знать правильный способ позвонить в ваш инструмент.
- Пользователь может ввести флаг, который вы не намерены их использовать.
- Флаг может понадобиться дополнительный аргумент, который пользователь не предоставил.
Ну, первое исправление легко. Мы просто добавляем еще один флаг, чтобы распечатать текст справки:
#!/bin/bash # Basic switch to handle a couple of flags, with added help flag case "$1" in h | help ) printf "HELP MESSAGE \n" exit 1 ;; a ) printf "Option A \n" exit 1 ;; b ) printf "Option B \n" exit 1 ;; esac
Давайте убедитесь, что это работает:
hquinn$ ./example.sh -a Option A hquinn$ ./example.sh -b Option B
Следующие два исправления на самом деле, где появится мой новый Tidbit. Нам нужно позволить нашим пользователям войти в флаги в любом порядке. Мы также нуждаются в том, чтобы они могли войти в аргументы своими флагами.
Подумайте о команде yum установить git
Отказ
Ням
Ваш инструмент, Установить
Ваш «флаг», а Гит
Является ли аргумент, который вы проходите с вашим флагом к вашему инструменту.
Я узнал, что после обертывания вашего корпуса во время цикла вы можете использовать встроенную функцию Bash Гутопты
Чтобы ограничить типы флагов, которые могут даже сделать его в ваш выключатель:
#!/bin/bash # Switch to let users place flags in any order they want while getopts ":hab" opt; do case ${opt} in h ) printf "HELP MESSAGE \n" exit 1 ;; a ) printf "Option A \n" ;; b ) printf "Option B \n" ;; esac done shift $((OPTIND -1))
Что происходит, когда мы бежим этим?
hquinn$ ./example.sh -h HELP MESSAGE
Хорошо, круто. Теперь мы можем использовать $ {opt}
Переменная в нашем коммутаторе, чтобы бросить нас в разные случаи. «: HAB
Бит в то время как цикл инстанции — это то, что позволяет нам ограничить, какие флаги даже могут сделать его в коммутатор. Если флаг не находится в этом списке, наш коммутатор не отключается, а код не работает. Очень просто.
После любого из этих букв в этом списке пределов флага мы можем разместить другой :
Чтобы обозначить, что конкретный флаг требует добавленного аргумента:
#!/bin/bash # Switch to let users place flags in any order they want while getopts ":hab:" opt; do case ${opt} in h ) printf "HELP MESSAGE \n" exit 1 ;; a ) printf "Option A \n" ;; b ) printf "Option B \n" newVar=$OPTARG printf "Argument is $newVar \n" ;; : ) printf "Invalid option: -$OPTARG requires an argument \n" 1>&2 exit 1 ;; esac done shift $((OPTIND -1))
Давайте проверим это.
hquinn$ ./example.sh -b whatever Option B Argument is whatever hquinn$ ./example -b Invalid option: -b requires an argument
Возможно, вы поймали дополнительные случаи в последнем примере. Когда мы создали флаг, чтобы нужен дополнительный аргумент, Bash предоставляет нам способ ловить ошибки. :
Корпус только запускается, когда флаг, который нуждается в добавленном аргументе (в этом случае, -b
) на самом деле не при условии, что дополнительный аргумент.
Наконец, нам нужно иметь возможность распечатать полезную ошибку, если пользователь вводит флаг, который не в нашем списке разрешенных флагов.
» Генри, Bash дает нам инструмент для этого тоже?
Вы делаете ставку, это делает.
Если приведен недействительный вариант при вызове этого инструмента CLI, вариабельная вариация будет присвоена значение?. Давайте добавим случай, чтобы справиться с этим:
#!/bin/bash # Switch to let users place flags in any order they want while getopts ":hab:" opt; do case ${opt} in h ) printf "HELP MESSAGE \n" exit 1 ;; a ) printf "Option A \n" ;; b ) printf "Option B \n" newVar=$OPTARG printf "Argument is $newVar \n" ;; \? ) echo "Invalid option: $OPTARG" 1>&2 exit 1 ;; : ) printf "Invalid option: -$OPTARG requires an argument \n" 1>&2 exit 1 ;; esac done shift $((OPTIND -1))
Теперь, если пользователь должен был пройти в флаге, мы не хотим их, они получат сообщение об ошибке предупреждая их к этому факту.
hquinn$ ./example.sh -c Invalid option: c
Оказывается, что есть много, что вы можете сделать с флагами в Bash. Если у вас есть скрипт, который работает даже немного по-другому каждый раз, когда вы запускаете его, рассмотрите в него, чтобы добавить в него добавить какую-нибудь логику флага. Требуется несколько минут, и больше, чем пара пытается правильно настроить. Тем не менее, время, когда он экономит вас позже с полезными консольными сообщениями, является бесценным
Я Генри Куинн, и это было весело с флагами. Оставайся морозным.
https://henryneeds.Coffee Блог LinkedIn Твиттер
Обучение DevOps на открытом воздухе (7 части серии)
Оригинал: «https://dev.to/quinncuatro/fun-with-flags-4cm0»