设置一个能够轻松编辑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,则准备工作完成,补全功能就会生效。
但是,如果在那时用双引号括起来资源名称之类的东西,补全功能就无法正常工作了(为什么呢……)。

使用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的人才。