Vim com suporte YAML para Kubernetes

Nota perev. : O artigo original foi escrito por Josh Rosso, arquiteto da VMware que trabalhou anteriormente para empresas como CoreOS e Heptio, além de co-autor do controlador de entrada de albinas Kubernetes. O autor compartilha uma pequena receita, que pode ser muito útil para engenheiros operacionais da “velha escola” que preferem o vim, mesmo na era do nativo da nuvem vitorioso.



Escrevendo manifestos YAML para o Kubernetes no vim? Passaram inúmeras horas tentando descobrir onde o próximo campo deve estar nessa especificação? Ou talvez você fique feliz com um lembrete rápido da diferençaargsecommand? Há boas notícias! O Vim é fácil de vincular ao yaml-language-serverpara obter conclusão automática, validação e outras comodidades. Neste artigo, falaremos sobre como configurar o cliente do servidor de idiomas para isso.

(O artigo original também possui um vídeo em que o autor fala e demonstra o conteúdo do material.)

Servidor de idiomas


Servidores de idiomas ( servidores de idiomas) falam sobre as possibilidades de linguagens de programação para editores e IDEs, para os quais eles interagem usando um protocolo especial - LSP ( Language Server Protocol ). Essa é uma ótima abordagem: permite que uma única implementação forneça dados a vários editores / IDEs de uma só vez. Eu já escrevi sobre gopls - o servidor de idiomas do Golang - e como ele pode ser usado no vim . As etapas para obter a conclusão automática no YAML para Kubernetes são semelhantes.



Para que o vim funcione da maneira descrita, você precisa instalar o cliente do servidor de idiomas. Dois métodos que eu conheço são LanguageClient-neovim e coc.vim. No artigo, considerarei coc.vim- este é o plugin mais popular no momento. Você pode instalá-lo através do 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'}

Para iniciar coc(e, portanto, o yaml-language-server), você precisa instalar o node.js instalado:

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

Quando coc.vimconfigurado, instale a extensão coc-yamldo servidor do vim:

:CocInstall coc-yaml



Finalmente, você provavelmente desejará começar com a configuração coc-vimapresentada como exemplo . Em particular, ele ativa a combinação <Ctrl> + espaço para chamar o preenchimento automático.

Configurando a descoberta do servidor yaml-language-server


Para cocusar o yaml-language-server, você precisa pedir para ele baixar o esquema do Kubernetes ao editar arquivos YAML. Isso é feito editando coc-config:

:CocConfig

Na configuração, você precisa adicionar kubernetespara todos os arquivos yaml. Além disso, uso o servidor de idiomas para golang, portanto, minha configuração geral fica assim:

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

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

kubernetes- um campo reservado que informa o servidor de idiomas sobre a necessidade de baixar o esquema Kubernetes usando a URL definida nesta constante . yaml.schemaspode ser expandido com suporte a esquemas adicionais - para obter mais detalhes, consulte a documentação relevante .

Agora você pode criar um arquivo YAML e começar a usar o preenchimento automático. Pressionar <Ctrl> + space (ou outra combinação configurada no vim) deve mostrar os campos e a documentação disponíveis de acordo com o contexto atual:


<Ctrl> + space funciona aqui, porque eu o configurei inoremap <silent><expr> <c-space> coc#refresh(). Se você não tiver feito isso, consulte o arquivo coc.nvim README para obter uma configuração de exemplo.

Seleção de versão da API Kubernetes


No momento da redação deste artigo, o yaml-language-server é fornecido com os esquemas do Kubernetes 1.14.0. Não encontrei uma maneira de selecionar dinamicamente um esquema, então abri o problema correspondente do GitHub . Felizmente, como o servidor de idiomas está escrito em texto datilografado, é muito fácil alterar manualmente a versão. Para fazer isso, basta encontrar o arquivo server.ts.

Para encontrá-lo em sua máquina, basta abrir o arquivo YAML com vim e localizar o processo com 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

O processo 2380 é relevante para nós: é o vim que o utiliza ao editar um arquivo YAML.

Como você pode ver, o arquivo está localizado em /Users/joshrosso/.config/coc/extensions/node_modules/coc-yaml/node_modules/yaml-language-server/out/server/src/server.js. Basta editá-lo, alterando o valor KUBERNETES_SCHEMA_URL, por exemplo, para a versão 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";

Dependendo da versão usada, o coc-yamllocal da variável no código pode ser diferente. Observe também que mudei o repositório de garethrpara instrumenta. Parece que garethrele mudou para circuitos de suporte lá.

Para verificar se a alteração entrou em vigor, verifique se aparece um campo que não existia antes [nas versões anteriores do Kubernetes]. Por exemplo, não havia startupProbe no circuito para o K8s 1.14 :



Sumário


Espero que esta oportunidade tenha lhe agradado nada menos que eu. Feliz YAML'ing! Certifique-se de verificar estes repositórios para entender melhor os utilitários mencionados no artigo:


PS do tradutor


E há vikube , vim-kubernetes e vimkubectl .

Leia também no nosso blog:


All Articles