Congratulations on passing your Exam…
Штош, теперь я могу быть не только помощником по администрированию Cisco и архитектора решений AWS, но еще и помогу с Azure чуток 😉
Записки о виртуализации и о жизни
Congratulations on passing your Exam…
Штош, теперь я могу быть не только помощником по администрированию Cisco и архитектора решений AWS, но еще и помогу с Azure чуток 😉
Возникла задача найти все живые устройства в сети. Эта задача легко решается с помощью пинга по всем адресам локальной сети и последующей печатью Arp-таблицы хоста. Проблема была лишь в том, что на Bash я ее еще не решал (в отличие от Python/Powershell)…
Чатжпт, по коням, у нас скрипт, возможно, на баше.
Ответ от нейросети я буду приводить в сокращенном виде.
Решил я заняться развертыванием AWS Lambda Function и API Gateway через Terraform.
Вводные были следующие:
Сначала я создавал lambda function с помощью штатных ресурсов AWS-provider: aws_lambda_function, aws_lambda_permission и archive_file. Проблем с закольцовкой не было: Terraform умело разруливал порядок создания ресурсов.
Но потом лямбда функций стало больше, и я решил использовать принцип DRY (don’t repeat yourself). В Terraform эту роль играют модули.
Я начал использовать публичный модуль для создания лямбд отсюда – и меня догнали Terraform Cycle Error на этапе terraform validate.
Отрицание
Не может такого быть, повторял я и варьировал различные варианты кода.
Неужели придется отказаться от модуля в случае создания таких функций???
Гнев
Пока я изучал модуль, обнаружил в нем входную переменную putin_khuylo, содержащую по умолчанию значение true.
Торг
Внимательное изучение выходных значений модуля подсказало наличие выходного значения function_arn_static, которые должны помочь избежать зацикливания.
НО НЕТ!
Депрессия
Был еще один вариант:
Увы, установить утилиту я не мог, а онлайн-утилита вылетала по памяти.
В теории этот путь поможет в разрезании цикла, показав ресурсы, участвующие в цикле.
Принятие
С горя я решил задать вопрос ChatGPT: как избежать зацикливания в данном случае.
Внезапно, мэтр программирования IaC Terraform посоветовал ресурс aws_lambda_function создавать в модуле, а aws_lambda_permission оставить в корневом файле.
Да-да, это то самое чувство, когда соседский мальчик умнее тебя 🙁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
provider "aws" { region = "us-east-1" } locals { list1 = { lambda1 = { name = "lambda1" path = "../lambda1" } lambda2 = { name = "lambda1" path = "../lambda1" } } list2 = { lambda1 = aws_apigatewayv2_api.example_api.execution_arn lambda2 = aws_apigatewayv2_api.example_api.execution_arn } } module "lambda" { source = "../lambda" for_each = local.list1 name = each.value.name ... } data "template_file" "example_api" { template = "${file("example_api.tpl")}" vars = { lambda_invocation_url = module.lambda.lambda_function_invoke_url } } resource "aws_apigatewayv2_api" "example_api" { name = "example_api" protocol_type = "HTTP" body = data.template_file.example_api.rendered } resource "aws_lambda_permission" "example_permission" { for_each = local.list2 statement_id = "AllowAPIGatewayInvoke" action = "lambda:InvokeFunction" function_name = module.lambda.lambda_function_arn principal = "apigateway.amazonaws.com" source_arn = each.value } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
provider "aws" { region = "us-east-1" } resource "aws_lambda_function" "example_lambda" { filename = "lambda_function.zip" function_name = "example_lambda" role = aws_iam_role.lambda_exec.arn handler = "lambda_function.handler" runtime = "nodejs14.x" source_code_hash = filebase64sha256("lambda_function.zip") environment { variables = { EXAMPLE_VAR = "example_value" } } } resource "aws_iam_role" "lambda_exec" { name = "lambda_exec_role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "lambda.amazonaws.com" } } ] }) } resource "aws_iam_role_policy_attachment" "lambda_exec_policy" { policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" role = aws_iam_role.lambda_exec.name } output "lambda_function_arn" { value = aws_lambda_function.example_lambda.invoke_arn } |
Так как функций было несколько, то их входные значения для модуля (имя, путь и т.д.) генерировались в разделе locals. Для использования цикла for_each в ресурсе aws_lambda_permissions потребовалось хранить source_arn в отдельной локальной переменной. УРА, terraform validate пройден.
Правда, на этапе terraform plan выяснилось, что модуль требует для своей работы Python и иногда падает, если в runtime вашей функции указана странная версия Python’а, и в Runner для CI/CD что-то пошло не так 🙂
На этом я решил психануть закопать стюардессу написать свой модуль создания лямбда функции без Питона и Путина.
Мой сын учится в шестом классе. Попалась тут ему задача по математике, которую он не смог решить. Мы решили спросить глубокоуважаемый ИИ – как же решить эту задачу. Continue reading “Как ChatGPT решает математические задачи”
«Обычно люди обращаются за советом, — говорил Атос, – только для того, чтобы не следовать ему, а если кто-нибудь и следует совету, то только для того, чтобы было кого упрекнуть впоследствии.»
Пришло мне в голову дать вам бесплатный совет: соглашайтесь на практически любую движуху. Приведу пару примеров из своего опыта:
Результатом первой возможности стало более глубокое понимание работы сети и сертификат CCNA (хотя, поработав в интернет-провайдере, я осознал – насколько же это были базовые знания). Пару раз помогало тыкать носом сетевиков в их косяки.
Результатом второй и третьей – приличные знания по обеим системам в качестве T-shape специалиста. В результате, в 2020м меня брали на центрального администратора Commvault с хорошим окладом без практического опыта по нему 😉
Я не могу рассказать о текущем стеке, но он не имеет ничего общего с привычным мне VMware/Microsoft. Когда-нибудь я расскажу и эту историю…
Наверное, многие из вас видели этот мем про девопс и зарплату в 300кк. Зарплаты девопс-инженеров с hh.ru пробивали мой воображаемый потолок по зарплате в несколько раз, поэтому: настала пора перемен. Пора закопать VMware и изучить кубернетис.
Возникло давеча у меня желание запустить контейнер SonarQube.
В гугле меня не забанили, поэтому быстренько была найдена ссылка по запуску контейнера за пару минут.
Я взял оттуда команду для запуска контейнера:
1 |
docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest |
Запустил контейнер, сменил пароль пользователя admin, зарегистрировал Gitlab и добавил репозиторий с кодом в качестве проекта.
Затем я остановил контейнер:
1 |
docker stop sonarqube |
Когда мне снова потребовался контейнер SonarQube, я запустил его командой
1 |
docker start sonarqube |
Каково же было мое удивление, когда контейнер запустился со всеми изменениями (пароль администратора и прочее).
Хочу воспользоваться подсказкой “Помощь зала”: как вы считаете, уважаемые читатели – почему контейнер после перезапуска сохранил свое состояние?
Однажды у вас может возникнуть желание составить таблицу портов коммутаторов, к которым подключены ваши хосты.
Если у вас “гомогенное” окружение, состоящее из коммутаторов Cisco, то заморачиваться не нужно совсем (CDP настроен в Virtual Switch Standard/Distributed Virtual Switch по умолчанию).
Но если в окружении не только Cisco, то вам необходимо немного сильнее напрячься:
Continue reading “Опрос CDP/LLDP с ESXi через PowerShell/Python”
Потребовалось проставить Custom Attribute для виртуальных машин.
На помощь, как обычно, пришел Google и подсказал следующее решение:
1 2 3 |
$ca=Get-CustomAttribute -Name 'custom_attribute_name' get-vm -Location vm_folder_name | Get-Annotation -CustomAttribute $ca | %{Set-Annotation -entity $_.AnnotatedEntity -CustomAttribute $ca -Value 'new_value'} |
Обратился ко мне за советом постоянный читатель: помоги, говорит, с моим iSCSI-массивом NetApp. Пытаюсь вывести Get-SCSILunPath, так там ни имени датастора, ни IP-адреса “таргета” в SanId нет 🙁
Посмотрел – и действительно так: в отличие, например, от Huawei, NetApp не выводит IP-адрес IQN-Target в выводе атрибутов Get-SCSILunPath. Да и привязать CanonicalName вида naa.thebeststoragearray к датастору с первого взгляда не удается…