设置一个能够轻松编辑terraform的环境,使用Vim

本文是Vim2 Advent Calendar 2019第8天的文章。
这篇文章将介绍如何使用vim-lsp和terraform-lsp来创建一个舒适的环境来编辑tf文件。

增加!地球改造者!

关于Terraform

Terraform是HashiCorp开发和维护的开源配置管理工具。它使用一种名为HCL的专有语言来定义和管理各种资源,包括公共云平台如AWS/GCP/Azure以及虚拟化工具如VMware。

我认为最重要的特点是可以使用Terraform destroy批量删除创建的资源。

这个问题

对于正在使用Terraform的人来说,他们实际上使用的是哪个编辑器?
大多数人可能会使用VSCode,并使用Terraform的扩展功能。(带有偏见)

最初我使用安装了Terraform扩展功能的VSCode。(当然还有vim键绑定扩展功能)
我曾经尝试安装了vim-lsp,但是完全搞不清楚怎么做,所以我放弃了。
后来我去vimconf听了关于vim-lsp的讲座,我非常兴奋,觉得我必须要试试看!于是我进行了相应的设置。
在我放弃的时候,我使用的是Windows上的terraform和terraform-lsp。可能是因为COREGA的原因导致无法完成。(稍后会详细说明)

准备之物

    • WSL ( Ubuntu 18.04 LTS )

 

    • vim-plug

 

    • terraform >= 12.0

 

    terraform-lsp

由于我使用vim-plug作为我的插件管理工具,所以我将在此为其编写。

此外,由于Terraform自12.0版本起语言规范略有改变,因此我们将创建适用于12.0版本的内容。

准备terraform-lsp

由於在這裡已經有一個已編譯的二進制檔案,我們將把已編譯的二進制檔案放置在已經設定好的路徑中。
https://github.com/juliosueiras/terraform-lsp/releases/latest

我经常受到Juliosueiras的照顾。

插件调用部分

安裝插件來實現所需的功能和語法高亮顯示。

call plug#begin('~/.vim/plugged')
  Plug 'prabirshrestha/async.vim'
  Plug 'prabirshrestha/vim-lsp'
  Plug 'prabirshrestha/asyncomplete.vim'
  Plug 'prabirshrestha/asyncomplete-lsp.vim'

  Plug 'hashivim/vim-terraform' , { 'for': 'terraform'}

call plug#end()

vim-lsp 的配置部分

我們將引入使用LanguageServer的配置。
它能夠無需特別設定即可運行。

if executable('terraform-lsp')
  au User lsp_setup call lsp#register_server({
    \ 'name': 'terraform-lsp',
    \ 'cmd': {server_info->['terraform-lsp']},
    \ 'whitelist': ['terraform','tf'],
    \ })
endif

当我在Windows版本尝试运行时发现无法运行时,我尝试了解是否需要添加某些参数,但我甚至不知道如何查找LanguageServer的规范……

要使用terraform-lsp

使用terraform-lsp的准备工作已经完成。

provider aws {
}

如果在Terraform中提供了提供者(provider)并且运行terraform init,则准备工作完成,补全功能就会生效。
但是,如果在那时用双引号括起来资源名称之类的东西,补全功能就无法正常工作了(为什么呢……)。

image.png

使用vim,现在已准备好使用tf文件了。祝您享受美好的terraform生活!

给你个小礼物

我决定写这篇文章的原因

之前尝试过在vim中使用terraform-lsp的补全功能,但是不太明白所以放弃了。然而,后来去vimconf听了关于vim-lsp的讲座,我的动力猛增,所以尝试了很多。由于制作过程相对困难,如果这个可以实现,使用vim来进行terraform的人也会增加,我的环境也会更加舒适吧…

在Windows操作系统上,terraform-lsp无法正常运行。

2019/11/15 00:56:45 [DEBUG] checking for provider in "C:\\vim"
2019/11/15 00:56:45 [DEBUG] checking for provider in "C:\\Users\\user\\go\\bin"
2019/11/15 00:56:45 (*errors.errorString)(0xc00019c190)(Failed to find plugin: aws. Plugin binary was not found in any of the following directories: [., C:\vim, terraform.d\plugins\windows_amd64, C:\Users\user\AppData\Local\Temp\.terraform\plugins\windows_amd64, C:\Users\user\.terraform.d\plugins, C:\Users\user\.terraform.d\plugins\windows_amd64, C:\Users\user\go\bin])

2019/11/15 00:56:45 [DEBUG] plugin dirs: []string{".", "C:\\vim", "terraform.d\\plugins\\windows_amd64", "C:\\Users\\user\\AppData\\Local\\Temp\\.terraform\\plugins\\windows_amd64", "C:\\Users\\user\\.terraform.d\\plugins", "C:\\Users\\user\\.terraform.d\\plugins\\windows_amd64", "C:\\Users\\user\\go\\bin"}
2019/11/15 00:56:45 [DEBUG] checking for provider in "."
2019/11/15 00:56:45 [DEBUG] checking for provider in "C:\\vim"
2019/11/15 00:56:45 [DEBUG] checking for provider in "C:\\Users\\user\\go\\bin"
2019/11/15 00:56:45 (*errors.errorString)(0xc00019c400)(Failed to find plugin: aws. Plugin binary was not found in any of the following directories: [., C:\vim, terraform.d\plugins\windows_amd64, C:\Users\user\AppData\Local\Temp\.terraform\plugins\windows_amd64, C:\Users\user\.terraform.d\plugins, C:\Users\user\.terraform.d\plugins\windows_amd64, C:\Users\user\go\bin])

我尝试在Windows上运行时失败了,这些是我在追踪 terraform-lsp 日志时遇到的内容。
当运行 terraform init 时,terraform应该将模块放置在工作目录下,
但是我觉得它好像没有去找那个目录。

如果有更多的余裕,我希望能更深入地培养会使用Windows进行terraform的人才。

bannerAds