Vim avec prise en charge YAML pour Kubernetes

Remarque perev. : L'article original a été écrit par Josh Rosso, un architecte de VMware qui a précédemment travaillé pour des sociétés telles que CoreOS et Heptio, ainsi que co-auteur de Kubernetes alb-ingress-controller. L'auteur partage une petite recette, qui peut être très utile pour les ingénieurs de maintenance «old school» qui préfèrent vim même à l'ère du cloud natif victorieux.



Vous écrivez des manifestes YAML pour Kubernetes dans vim? Avez-vous passé d'innombrables heures à essayer de déterminer où le champ suivant devrait se trouver dans cette spécification? Ou peut-être serez-vous satisfait d'un rappel rapide de la différenceargsetcommand? Il y a de bonnes nouvelles! Vim est facile à lier à yaml-language-serverpour obtenir l'achèvement automatique, la validation et d'autres commodités. Dans cet article, nous expliquerons comment configurer le client du serveur de langues pour cela.

(L'article original contient également une vidéo où l'auteur parle et démontre le contenu du matériel.)

Serveur de langue


Les serveurs de langues ( serveurs de langues) parlent des possibilités de langages de programmation pour les éditeurs et les IDE, pour lesquels ils interagissent les uns avec les autres à l'aide d'un protocole spécial - Language Server Protocol (LSP). C'est une excellente approche: elle permet à une seule implémentation de fournir à plusieurs éditeurs / IDE des données à la fois. J'ai déjà écrit sur gopls - le serveur de langue pour Golang - et comment il peut être utilisé dans vim . Les étapes pour obtenir l'auto-complétion dans YAML pour Kubernetes sont similaires.



Pour que vim fonctionne de la manière décrite, vous devez installer le client du serveur de langue. Je connais deux méthodes: LanguageClient-neovim et coc.vim. Dans l'article que je considérerai coc.vim- c'est le plugin le plus populaire en ce moment. Vous pouvez l'installer via 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'}

Pour démarrer coc(et donc le serveur yaml-language), vous devez avoir installé node.js:

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

Une fois coc.vimconfiguré, installez l'extension coc-yamldu serveur à partir de vim:

:CocInstall coc-yaml



Enfin, vous souhaiterez très probablement commencer par la configuration coc-vimprésentée à titre d'exemple . En particulier, il active la combinaison <Ctrl> + espace pour appeler l'auto-complétion.

Configuration de la découverte du serveur de langue yaml


Pour cocutiliser yaml-language-server, vous devez lui demander de télécharger le schéma depuis Kubernetes lors de l'édition de fichiers YAML. Cela se fait en modifiant coc-config:

:CocConfig

Dans la configuration, vous devez ajouter kubernetespour tous les fichiers yaml. J'utilise également le serveur de langue pour golang, donc ma configuration générale ressemble à ceci:

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

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

kubernetes- un champ réservé qui informe le serveur de langue sur la nécessité de télécharger le schéma Kubernetes en utilisant l'URL définie dans cette constante . yaml.schemaspeut être étendu en prenant en charge des schémas supplémentaires - pour plus de détails, consultez la documentation correspondante .

Vous pouvez maintenant créer un fichier YAML et commencer à utiliser la saisie semi-automatique. En appuyant sur <Ctrl> + espace (ou une autre combinaison configurée dans vim), les champs et la documentation disponibles doivent s'afficher conformément au contexte actuel:


<Ctrl> + espace fonctionne ici, car je l'ai configuré inoremap <silent><expr> <c-space> coc#refresh(). Si vous ne l'avez pas encore fait, consultez le fichier README de coc.nvim pour un exemple de configuration.

Sélection de la version de l'API Kubernetes


Au moment d'écrire ces lignes, yaml-language-server est livré avec les schémas Kubernetes 1.14.0. Je n'ai pas trouvé de moyen de sélectionner dynamiquement un schéma, j'ai donc ouvert le problème GitHub correspondant . Heureusement, puisque le serveur de langue est écrit en caractères dactylographiés, il est très facile de changer manuellement la version. Pour ce faire, il suffit de trouver le fichier server.ts.

Pour le trouver sur votre machine, ouvrez simplement le fichier YAML avec vim et trouvez le processus avec 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

Le processus 2380 nous intéresse: c'est vim qui l'utilise lors de l'édition d'un fichier YAML.

Comme vous pouvez le voir, le fichier se trouve dans /Users/joshrosso/.config/coc/extensions/node_modules/coc-yaml/node_modules/yaml-language-server/out/server/src/server.js. Il suffit de le modifier, en changeant la valeur KUBERNETES_SCHEMA_URL, par exemple, en version 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";

Selon la version utilisée, l' coc-yamlemplacement de la variable dans le code peut être différent. Notez également que j'ai changé le référentiel de garethren instrumenta. Il semble garethrqu'il soit passé aux circuits de soutien là-bas.

Pour vérifier que la modification a pris effet, vérifiez si un champ n'apparaissait pas auparavant [dans les versions précédentes de Kubernetes]. Par exemple, il n'y avait pas de startupProbe dans le circuit pour K8s 1.14 :



Sommaire


J'espère que cette opportunité ne vous a pas moins plu que moi. Heureux YAML'ing! N'oubliez pas de consulter ces référentiels pour mieux comprendre les utilitaires mentionnés dans l'article:


PS du traducteur


Et il y a vikube , vim-kubernetes et vimkubectl .

Lisez aussi dans notre blog:


All Articles