Мій набір інструментів для DevOps. Що варто мати у своєму CLI-арсеналі
Я старший інженер DevOps у компанії Valtech. Працюю в IT-індустрії вже понад 10 років на різних позиціях: від інженера технічної підтримки до власника невеликої IT-компанії. Зараз моїм основним фокусом є DevOps-практики, автоматизація, SRE та хмарні технології. Специфіка моєї роботи полягає в участі в декількох проєктах водночас, співпраці з різними командами і технологіями.
Як DevOps-інженер я прагну до збільшення швидкості доставки результатів розробки з дотриманням стандартів безпеки і якості. Одним із основних принципів роботи в команді, на мою думку, є обмін знанннями. Це підвищує ефективність та допомагає вирішувати проблеми швидше.
Чому я вирішив написати цю статтю
Не думаю, що здивую когось, сказавши, що CLI (інтерфейс командного рядка) — це найбільш корисний інтерфейс в арсеналі DevOps. Він швидкий, гнучкий і легко автоматизується. Часто CLI — це єдиний доступний інтерфейс, коли ви працюєте з віддаленими серверами чи контейнерами. Тому важливо знати, як ефективно ним користуватися, і мати набір інструментів, які допоможуть у повсякденних завданнях.
Ця стаття — це колекція інструментів, якими я користуюся щодня. Це не вичерпний список, але він охоплює найпоширеніші випадки, з якими я стикаюся. Ідея полягає в тому, щоб надати вам відправну точку та надихнути досліджувати нові інструменти і технології. Більшість інструментів, перелічених у цій статті, активно використовуються у скриптах автоматизації, CI/CD конвеєрах або під час ручної взаємодії.
Моя основна операційна система — це один із варіантів Ubuntu, але більшість інструментів, якими я користуюсь, доступні на інших дистрибутивах Linux та MacOS. Я також використовую Windows Subsystem for Linux (WSL) для запуску Linux-команд на Windows.
Я закликаю вас зробити внесок у цю статтю, додавши свої улюблені інструменти та сценарії їх використання. Як я вже казав, вважаю, що обмін знаннями — одна з найважливіших речей у DevOps-спільноті.
Загальні CLI інструменти
vi
vi — це текстовий редактор, вбудований у більшість дистрибутивів Linux. Вам неминуче доведеться використовувати vi або vim на якомусь етапі вашої кар’єри, якщо ви цього ще не робили. Він потужний, швидкий і може використовуватись для редагування файлів, написання скриптів і коду у вашому CLI. Один з моїх колег використовує IDE на основі vi для написання коду, але це питання смаку. До речі, багато інших
Мінімум, який потрібно знати для роботи з vi:
# Відкрити файл за допомогою vi vi file.txt # Режим введення (можна починати друкувати) i # Вийти з режиму введення Esc # Зберегти та вийти з файлу :wq # Вийти без збереження :q!
wget і curl
І wget, і curl — чудові інструменти для передачі даних через URL. Вони можуть бути використані для завантаження файлів, виконання HTTP-запитів і навіть для тестування API. Хоча wget є більш універсальним і входить до складу більшості дистрибутивів Linux, curl є потужнішим і може використовуватися для складніших запитів. Наприклад, коли ви використовуєте wget для завантаження бінарного файлу curl у контейнер, а потім використовуєте curl для роботи з API.
Ось приклад запиту, виконаного за допомогою wget і curl:
# Дізнатись публічну IP-адресу ## Використання wget і ipinfo.io. Де -q для тихого режиму, а -O - для виводу в stdout wget -q -O - https://ipinfo.io/ip ## Використання curl і api.ipify.org. Де -s для тихого режиму curl -s https://api.ipify.org
Власне, це хороший приклад того, як можна використовувати wget та curl для отримання публічної IP-адреси машини, на якій ви працюєте. Це корисний трюк, коли, скажімо, потрібно дізнатися IP-адресу віддаленого сервера або віртуальної машини GitHub Actions, щоб автоматично додати її в білий список SQL фаерволу, та виконати подальші кроки.
curl також чудовий інструмент для тестування API та автоматизації завдань. Я використовував curl і bash для міграції сотень доменів з одного CDN на інший. Це зручно, оскільки curl підтримує всі HTTP-методи, заголовки та навіть cookies. Ви можете використовувати його для тестування API, виконання запитів з користувацькими заголовками та навіть для завантаження файлів.
Нижче наведено приклад того, як можна використовувати curl для створення POST-запиту з JSON вмістом:
# Виклик Adobe API RESPONSE=$(curl -X POST \ -H "Content-Type: application/json" \ -H"x-api-key: ${API_KEY}"\ -H "x-gw-ims-org-id: ${IMS_ORG_ID}" \ -H"Authorization: Bearer ${ACCESS_TOKEN}"\ -d "${JSON_BODY}" \ "${REQUEST_URL}")
nc
Netcat, або nc, — це простий інструмент, який можна використовувати для створення TCP або UDP-з’єднань. Він чудово підходить для перевірки, чи працює сервіс на певному порту і чи відкритий сам порт.
# Перевірити, чи сервіс працює на порту 80 # -z для режиму сканування, -v для режиму виведення, -w для таймауту nc -zvw 3 google.com 80
Найпоширеніший випадок використання для мене — це запуск nc у контейнері всередині Kubernetes pod, щоб перевірити, чи може цей сервіс досягти іншого сервісу в тому ж кластері або в обмеженій зоні.
Приклад запуску nc в Kubernetes pod:
# Виконати вхід в pod kubectl exec -it my-pod -- /bin/sh # Перевірити, чи сервіс працює на порту 80 # -z для режиму сканування, -v для режиму виведення, -w для таймауту nc -zvw 3 my-service 80
jq та yq
jq і yq — інструменти для парсингу та обробки даних у форматах JSON і YAML. Велика частина файлів, з якими працюють DevOps-інженери, представлена у форматах JSON або YAML: Kubernetes-маніфести, GitHub-пайплайни, Terraform state файли, Helm-чарти тощо. За допомогою jq і yq можна витягувати дані, фільтрувати їх і навіть оновлювати.
Приклад використання yq для вставки значень у YAML-файл визначення Azure Container App через GitHub Action:
- name: Update FE manifest file shell: bash run: | # Update Secret Reference in the manifest file yq e '.properties.configuration.secrets += [ {"identity": env(AZURE_IDENTITY_ID), "keyVaultUrl": env(BASIC_AUTH_PASSWORD_AKV_URL), "name": "basic-auth-password"}]' \ $MANIFEST_FILE > $UPDATED_MANIFEST_FILE # Update env variables in the manifest file yq -i '.properties.template.containers[0].env += [ {"name": "BFF_HOST", "value": env(BFF_HOST)}, {"name": "BASIC_AUTH_USERNAME", "value": env(BASIC_AUTH_USERNAME)}, {"name": "BASIC_AUTH_PASSWORD", "secretRef": "basic-auth-password"}]' \ $UPDATED_MANIFEST_FILE # Update managed environment path yq -i '.properties.managedEnvironmentId = env(AZURE_CONTAINER_APP_ENVIRONMENT_ID)' $UPDATED_MANIFEST_FILE # Update image url yq -i '.properties.template.containers[0].image = env(DOCKER_IMAGE)' $UPDATED_MANIFEST_FILE echo "Updated manifest file:" echo "---------------------------------" cat $UPDATED_MANIFEST_FILE echo "---------------------------------" env: DOCKER_IMAGE: ${{ vars.AZURE_CONTAINER_REGISTRY_LOGIN_SERVER }}/${{ env.FE_APP_NAME }}:${{ env.IMAGE_TAG }}.${{ github.run_number }} AZURE_CONTAINER_APP_ENVIRONMENT_ID: ${{ vars.AZURE_CONTAINER_APP_ENVIRONMENT_ID }} AZURE_IDENTITY_ID: ${{ vars.USER_ASSIGNED_IDENTITY_ID }} BASIC_AUTH_USERNAME: didpihto BASIC_AUTH_PASSWORD_AKV_URL: https://${{ vars.AZURE_KEY_VAULT_NAME }}.vault.azure.net/secrets/basic-auth-password MANIFEST_FILE: ./apps/web/container-app.yaml UPDATED_MANIFEST_FILE: ./apps/fe_manifest.yaml BFF_HOST: http://${{ env.BFF_APP_NAME }}
Ось вхідний файл і результат:
# Source file properties: managedEnvironmentId: /subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/Microsoft.App/managedEnvironments/CONTAINER_APP_ENVIRONMENT configuration: ingress: external: true allowInsecure: false targetPort: 3000 template: scale: minReplicas: 1 maxReplicas: 2 containers: - image: mcr.microsoft.com/azuredocs/containerapps-helloworld:latest name: app ## CUT ## env: - name: PORT value: "3000"
# Result file properties: managedEnvironmentId: /subscriptions/123-456-189-0123-456789/resourceGroups/my-resource-group/providers/Microsoft.App/managedEnvironments/my-container-app-environment configuration: ingress: external: true allowInsecure: false targetPort: 3000 secrets: - identity: /subscriptions/123-456-189-0123-456789/resourceGroups/my-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-user-assigned-identity keyVaultUrl: https://my-azure-key-vault-name.vault.azure.net/secrets/basic-auth-password name: basic-auth-password template: scale: minReplicas: 1 maxReplicas: 2 containers: - image: myacr.azurecr.io/web:1.0.91 name: app ## CUT ## env: - name: PORT value: "3000" - name: BFF_HOST value: http://web-bff - name: BASIC_AUTH_USERNAME value: didpihto - name: BASIC_AUTH_PASSWORD secretRef: basic-auth-password
sed
sed — це потоковий редактор, який використовується для виконання базових текстових трансформацій у потоці даних. Він чудово підходить для заміни тексту, видалення рядків та інших текстових маніпуляцій. Я використовую sed, коли формат файлу не JSON чи YAML, тому застосувати jq або yq недоцільно.
Приклад використання sed для заміни рядка у файлі:
# Замінити всі "foo" на "bar" у файлі file.txt sed -i 's/foo/bar/g' file.txt
zsh і oh-my-zsh
zsh — це оболонка, побудована на основі bash, але більш потужна і з додатковими функціями. oh-my-zsh — це фреймворк для керування конфігурацією zsh. Він містить багато плагінів та тем, які роблять ваш термінал зручнішим і функціональнішим. Я використовую його разом із плагінами для git, kubectl, terraform та docker.
Автодоповнення, підсвічування синтаксису та пошук по історії — це лише деякі з функцій, які роблять zsh чудовою оболонкою. Для мене вона набагато зручніша, наприклад, можна використовувати tff замість terraform fmt або k замість kubectl. Крім того, oh-my-zsh постачається з багатьма темами, які роблять ваш термінал більш привабливим. Дехто каже, що завжди краще працювати в гарному середовищі і тут я повністю згоден.
Відвідайте oh-my-zsh, щоб переглянути доступні плагіни та теми.
less
less — це командний інструмент для перегляду вмісту файлу. Він дозволяє прокручувати текст вгору і вниз, шукати за ключовими словами та виконувати інші дії. Це корисно, коли потрібно переглянути вміст лог-файлу або файлу конфігурацій.
Приклад використання:
less filename.log
Емулятори терміналу
Я використовую Konsole та Terminator як основні емулятори терміналу. Обидва підтримують вкладки, розділені панелі та користувацькі теми.
Основна функція, яка мені важлива, — це можливість розділити термінал на кілька панелей і вкладок. Це доцільно, коли потрібно запускати кілька команд одночасно або моніторити декілька логів, порівнюючи два файли або Kubernetes кластери поруч за допомогою K9S.
Konsole:
Terminator:
Інфраструктура як код
tflint
Окрім terraform format і terraform validate, я використовую tflint для перевірки мого Terraform-коду. Він перевіряє наявність помилок, попереджень та дотримання найкращих практик. Це зручний інструмент для виявлення помилок і застарілого коду до застосування змін.
Приклад використання tflint:
tflint 5 issue(s) found: Warning: terraform "required_version" attribute is required (terraform_required_version) on line 0: (source code not available) Reference: https://github.com/terraform-linters/tflint-ruleset-terraform/blob/v0.4.0/docs/rules/terraform_required_version.md Warning: [Fixable] List items should be accessed using square brackets (terraform_deprecated_index) on main.tf line 16: 16: client_certificate = base64decode(module.kubernetes_cluster.kube_config.0.client_certificate) Reference: https://github.com/terraform-linters/tflint-ruleset-terraform/blob/v0.4.0/docs/rules/terraform_deprecated_index.md Warning: [Fixable] local.resource_group_id is declared but not used (terraform_unused_declarations) on main.tf line 53: 53: resource_group_id = data.terraform_remote_state.base.outputs.resource_group_id Reference: https://github.com/terraform-linters/tflint-ruleset-terraform/blob/v0.4.0/docs/rules/terraform_unused_declarations.md
Включення перевірки tflint у CI/CD конвеєр є надзвичайно корисним, щоб забезпечити завжди хорошу якість коду Terraform. Це дозволяє автоматично виявляти помилки та недоліки в конфігураціях перед їх застосуванням.
tfenv
tfenv — це менеджер версій Terraform. Він дозволяє перемикатися між різними версіями Terraform, що особливо зручно для роботи над кількома проєктами, які використовують різні версії Terraform.
Приклад використання tfenv:
# Встановити Terraform 1.0.0 tfenv install 1.0.0 # Використовувати Terraform 1.0.0 tfenv use 1.0.0
Kubernetes
pluto
pluto — це інструмент, який використовується для виявлення застарілих API у ваших Kubernetes-маніфестах. Використання pluto в CI/CD конвеєрі дозволяє виявляти застарілі API до розгортання маніфестів. Це також досить корисно під час планування оновлення кластера Kubernetes до нової версії.
Приклад застосування pluto:
# Сканування Kubernetes кластеру на застарілі API pluto detect-all-in-cluster --target-versions k8s=v1.32.0 -o wide 2>/dev/null
Приклад виводу:
DEPRECATION WARNINGS: - apiVersion: apps/v1beta1 kind: Deployment message: Deployment in apps/v1beta1 is deprecated, use apps/v1 instead name: my-deployment namespace: default - apiVersion: extensions/v1beta1 kind: Ingress message: Ingress in extensions/v1beta1 is deprecated, use networking.k8s.io/v1 instead name: my-ingress namespace: default
stern
stern — це інструмент, який використовується для одночасного перегляду логів з кількох подів у Kubernetes. Він підтримує фільтрацію логів за ім’ям пода, ім’ям контейнера, мітками, простором імен та іншими критеріями.
Приклад запуску stern:
# Вивести логи з подів з міткою `app=cd` у просторі імен "preproduction" k stern --selector app=cd --namespace preproduction
Example of the output:
cd-0 sitecore-cd 2024-09-13 06:36:54 10.1.30.237 GET /healthz/live - 80 default\Anonymous 10.1.30.212 kube-probe/1.27 - 200 0 0 3 cd-0 sitecore-cd 2024-09-13 06:36:54 10.1.30.237 GET /healthz/live - 80 default\Anonymous 10.1.2.7 - - 200 0 0 5 cd-1 sitecore-cd 2024-09-13 06:36:44 10.1.30.33 GET /healthz/live - 80 default\Anonymous 10.1.2.7 - - 200 0 0 5 cd-1 sitecore-cd 2024-09-13 06:36:49 10.1.30.33 GET /healthz/live - 80 default\Anonymous 10.1.2.5 - - 200 0 0 5
k9s
k9s — це термінальний інтерфейс користувача для Kubernetes. Він дає змогу переглядати та взаємодіяти зі своїм кластером Kubernetes. k9s підтримує перегляд подів, розгортань, сервісів та багатьох інших ресурсів Kubernetes. Надає зручний і потужний інтерфейс для управління кластером Kubernetes з терміналу, що робить його корисним для розробників та DevOps-інженерів.
Інтерфейс k9s:
Безпека та відповідність
trivy
Приклад застосування trivy:
# Сканування образу контейнера на вразливості trivy image my-container-image:latest
Приклад звіту:
2024-08-30T10:45:43+03:00 INFO [vuln] Vulnerability scanning is enabled 2024-08-30T10:45:43+03:00 INFO [secret] Secret scanning is enabled 2024-08-30T10:45:43+03:00 INFO [secret] If your scanning is slow, please try '--scanners vuln' to disable secret scanning 2024-08-30T10:45:43+03:00 INFO [secret] Please see also https://aquasecurity.github.io/trivy/v0.54/docs/scanner/secret#recommendation for faster secret detection 2024-08-30T10:45:43+03:00 INFO Detected OS family="alpine" version="3.18.4" 2024-08-30T10:45:43+03:00 INFO [alpine] Detecting vulnerabilities... os_version="3.18" repository="3.18" pkg_num=17 2024-08-30T10:45:43+03:00 INFO Number of language-specific files num=1 2024-08-30T10:45:43+03:00 INFO [node-pkg] Detecting vulnerabilities... 2024-08-30T10:45:43+03:00 WARN Using severities from other vendors for some vulnerabilities. Read https://aquasecurity.github.io/trivy/v0.54/docs/scanner/vulnerability#severity-selection for details. my-container-image:latest (alpine 3.18.4) Total: 30 (UNKNOWN: 0, LOW: 2, MEDIUM: 26, HIGH: 2, CRITICAL: 0) ┌───────────────┬────────────────┬──────────┬────────┬───────────────────┬───────────────┬─────────────────────────────────────────────────────────────┐ │ Library │ Vulnerability │ Severity │ Status │ Installed Version │ Fixed Version │ Title │ ├───────────────┼────────────────┼──────────┼────────┼───────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤ │ busybox │ CVE-2023-42363 │ MEDIUM │ fixed │ 1.36.1-r2 │ 1.36.1-r7 │ busybox: use-after-free in awk │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-42363 │ │ ├────────────────┤ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ CVE-2023-42364 │ │ │ │ │ busybox: use-after-free │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-42364 │ │ ├────────────────┤ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ CVE-2023-42365 │ │ │ │ │ busybox: use-after-free │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-42365 │ │ ├────────────────┤ │ │ ├───────────────┼─────────────────────────────────────────────────────────────┤ │ │ CVE-2023-42366 │ │ │ │ 1.36.1-r6 │ busybox: A heap-buffer-overflow │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-42366 │ ├───────────────┼────────────────┤ │ │ ├───────────────┼─────────────────────────────────────────────────────────────┤ │ busybox-binsh │ CVE-2023-42363 │ │ │ │ 1.36.1-r7 │ busybox: use-after-free in awk │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-42363 │ │ ├────────────────┤ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ CVE-2023-42364 │ │ │ │ │ busybox: use-after-free │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-42364 │ │ ├────────────────┤ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ CVE-2023-42365 │ │ │ │ │ busybox: use-after-free │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-42365 │ │ ├────────────────┤ │ │ ├───────────────┼─────────────────────────────────────────────────────────────┤ │ │ CVE-2023-42366 │ │ │ │ 1.36.1-r6 │ busybox: A heap-buffer-overflow │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-42366 ### CUT ### /root/.npm/_logs/2023-10-25T09_42_06_171Z-debug-0.log (secrets) Total: 3 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 3) CRITICAL: GitHub (github-pat) ════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ GitHub Personal Access Token ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── /root/.npm/_logs/2023-10-25T09_42_06_171Z-debug-0.log:22 (added by 'RUN |2 NODE_ENV=production SILLY_GITHUB_T') ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 20 19 timing npm:load:mkdirpcache Completed in 0ms 21 20 timing npm:load:mkdirplogs Completed in 0ms 22 [ pm.pkg.github.com/:_authToken **************************************** 22 verbose argv "co 23 22 verbose argv "config" "set" "//npm.pkg.github.com/:_authToken" "********************************* ...
OWASP ZAP
OWASP ZAP — це інструмент безпеки, який використовується для виявлення вразливостей у веб-застосунках. Він чудово підходить для виявлення проблем безпеки того, як їх можуть використати зловмисники, як-то XSS, SQL Injection, CSRF та інших.
Приклад запуску OWASP ZAP:
# Запуск базового сканування веб-додатку docker run -v $(pwd):/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py -t https://valtech.com -r baseline_valtech_com.html
k6
k6 — це інструмент, який використовується для навантажувального тестування ваших веб-додатків. Він може імітувати тисячі користувачів, вимірювати продуктивність ваших веб-додатків і тестувати автоматичне масштабування. Ми використовуємо його для виявлення проблем з продуктивністю до того, як їх відчують користувачі. Також можливе використання k6 у CI/CD конвеєрі для виявлення проблем з продуктивністю перед розгортанням ваших додатків.
Приклад запуску k6:
/\ Grafana /‾‾/ /\ / \ |\ __ / / / \/ \ | |/ / / ‾‾\ / \ | ( | (‾) | / __________ \ |_|\_\ \_____/ execution: local script: fe.js output: - scenarios: (100.00%) 1 scenario, 100 max VUs, 1m30s max duration (incl. graceful stop): * default: 100 looping VUs for 1m0s (gracefulStop: 30s) data_received..................: 56 MB 921 kB/s data_sent......................: 2.3 MB 38 kB/s http_req_blocked...............: avg=548.36µs min=89ns med=162ns max=633.52ms p(90)=510ns p(95)=697ns http_req_connecting............: avg=62.9µs min=0s med=0s max=44.08ms p(90)=0s p(95)=0s http_req_duration..............: avg=110.01ms min=36.45ms med=97.32ms max=3.47s p(90)=198.66ms p(95)=245.46ms { expected_response:true }...: avg=110.01ms min=36.45ms med=97.32ms max=3.47s p(90)=198.66ms p(95)=245.46ms http_req_failed................: 0.00% 0 out of 54274 http_req_receiving.............: avg=237.89µs min=5.94µs med=18.75µs max=315.39ms p(90)=383.64µs p(95)=1.73ms http_req_sending...............: avg=17.27µs min=4.53µs med=11.59µs max=381.12µs p(90)=37.81µs p(95)=52.07µs http_req_tls_handshaking.......: avg=185.45µs min=0s med=0s max=439.79ms p(90)=0s p(95)=0s http_req_waiting...............: avg=109.75ms min=36.34ms med=97.19ms max=3.47s p(90)=198.48ms p(95)=245.24ms http_reqs......................: 54274 895.895578/s iteration_duration.............: avg=110.62ms min=36.51ms med=97.46ms max=3.47s p(90)=199.28ms p(95)=250.63ms iterations.....................: 54274 895.895578/s vus............................: 100 min=100 max=100 vus_max........................: 100 min=100 max=100 running (1m00.6s), 000/100 VUs, 54274 complete and 0 interrupted iterations default ✓ [======================================] 100 VUs 1m0s
Документація та обмін знаннями
mkdocs
mkdocs — це генератор статичних сайтів, який використовується для створення вебсайтів документації. Насправді, в оригіналі ця стаття побудована з використанням mkdocs. У нашому випадку ми також використовуємо тему material, щоб покращити зовнішній вигляд. mkdocs підходить для створення документації для проєктів, API та інструментів. Він підтримує Markdown, що спрощує написання та підтримку документації.
Приклад запуску mkdocs в GitHub Actions для розгортання документації в GitHub Pages:
name: ci on: push: branches: - main permissions: contents: write jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Configure Git Credentials run: | git config user.name github-actions[bot] git config user.email pizza+github-actions[bot]@users.noreply.github.com - uses: actions/setup-python@v5 with: python-version: 3.x - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV - uses: actions/cache@v4 with: key: mkdocs-material-${{ env.cache_id }} path: .cache restore-keys: | mkdocs-material- - run: pip install mkdocs-material - run: mkdocs gh-deploy --force
Mermaid
Mermaid — це інструмент, який використовується для створення діаграм і блок-схем. Він підтримує різні типи діаграм, включно з блок-схемами, послідовними діаграмами та діаграмами Ганта. Mermaid призначений для візуалізації систем і процесів. Я використовую його для створення діаграм для своєї документації в Markdown.
Приклад застосування Mermaid для створення блок-схеми:
graph TD A[Старт] --> B{Сьогодні робочий день?} B -->|Так| C[Працюй] B -->|Ні| D[Гуляй]
terraform-docs
terraform-docs — це інструмент, який генерує документацію для вашого Terraform-коду. Він читає Terraform-файли та генерує документацію у форматах Markdown, JSON або YAML. Це допомагає підтримувати вашу кодову базу Terraform у добре задокументованому стані. Інструмент особливо корисний, коли у є багато модулів і ви хочете згенерувати документацію для всіх із них, як робимо ми.
Приклад використання terraform-docs:
# Згенерувати документацію та зберегти її в README.md terraform-docs markdown . > README.md
Підсумок
У цій статті я поділився деякими з
Bonus
Я настійно рекомендую відвідати Cloud Native Computing Foundation (CNCF) landscape, щоб ознайомитися із більшим списком інструментів, доступних для інженерів DevOps. Це чудовий ресурс для відкриття нових технологій.
25 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів