В дополнение к сообщению, которое я поместил Шаблон регулярного выражения, соответствующий коду модуля terraform , было предложено посмотреть на модуль hclwrite golang, если мы хотим выполнить хирургическую запись в файл terraform.
Я потратил некоторое время на изучение go и переписал скрипт python на go. Скрипт охватывает начальную часть, где он ищет файл со строкой 'module' в файле terraform. Поскольку функции hclwrite запрашивают байтовый массив, я также преобразовал содержимое файла в байтовый массив.
нам нужно захватить блок terraform, начиная с модуля, а затем записать его обратно с соответствующими элементами ресурса. Для этого я запрашиваю в словаре модуль и затем записываю ресурс обратно. Как мы делаем это с помощью hclwrite? Вот некоторые ссылки, которые я использовал: 1. Пример https://xuanwo.io/2020/04/13/get-started-with-hcl2/ 2. Пакет для синтаксиса hcl https://godoc.org/github.com/hashicorp/terraform/vendor/github.com/hashicorp/hcl/v2/hclsyntax#ParseConfig
Изменение
module mymodule {
}
To resource resource_name {
}
Код, который я написал до сих пор в go
func main() {
var text string = "module"
var dirpath = "<path to the files>/*.tf"
//Get the terraform files in the directory and select files with string 'module'
matches, _ := filepath.Glob(dirpath)
for _, match := range matches {
if IsExist(text, match) {
fmt.Println(match)
var chunk []byte
file, err := os.Open(match)
if err != nil {
panic(err.Error())
}
defer file.Close()
reader := bufio.NewReader(file)
buffer := bytes.NewBuffer(make([]byte, 0))
// var chunk []byte
var eol bool
var str_array []string
for {
if chunk, eol, err = reader.ReadLine(); err != nil {
break
}
buffer.Write(chunk)
if !eol {
str_array = append(str_array, buffer.String())
buffer.Reset()
}
}
if err == io.EOF {
err = nil
}
}
}
}