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, для чаго яны ўзаемадзейнічаюць паміж сабой па спецыяльным пратаколе. Пратакол Language Server (LSP). Гэта выдатны падыход: бо ён дазваляе адной рэалізацыі забяспечваць дадзенымі адразу мноства рэдактараў/IDE. Я ўжо пісаў пра gopls - моўны сервер для Golang - і як яго можна выкарыстоўваць у напор. Дзеянні для атрымання аўтадапаўнення ў YAML для Kubernetes аналагічныя.

Vim з падтрымкай YAML для Kubernetes

Каб vim зарабіў апісаным спосабам, спатрэбіцца ўсталяваць кліента моўнага сервера. Два вядомыя мне спосабы — гэта LanguageClient-neovim и coc.vim. У артыкуле буду разглядаць coc.vim — гэта самая папулярная ўбудова на сапраўдны момант. Усталяваць яго можна праз vim-plug:

" 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

Дадаць каментар