与terraform模块代码匹配的正则表达式模式

2024-06-01 08:37:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用正则表达式匹配terraform模块,并在行的开头添加注释。我不能将正则表达式仅用于模块块。请注意,某些行确实会在其他块(如资源块)上重复。其思想是扫描模块块并对其进行注释。任何帮助都将不胜感激。我花了很多时间思考

module my module {
name = myaws
version = 1.0
source = terraform.mycompany.com
tag = { cost = poc }
}

data "my file" "file-name-creation-data" {
  template = file("path/file.json")
}

resource aws_iam_role_policy "my-role" {
 name = "first-policy"
 role = new role.rolename
 tag = { cost = pic }
}

Tags: 模块namedatamytagpolicy时间资源
1条回答
网友
1楼 · 发布于 2024-06-01 08:37:51

Terraform语言不是regular language,因此没有完全通用的方法用正则表达式处理它

但是,该语言的块语法有一些限制,这意味着您可以编写一个“足够好”的启发式程序来处理大多数情况(但仍然不是所有情况)。以下是关于Terraform语言的一些有用的事实,这些事实有助于稍微限制问题:

  • 块的洞口必须始终显示在同一行上,包括洞口支撑。在module关键字和{大括号之间包含额外的换行符是无效的

  • 有两种写入块的方法:

    • 通常的布局是将标题放在自己的一行上,以引入块体的大括号结束:{
    • 紧凑的单行布局将整个块放在一行上,内部只有一个参数,如module "foo" { source = "./bar" }
  • 正常布局中块的右大括号始终位于其自身的一条线上

当然,也有一些不太方便的事实:

  • Terraform还将大括号用于其对象构造函数表达式,因此天真地搜索开始和结束大括号将同时找到块边界和对象构造函数边界

  • 字符串模板语法使用${%{作为开头分隔符,但它使用}作为结尾分隔符,增加了结尾大括号的第三种含义

  • “herdeoc”语法脱离了正常的解析规则,意味着可以出现任意数量的大括号(不需要平衡)。但是它们总是以一个<<<<-开头,然后在一行的末尾加上一个标识符,然后在它自己的一行上以相同的标识符结尾

所有这些都说,如果你对输入有控制权,并且可以确保它不包括“块情况”,比如块头部中间的注释,包含看起来像模块块等的遗传序列,那么你可以通过逐行处理输入来获得一个“足够好”的结果:

  • 设B=0
  • 对于输入中的每一行:
    • 如果B为零:
    • 如果行与^module ["\w- ]*{匹配,则对模块块执行任何您想要执行的操作
    • 对于行中的每个字符:
    • 如果字符为{,则递增B
    • 如果字符为},则递减B

这使用了一种简单的大括号计数方法来近似查找块的边界。如果输入中包含带有不平衡大括号的文字字符串(quoted或heredoc),它将失败,因此您可以尝试通过计算打开/关闭quote和heredoc标记对来改进这一点

任何缺少完整语法分析器的语言都会有一些它无法处理的边缘情况,但是如果您可以限制您的输入,使其不包括您的简单规则集无法理解的任何情况,那么像上面这样的方法可能适合您


如果您愿意用Go编写程序,那么就可以使用^{}包,它是Terraform用于实现其语言语法的底层库的一部分。它有一个完整的解析器,允许对它读取的内容进行“外科手术式”编辑,尽管在我写这篇文章的时候,它似乎没有向块添加注释的功能,所以它目前还没有准备好解决您的特定目标

它可能对将来发现这个问题的其他人有用,这些人有其他与修改现有地形配置相关的目标,并且它可能获得额外的功能来支持将来的其他用例

相关问题 更多 >