Go 正在尝试调试terraform提供程序azurerm,以便我能够为社区做出贡献。但地形计划崩溃了 介绍

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做贡献。我注意到azurerm\u firewall\u network\u rule\u集合出现问题,我已经报告了。我想我应该借此机会看看我是否可以插手并尝试解决我报告的问题!如果我能够调试提供程序并查看代码的工作方式,那么我不仅可以学习go,还可以找出并帮助修复bug/增强功能
如果你们能为我提供任何帮助并引导我走向正确的方向,我将不胜感激。我知道你的时间很宝贵,在来寻求帮助之前我已经尽力了。
总结我尝试做的以下工作:

  • 分叉
    地形提供者azurerm
    存储库
  • 将分叉回购克隆到我的本地。我正在WSL中使用
    Ubuntu 20.04
  • 正在运行
    vscode
    version
    1.54.3
  • 使用
    terraform 0.14.9
    ,使用
    tfenv
    安装和管理不同版本
  • 在vscode中安装
    golang
    和相关go工具。我使用的是
    go1.16.2Linux/amd64版本
    。使用
    linuxbrew
    安装go
  • 安装
    gcc5
    。使用
    linuxbrew
    进行安装
  • 安装
    delve
    调试器。使用
    linuxbrew
    进行安装
  • 创建一个非常简单的terraform
    main.tf
    ,它只将一个资源组部署到我的Azure订阅中
  • 创建
    .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 {}
      }
    
  • 修改了terraform provider azurerm中的main.go文件,以便可以在调试器模式下启动提供程序二进制文件。现在,主要功能如下所示:

    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,
    // })
    }
    
  • vscode调试器启动配置如下所示:

    {
    //使用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”}
    
  • 在tf源代码所在的文件夹中运行
    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"}}}