Vim з підтримкою YAML для Kubernetes

Прим. перев.: оригінальну статтю написав Josh Rosso - архітектор з VMware, який раніше працював у таких компаніях, як CoreOS і Heptio, а також є співавтором Kubernetes alb-ingress-controller. Автор ділиться невеликим рецептом, який може виявитися дуже корисним для інженерів з експлуатації «старої школи», які віддають перевагу vim навіть в епоху cloud native, що переміг.

Vim з підтримкою YAML для Kubernetes

Пишете YAML-маніфести для Kubernetes у vim? Провели незліченний годинник у спробах зрозуміти, де в цій специфікації має бути чергове поле? А можливо, будете раді швидкому нагадування про різницю args и command? Є добрі новини! Vim легко прив'язати до yaml-language-server, щоб отримати автоматичне доповнення, валідацію та інші зручності. У статті поговоримо про те, як налаштувати для цього клієнта мовного сервера.

(У оригінальної статті також є відео, де автор розповідає та демонструє вміст матеріалу.)

Мовний сервер

Мовні сервери (language servers) розповідають про можливості мов програмування редакторам та IDE, для чого вони взаємодіють між собою за спеціальним протоколом. Протокол сервера мови (LSP). Це чудовий підхід: адже він дозволяє одній реалізації забезпечувати даними відразу безліч редакторів/IDE. Я вже писав про gopls - мовний сервер для Golang - і як його можна використовувати в натиск. Дії отримання автодоповнення в YAML для Kubernetes аналогічні.

Vim з підтримкою YAML для Kubernetes

Щоб vim запрацював описаним способом, потрібно встановити клієнта мовного сервера. Два відомі мені способи — це LanguageClient-neovim и coc.vim. У статті розглядатиму coc.vim - це найпопулярніший плагін на даний момент. Встановити його можна через vim-вилка:

" Use release branch (Recommend)
Plug 'neoclide/coc.nvim', {'branch': 'release'}

" Or build from source code by use yarn: https://yarnpkg.com
Plug 'neoclide/coc.nvim', {'do': 'yarn install --frozen-lockfile'}

Для запуску coc (і, таким чином, сервера yaml-language-server) знадобиться наявність встановленого node.js:

curl -sL install-node.now.sh/lts | bash

Коли coc.vim настроєно, встановіть серверне розширення coc-yaml з vim'а:

:CocInstall coc-yaml

Vim з підтримкою YAML для Kubernetes

Нарешті, ви, швидше за все, захочете почати з конфігурації coc-vim, представленої як приклад. Зокрема, вона активує комбінацію +пробіл для виклику автодоповнення.

Налаштування виявлення yaml-language-server

Щоб coc міг скористатися yaml-language-server, його потрібно попросити завантажувати схему від Kubernetes під час редагування YAML-файлів. Це робиться редагуванням coc-config:

:CocConfig

У конфігурації потрібно додати kubernetes для всіх файлів yaml. Я додатково використовую мовний сервер для golangтому мій загальний конфіг виглядає так:

{
  "languageserver": {
      "golang": {
        "command": "gopls",
        "rootPatterns": ["go.mod"],
        "filetypes": ["go"]
      }
  },

  "yaml.schemas": {
      "kubernetes": "/*.yaml"
  }
}

kubernetes — зарезервоване поле, що повідомляє мовному серверу про необхідність завантажити Kubernetes-схему URL, визначеному в цій константі. yaml.schemas можна розширити підтримкою додаткових схем - докладніше див. відповідної документації.

Тепер можна створити YAML-файл і почати користуватися автодоповненням. Натискання +пробіл (або інший комбінації, налаштованої в vim) має показати доступні поля та документацію відповідно до поточного контексту:

Vim з підтримкою YAML для Kubernetes
Тут працює +пробіл, тому що я налаштував inoremap <silent><expr> <c-space> coc#refresh(). Якщо ви цього не зробили, див. coc.nvim README для прикладу конфігурації.

Вибір версії Kubernetes API

На момент написання цієї статті yaml-language-server постачається зі схемами Kubernetes 1.14.0. Я не знайшов способу динамічно вибирати схему, тому відкрив відповідний GitHub issue. На щастя, оскільки мовний сервер написаний на typescript, легко вручну змінити версію. Для цього достатньо знайти файл server.ts.

Щоб виявити його на своїй машині, просто відкрийте YAML-файл за допомогою vim і знайдіть процес з yaml-language-server.

ps aux | grep -i yaml-language-server

joshrosso         2380  45.9  0.2  5586084  69324   ??  S     9:32PM   0:00.43 /usr/local/Cellar/node/13.5.0/bin/node /Users/joshrosso/.config/coc/extensions/node_modules/coc-yaml/node_modules/yaml-language-server/out/server/src/server.js --node-ipc --node-ipc --clientProcessId=2379
joshrosso         2382   0.0  0.0  4399352    788 s001  S+    9:32PM   0:00.00 grep -i yaml-language-server

Для нас актуальним є процес 2380: саме його використовує vim під час редагування YAML-файлу.

Як легко побачити, файл розташований у /Users/joshrosso/.config/coc/extensions/node_modules/coc-yaml/node_modules/yaml-language-server/out/server/src/server.js. Достатньо відредагувати його, змінивши значення KUBERNETES_SCHEMA_URL, наприклад, на версію 1.17.0:

// old 1.14.0 schema
//exports.KUBERNETES_SCHEMA_URL = "https://raw.githubusercontent.com/garethr/kubernetes-json-schema/master/v1.14.0-standalone-strict/all.json";
// new 1.17.0 schema in instrumenta repo
exports.KUBERNETES_SCHEMA_URL = "https://raw.githubusercontent.com/instrumenta/kubernetes-json-schema/master/v1.17.0-standalone-strict/all.json";

Залежно від версії використовуваного coc-yaml розташування змінної коді може бути різним. Зверніть також увагу, що я змінив репозиторій з garethr на instrumenta. Схоже що garethr перейшов на підтримку схем саме там.

Щоб перевірити, що зміна набула чинності, перегляньте, чи з'являється поле, якого раніше [у минулих версіях Kubernetes] не було. Наприклад, у схемі для K8s 1.14 не було startupProbe:

Vim з підтримкою YAML для Kubernetes

Резюме

Сподіваюся, така нагода порадувала вас не менше, ніж мене. Щасливого YAML'інгу! Не забудьте ознайомитися з цими репозиторіями, щоб краще розібратися з утилітами, згаданими у статті:

PS від перекладача

А ще є vikube, vim-kubernetes и vimkubectl.

Читайте також у нашому блозі:

Джерело: habr.com

Додати коментар або відгук