Vim с поддръжка на YAML за Kubernetes

Прим. прев.: оригиналната статия е написана от Josh Rosso — архитект от VMware, който преди е работил в компании като CoreOS и Heptio, и е съавтор на Kubernetes alb-ingress-controller. Авторът споделя малка рецепта, която може да бъде много полезна за инженери 'стара школа', които предпочитат vim дори в ерата на облачната многобройност.

Vim с поддръжка на YAML за Kubernetes

Пишете YAML манифести за Kubernetes в vim? Прекарали сте безброй часове, опитвайки се да разберете къде в тази спецификация трябва да бъде поредното поле? Или може би ще се радвате на бързо напомняне за разликата args и command? Есть хорошие новости! Vim легко привязать к yaml-language-server, за да получите автоматично допълнение, валидиране и други удобства. В статията ще говорим за това как да настроите клиента на езиковия сървър за тази цел.

(Оригиналната статия също има видео, в което авторът описва и демонстрира съдържанието на материала.)

Езиковият сървър

Езиковите сървъри (language servers) разказват на редакторите и IDE за възможностите на програмните езици, за което те взаимодейства с помощта на специален протокол — Language Server Protocol (LSP). Това е чудесен подход: тъй като позволява на една реализация да предоставя данни на множество редактори/IDE наведнъж. Аз вече в един момент по gopls — езиков сървър за Golang — и как може да се използва в vim. Действията за получаване на автодопълнение в YAML за Kubernetes са аналогични.

Vim с поддръжка на YAML за Kubernetes

За да заработи vim по описания начин, ще е необходимо да инсталирате клиента на езиковия сървър. Два известни метода, за които знам, са LanguageClient-neovim и coc.vim. В статията ще разглеждам coc.vim — това е най-популярният плъгин в момента. Можете да го инсталирате чрез vim-plug:

" Използвайте release клона (Препоръчително)
Plug 'neoclide/coc.nvim', {'branch': 'release'}

" Или изградете от изходния код с помощта на 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
Тук работи +space, защото съм настроил inoremap coc#refresh(). Ако не сте го направили — вижте coc.nvim README за примерна конфигурация.

Избор на версия на Kubernetes API

Към момента на написване на тази статия, yaml-language-server идва с Kubernetes схеми 1.14.0. Не намерих начин да избирам схема динамично, затова отворих съответния GitHub проблем. За щастие, тъй като езиковият сървър е написан на 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’ing! Не забравяйте да се запознаете с тези репозитории, за да получите по-добро разбиране на инструментите, споменати в статията:

P.S. от преводача

И има още vikube, vim-kubernetes и vimkubectl.

Прочетете също в нашия блог:

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster