Мій набір інструментів для DevOps. Що варто мати у своєму CLI-арсеналі

💡 Усі статті, обговорення, новини про DevOps — в одному місці. Приєднуйтесь до DevOps спільноти!

Я старший інженер 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 для написання коду, але це питання смаку. До речі, багато інших CLI-інструментів використовують vi як текстовий редактор за замовчуванням. Вам не обов’язково бути експертом у 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 — це універсальний сканер вразливостей. Він сканує ваші образи контейнерів, Infra as a Code файли, kubernetes маніфести і таке інше на наявність вразливостей і надає звіт з результатами. Використання 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

Підсумок

У цій статті я поділився деякими з CLI-інструментів, які використовую щодня. Вони допомагають мені автоматизувати завдання, тестувати API та моніторити мою інфраструктуру. Сподіваюся, ця стаття була корисною і ви дізналися щось нове. Закликаю вас зробити свій внесок у цю тему, поділившись улюбленими інструментами та випадками їхнього використання в коментарях.

Bonus

Я настійно рекомендую відвідати Cloud Native Computing Foundation (CNCF) landscape, щоб ознайомитися із більшим списком інструментів, доступних для інженерів DevOps. Це чудовий ресурс для відкриття нових технологій.

👍ПодобаєтьсяСподобалось34
До обраногоВ обраному29
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Цікаво, дякую за підбірку

За k9s окреме дякую!
Підкажіть, а шо за такий красивий htop-like монітор процесів на скріні? Де Terminator вказаний

Не встиг сам відповісти, побачив пізніше на самому скріншоті
Але відповідати в 5 ранку це таки рівень :)

Щира дяка за вартісну статтю.

Поки ми вчимося і вчимо одне одного тому чому навчилися — ми не переможні.

Як постійне джерело нових знань, наприклад, по С++ я використовую прослуховування через bluetooth-навушники виступів на провідних конференція по C++ (CppCon, ACCU, CppNow, etc).

По базам даних — це вебінари від Percona.

Для загального розвитку — це діалоги від Lex Fridman.

Дуже корисна альтернатива прослуховуванню FM радіо під час хатніх справ, механічної роботи, переміщення у просторі або вимушеного очікування.

Думаю, що для DevOps-ів повинні бути аналогічні цікаві щорічні галузеві конференції.

Дякую за цікаву підбірку. Від себе хочу порадити warp — емулятор терміналу. Він є для Linux та MacOS, має інтегровані в рядок AI-агенти (ChatGPT, Claude), автодоповнення, різні теми, вкладки, розділені вікна, можливість працювати в команді, ділитися робочим простором із командою. Як на мене, дуже класна заміна zsh. З мінусів — пропрієтарний. Все ж раджу спробувати. Користуюсь ним відколи з’явився на Linux, дуже зручний, економить час.

vim??? він має бути першим в списку!)

Все так, очевидного забув вписати. Я таки користуюсь ним частенько. Додам

Для тих, хто хоче опанувати vi/vim можно додати два посилання з інтерактивними завданнями
для подчатківців: openvim.com
для тих хто хоче продвинутий рівень: www.vimninja.com

Мені свого часу vimtutor вистачило. Зазвичай він вже встановлений з повною версією vim.

Із VIM (чи із vi) кажуть що неможливо вийти...xD

Додав, і навіть написав як вийти все-ж таки

fact. Я раз зайшов і до цих пір...

Перегрузись, так всі роблять коли треба вийти з vi

якщо удальонно, то можна просто путтю закрити.

Добавлю несколько своих:
Если нужна расширенная информация о IP
curl 2ip.ua
ip :
hostname:
provider :
location :

Если надо быстро проверить, работает ли интернет (короче команды не нашёл)
ping 1.1

Если нет telnet, nc и нельзя установить, а доступность хоста:порта надо проверить
(echo > /dev/tcp/google.com/80) >/dev/null 2>&1 && echo «it’s up» || echo «it’s down»

Оця остання тєма дуже крута, дякую що поділилися!
Та в цьому випадку інструмент це сам bash/sh, а його можливості виходять за рамки цієї статті.
За 1.1 окреме спасибі 😉

Без проблем, друже.

Що до curl та wget, як раз саме curl є майже в кожному дистрибутиві із-коробки, а wget треба додатково встановлювати, тому в install скриптах краще користуватись curl, а wget вже в підконтрольному оточенні.

Цікаво, у мене інший досвід. А можна приклад такого дистрибутиву де є curl але нема wget?
Мені воно частіше зустрічається в контейнеризованих середовищах з базовим шаром типу Apline або схожих мінімізованих систем.

RHEL7-RHEL8 вроде як сходу нема wget, нема zip/unzip, треба ставити

А й справді, Red Hat надали перевагу curl, а от wget таки нема, згідно доки: docs.redhat.com/...​ository#BaseOS-repository
Але воно й не погано що так.

Зважаючи на різницю в кількості завантажень з docker hub RHEL8 і Alpine або, прости господи, BusyBox (мільйони проти мільярдів) воно й не дивно що у мене склалося таке враження.
Якщо чесно, я часто спочатку шукаю curl: а може цього разу додали ;) або по звичці.

Дякую що поділилися досвідом, буду мати на увазі!

Тут треба не забувати, що RHEL це корпоративне рішення, і зачасту компанії яки на ній сидять мають внутрішній nexus/artefactory з корпоративно перевіреними докер образами.
З інету нічого напряму не грузять.
(Зараз працюю в компаніі де було б тисячі завантажень в годину, якщо б з інету).

Підписатись на коментарі