Практические сценарии для DevOps с PowerShell (4 частью серии)
На этой части я буду расширять сценарий мониторинга, который мы написали на части-1, с опросом во время цикла
Привет, я вернулся с тобой с частью 2 этой серии. На этой части я попрошу вас расширить сценарий мониторинга HTTP PING, который мы написали на части-1. Если вы завершили Part-1 Challenge, вы также расширяете свой собственный сценарий. В любом случае я буду предоставлять мою версию решения PAT-1 в качестве отправной точки. Хорошо, давайте прыгнем на нашу заявление о проблеме для этой проблемы.
Проблема
Эй, товарищец развлеченного инженера! Мы любили первый скрипт, который вы написали для нас, теперь мы можем проверить здоровье 10-х годов наших конечных точек с легкостью только с файлом конфигурации. Теперь у нас есть проблема, однако, мы видим, что провалы лота, по-видимому, прерывистым, как, если мы просто повтореемся пару больше раз, мы в конечном итоге получим успешный результат. Мы считаем, что это поведение происходит либо из-за прогрева сервера после нового развертывания или некоторой другой задержки на протяжении всей сетевой связи.
Чтобы отфильтровать эти ложные положительные сбои, мы хотели бы, чтобы новая версия этого скрипта будет иметь механизм повторения, поэтому мы можем по-настоящему выяснить, является ли услуга. Однако в прошлый раз другая инженер устанавливает что-то подобное, которое мы работали на конвейере CI/CD, и для нездорового прогона трубопровода конечной точки никогда не закончится, стоил нашей компании много денег из-за расходов CI/CD-агента.
Таким образом, вам нужно убедиться, что ваше решение соответствует требованиям ниже:
1- повторите попытку теста на максимум n количество времени (настраиваемых) этой конечной точкой, если первая попытка не вернет HTTP 200 отклик
2- Захватите номер попытки успешно реагирования, если конечная точка когда-либо возвращает код успеха
3- Подождите x количество секунд между попытками повторной попытки
4- Перейдите на следующую конечную точку, если достигается максимальная сумма повторных попыток
5- Печатные результаты к терминалу в читабельном формате человека
Какой успех выглядит для этой проблемы
Сценарий, который я написал на части-1, печатал результат, аналогичный:
Теперь мы хотим, чтобы наш скрипт напечатал результат, подобный ниже: теперь на первом запуске моего скрипта я настроил значение Max Retry Parameter, как 2, следовательно, только с 2 повторными видами, не все флакие сайты вернули успешный результат.
Увеличение максимального счета повторных попыток до 10, мы можем увидеть больше конечных точек, возвращающих успешные ответы, при попытках повторных попыток. В этом запуске например FlakyWebsite- # 4 конечная точка возвращает код успеха на 9-й попытке.
В обоих запусках ShalyWebsite- # 1 не возвращает код успеха (как он должен) и наш скрипт выбирают эту конечную точку на максимальное количество раз. Наше решение работает как ожидалось. Большой!
Некоторые указатели для написания собственного решения
Это может быть ваша отправная точка часть-1 файлов моего образца решения Часть-1 файлы
Некоторые тестовые конечные точки, которые вы можете использовать
Поскольку эта часть я предоставим отправной точке, у вас уже будет легко доступно искушенные тестовые конечные точки JSON. Он имеет несколько конечных точек для моделирования разных сценариев. Для получения дополнительной информации, пожалуйста, прочитайте Часть 1.
Основное обучение от задачи
Опрос — это хорошо известная концепция программирования. Вы проверяете состояние системы, оцените результат и сделайте следующий шаг. Мы можем использовать петли для реализации этой логики повторной попытки в нашем скрипте. Однако, чтобы избежать концепции «бесконечной петли», нам нужно убедиться, что мы также реализуем некоторые ограничения и надлежащие Перерыв
Условия для нашего цикла.
Я рекомендовал прочитать документацию PowerShell для петли и перерываться от своих документов. Ссылки: О нас ov_break
Я использую цикл Whicle для этих сценариев, но другие типы петлей тоже будут работать. Это только изменит вашу реализацию, но тот же результат должен быть достигнут.
Задачи, которые вам нужно выполнить в вашем скрипте
1- Инициализируйте параметры/переменные для нужных вам входов. Вам нужны два новых ввода, один для максимального количества повторных попыток и еще один на время ожидания между повторными попытками.
2- Поместите тестирование часть вашего кода в цикле, после вашего теста оценивают результат с помощью условного оператора (подсказка: если/else Block), а затем либо выйдите из цикла While (Hint: Break
)
Из если требуется повторение, дождитесь настроенного количества времени, прежде чем сделать следующую попытку теста.
3- Инициализируйте переменную счетчика и отслеживайте никакие попытки, которые вы в настоящее время пытаетесь. Если ваша попытка теста будет успешной, вам необходимо передать эту попытку нет обратно в главный сценарий. В основном мы хотим, если конечная точка вернула успешный ответ после того, как количество попыток. Пример: 4/5 4 Быть номером попытки, который мы получили успешный ответ, а 5 — это максимальное количество повторов, которые мы хотели бы сделать.
Финальные советы
С этого момента вы увидите мое примерное решение. В зависимости от вашего уровня и стиля обучения, либо посмотрите до или после того, как вы отдали ему свой выстрел.
Мое образец решение
Структура папок
Файлы для моего образца решения
Часть-1 файлы
Tests.json.
Это список конечных точек, которые я хотел бы проверить, сохраненный в формате JSON, который может быть изготовлен и потребляется различными современными языками. То, что у нас здесь — это массив объектов, которые имеют имя и URL-адреса для нас для выполнения и маркировки тестов.
[{ "name": "FlakyWebsite-#1", "url": "https://httpbin.org/status/200,403,404,500" }, { "name": "StableWebsite-#1", "url": "https://httpbin.org/status/200" }, { "name": "FlakyWebsite-#2", "url": "https://httpbin.org/status/200,403,404,500" }, { "name": "StableWebsite-#2", "url": "https://httpbin.org/status/200" }, { "name": "StableWebsite-#3", "url": "https://httpbin.org/status/200" }, { "name": "StableWebsite-#4", "url": "https://httpbin.org/status/200" }, { "name": "FlakyWebsite-#3", "url": "https://httpbin.org/status/200,403,404,500" }, { "name": "FlakyWebsite-#4", "url": "https://httpbin.org/status/200,403,404,500" }, { "name": "FaultyWebsite-#1", "url": "https://httpbin.org/status/500" } ]
Наш помощник функция, создайте этот файл под путь ./lib/New-httpteStestresult.ps1.
Этот скрипт выполнит тест HTTP PING с пропущенными параметрами и возвращает объект результата теста
Обратите внимание на разницу от версии в PAP-1, эта версия имеет 2 новых параметра, а также While Window, чтобы повторить тест если
Код без успеха возвращается из более ранних ответов. Это тот же код, который вы бы написали, чтобы опросить что-либо, вы бы изменили только код
это выполняет тест. Тест может быть kubectl
Команда, которая захватывает ряд стручков из набора реплики развертывания, и вы хотели бы подождать
Для всех контейнеров находятся в состоянии готовности после ручной высококлассы в количестве стручек. Или вы можете выполнить SQL-соединение или Ping Ping Ping TCP TCP для проверки
Здоровье в другом типе не HTTP-сервиса. Возможности бесконечны, но основная структура кода останется прежней.
function New-HttpTestResult { param ( [Parameter(ValueFromPipeline = $true)] [PSCustomObject] $TestArgs, # Maximum Retry Amount [Parameter()][int]$MaxRetryNo = 10, # Time to wait in between retry attempts [Parameter()][int]$WaitTimeInSeconds = 1 ) $ProgressPreference = 'SilentlyContinue' $Method = 'Get' $TestCounter = 0 # -lt: Lower Than while ($TestCounter -lt $MaxRetryNo) { #Increment our counter by 1 before we make our first attempt $TestCounter++ $duration = Measure-Command { $Response = Invoke-WebRequest -Uri $TestArgs.url -Method $Method -SkipHttpErrorCheck } # If we find the 200 code we stop polling if($Response.StatusCode.ToString() -eq '200'){ break; } else { #Else we need to wait for configured amount of time Start-Sleep -Seconds $WaitTimeInSeconds } } $result = [PSCustomObject]@{ name = $TestArgs.name status_code = $Response.StatusCode.ToString() status_description = $Response.StatusDescription attempt_no = "$($TestCounter)/$($MaxRetryNo)" responsetime_ms = $duration.Milliseconds timestamp = (get-date).ToString('O') } return $result }
Test-httpendpoints.ps1.
Наш главный скрипт, мы придумаем этот скрипт, чтобы запустить тесты и производить и возвращает результаты теста множество
[CmdletBinding()] param ( [Parameter(ValueFromPipeline = $true)] [string] $TestsFilePath = '.\Tests.json' ) # Convert JSON Config Files String value to a PowerShell Object $TestsObj = Get-Content -Path $TestsFilePath | ConvertFrom-Json # Import the Tester Function . ./lib/New-HttpTestResult.ps1 # Loop through Test Objects and get the results as a collection $TestResults = foreach ($Test in $TestsObj) { New-HttpTestResult -TestArgs $Test } $TestResults | Format-Table -AutoSize
Образец прогон
Заключение
В сценариях автоматизации вы захотите реализовать защитные сценарии, которые не являются ряд инструкций на один выстрел, но у него есть несколько колоколов и свистков, чтобы сделать его более склонным к изменениям окружающей среды в вашей инфраструктуре. Наличие механизма повторной попытки дождаться состояния системы для достижения желаемого состояния, является очень распространенной необходимостью в задачах автоматизации EVOPS.
Я надеюсь, что в этой части я смог помочь вам узнать что-то новое. Если вы даете попытку проблем, хорошо на вас. Если вы просто читаете свои решения, не чувствуете себя виноватым. У меня есть и все еще читаем много других инженерных кодов на Github и их блоги. Если вы в настоящее время не на уровне, чтобы придать вызов, попробуйте сами, загрузите мой образец, запустите его и попытайтесь понять, как это работает. Тогда, если вы можете попытаться что-то изменить в нем и посмотреть, сможете ли вы изменить поведение сценария.
В настоящее время я не знаю, о чем будет следующая часть, я думаю о запуске наших тестов в CI/CD-трубопроводе или написание другого скрипта для создания файла JSON с нашими конечными точками, перечисленными автоматически через сканирование подписки Azure. Оба они могут прийти в любом порядке, поскольку они не зависят друг от друга. Увидимся на следующем.
Практические сценарии для DevOps с PowerShell (4 частью серии)
Оригинал: «https://dev.to/mertsenel/practical-powershell-scripting-for-devops-part-2-4cn5»