Go 正在尝试调试terraform提供程序azurerm,以便我能够为社区做出贡献。但地形计划崩溃了 介绍
大家好,我正试图开始为地形提供商azurerm做贡献。我注意到azurerm\u firewall\u network\u rule\u集合出现问题,我已经报告了。我想我应该借此机会看看我是否可以插手并尝试解决我报告的问题!如果我能够调试提供程序并查看代码的工作方式,那么我不仅可以学习go,还可以找出并帮助修复bug/增强功能Go 正在尝试调试terraform提供程序azurerm,以便我能够为社区做出贡献。但地形计划崩溃了 介绍,go,debugging,terraform,azure-rm,Go,Debugging,Terraform,Azure Rm,大家好,我正试图开始为地形提供商azurerm做贡献。我注意到azurerm\u firewall\u network\u rule\u集合出现问题,我已经报告了。我想我应该借此机会看看我是否可以插手并尝试解决我报告的问题!如果我能够调试提供程序并查看代码的工作方式,那么我不仅可以学习go,还可以找出并帮助修复bug/增强功能如果你们能为我提供任何帮助并引导我走向正确的方向,我将不胜感激。我知道你的时间很宝贵,在来寻求帮助之前我已经尽力了。 总结我尝试做的以下工作: 分叉地形提供者azure
如果你们能为我提供任何帮助并引导我走向正确的方向,我将不胜感激。我知道你的时间很宝贵,在来寻求帮助之前我已经尽力了。
总结我尝试做的以下工作:
- 分叉
存储库地形提供者azurerm
- 将分叉回购克隆到我的本地。我正在WSL中使用
Ubuntu 20.04
- 正在运行
versionvscode
1.54.3
- 使用
,使用terraform 0.14.9
安装和管理不同版本tfenv
- 在vscode中安装
和相关go工具。我使用的是golang
。使用go1.16.2Linux/amd64版本
安装golinuxbrew
- 安装
。使用gcc5
进行安装linuxbrew
- 安装
调试器。使用delve
进行安装linuxbrew
- 创建一个非常简单的terraform
,它只将一个资源组部署到我的Azure订阅中main.tf
- 创建
文件(将其设置在.terraformrc
位置),以向提供程序提供开发覆盖路径/home/rahul/.terraformrc
- 修改
(位置main.go
)以使用调试语句/usr/local/go/src/github.com/terraform providers/terraform provider azurerm/main.go
- 使用调试代码编译提供程序并创建新的二进制文件
- 将无头模式下的dlv连接到此二进制文件
- 使用上一步中的数据在变量TF_repattach_PROVIDERS中进行设置
- 运行地形计划-希望有一个成功的计划运行
- 关闭调试模式,编译提供程序,然后运行terraform plan
- 计划使用本地提供程序成功运行
- 这项计划以失败告终
Terraform crashed! This is always indicative of a bug within Terraform. A crash log has been placed at "crash.log" relative to your current working directory. It would be immensely helpful if you could please report the crash with Terraform[1] so that we can fix this.
- 来自日志输出的内容
provider_installation {
# Use /home/developer/go/bin as an overridden package directory
# for the hashicorp/azurerm provider. This disables the version and checksum
# verifications for this provider and forces Terraform to look for the
# azurerm provider plugin in the given directory.
dev_overrides {
"registry.terraform.io/hashicorp/azurerm" = "/usr/local/go/bin"
}
# For all other providers, install them directly from their origin provider
# registries as normal. If you omit this, Terraform will _only_ use
# the dev_overrides block, and so no other providers will be available.
direct {}
}
func main(){
//从日志输出中删除日期和时间戳,因为插件SDK已经添加了自己的日期和时间戳
log.SetFlags(log.Flags()&^(log.Ldate | log.Ltime))
var调试模式布尔
flag.BoolVar(&debugMode,“debug”,true,“设置为true以运行支持delve等调试器的提供程序”)
flag.Parse()
选项:=&plugin.ServeOpts{ProviderFunc:azurerm.Provider}
如果调试模式{
//TODO:使用配置中使用的提供商全名更新此字符串
err:=plugin.Debug(context.Background(),“registry.terraform.io/hashicorp/azurerm”,opts)
如果错误!=零{
log.Fatal(err.Error())
}
返回
}
plugin.service(opts)
//plugin.service(&plugin.ServeOpts){
//ProviderFunc:azurerm.Provider,
// })
}
{
//使用IntelliSense了解可能的属性。
//悬停以查看现有属性的描述。
//有关更多信息,请访问:https://go.microsoft.com/fwlink/?linkid=830387
“版本”:“0.2.0”,
“配置”:[
{
“名称”:“连接到服务器”,
“类型”:“开始”,
“请求”:“附上”,
“模式”:“远程”,
“remotePath”:“${workspaceFolder}”,
“港口”:36283,
“主机”:“127.0.0.1”,
“apiVersion”:1
}
]
}
makebuild
来生成二进制文件。它将二进制文件复制到$GOPATH/bin/
位置
dlv exec--listen=127.0.0.1:36283--api version=1--headless$GOPATH/bin/terraform provider azurerm--debug启动delv headless调试器
--listen=127.0.0.1:36283
是我在谷歌上搜索并计算出的一个附加参数,在terraform文档中没有提到。这有助于我在每次启动调试器时不更改调试端口
API server listening at: 127.0.0.1:36283
{"@level":"debug","@message":"plugin address","@timestamp":"2021-04-05T06:08:38.863169+10:00","address":"/tmp/ plugin594405865","network":"unix"}
Provider server started; to attach Terraform, set TF_REATTACH_PROVIDERS to the following:
{"registry.terraform.io/hashicorp/azurerm":{"Protocol":"netrpc","Pid":16362,"Test":true,"Addr":{"Network":"unix","String":"/ tmp/plugin594405865"}}}
TF\u重新连接\u提供程序
值
export TF_resattach_PROVIDERS='{“registry.terraform.io/hashicorp/azurerm”:{“Protocol”:“netrpc”,“Pid”:16362,“Test”:true,“Addr”:{“Network”:“unix”,“String”:“/tmp/plugin594405865”}
terraform plan
。。一切都在爆炸
provider_installation {
# Use /home/developer/go/bin as an overridden package directory
# for the hashicorp/azurerm provider. This disables the version and checksum
# verifications for this provider and forces Terraform to look for the
# azurerm provider plugin in the given directory.
dev_overrides {
"registry.terraform.io/hashicorp/azurerm" = "/usr/local/go/bin"
}
# For all other providers, install them directly from their origin provider
# registries as normal. If you omit this, Terraform will _only_ use
# the dev_overrides block, and so no other providers will be available.
direct {}
}
API server listening at: 127.0.0.1:36283
{"@level":"debug","@message":"plugin address","@timestamp":"2021-04-05T06:08:38.863169+10:00","address":"/tmp/ plugin594405865","network":"unix"}
Provider server started; to attach Terraform, set TF_REATTACH_PROVIDERS to the following:
{"registry.terraform.io/hashicorp/azurerm":{"Protocol":"netrpc","Pid":16362,"Test":true,"Addr":{"Network":"unix","String":"/ tmp/plugin594405865"}}}