Hướng dẫn python hcl to json - chuyển từ hcl sang json

Hướng dẫn python hcl to json - chuyển từ hcl sang json

Thực hiện trình phân tích cú pháp cho HCL (ngôn ngữ cấu hình Hashicorp) trong Python. Việc triển khai này nhằm mục đích tương thích với phiên bản Golang gốc của trình phân tích cú pháp.

Ngữ pháp và nhiều bài kiểm tra/đồ đạc đã được sao chép/chuyển từ trình phân tích cú pháp Golang vào PYHCL. Tất cả các bản phát hành được thử nghiệm với nhiều phiên bản Python từ Python 2.7 trở đi.

Phiên bản này đã được sửa đổi để làm việc với cú pháp Terraform 0.12. Nó nên tương thích ngược với các phiên bản trước. Nó không bao gồm mọi tình huống. Xem Thảo luận trong Yêu cầu kéo: https://github.com/virtuald/pyhcl/pull/57

Cài đặt

pip install pyhcl

Cách sử dụng

Mô -đun này được dự định sẽ được sử dụng theo cách tương tự như cách người ta sẽ sử dụng mô -đun JSON trong Python và tải/tải/bãi rác được triển khai.

import hcl

with open('file.hcl', 'r') as fp:
    obj = hcl.load(fp)

Hiện tại chức năng Dumps đầu ra JSON, và không HCL.

Chuyển đổi HCl sang JSON

PYHCL đi kèm với một kịch bản mà bạn có thể sử dụng để dễ dàng chuyển đổi HCL thành JSON, tương tự như json.tool đi kèm với Python:

hcltool INFILE [OUTFILE]

Xác thực cấu trúc

Tương tự như JSON, đầu ra của phân tích cú pháp HCL là từ điển Python không có cấu trúc xác định. Thư viện Golang cho HCL thực hiện hỗ trợ phân tích cú pháp HCL theo các đối tượng được xác định, nhưng việc triển khai này hiện không hỗ trợ các cấu trúc đó.

Thay vào đó, tôi khuyên bạn nên sử dụng các công cụ được thiết kế để xác nhận JSON, chẳng hạn như thư viện sơ đồ.

Cú pháp

  • Nhận xét dòng duy nhất bắt đầu bằng # hoặc //# or //

  • Nhận xét đa dòng được gói trong / * và * / //* and */

  • Các giá trị được gán với phím Syntax Key = value (khoảng trắng không quan trọng). Giá trị có thể là bất kỳ nguyên thủy: chuỗi, số, boolean, đối tượng hoặc danh sách.key = value (whitespace doesn’t matter). The value can be any primitive: a string, number, boolean, object, or list.

  • Chuỗi được trích dẫn kép và có thể chứa bất kỳ ký tự UTF-8 nào. Ví dụ: "Xin chào, Thế giới""Hello, World"

  • Các số được coi là cơ sở 10. Nếu bạn có tiền tố một số có 0x, nó được coi là thập lục phân. Nếu nó được đặt trước với 0, nó được coi là một bát phân. Số có thể có trong ký hiệu khoa học: 1E10.

  • Giá trị Boolean: Đúng, Saitrue, false

  • Mảng có thể được thực hiện bằng cách gói nó trong []. Ví dụ: ["Foo", "Bar", 42]. Mảng có thể chứa các nguyên thủy và các mảng khác, nhưng không thể chứa các đối tượng. Các đối tượng phải sử dụng cú pháp khối được hiển thị bên dưới.[]. Example: ["foo", "bar", 42]. Arrays can contain primitives and other arrays, but cannot contain objects. Objects must use the block syntax shown below.

Các đối tượng và các đối tượng lồng nhau được tạo bằng cấu trúc được hiển thị bên dưới:

variable "ami" {
    description = "the AMI to use"
}

Kiểm tra

Để chạy các bài kiểm tra:

pip install -r testing-requirements.txt
tests/run_tests.sh

Chế độ kiểm tra sửa lỗi

Để bật chế độ gỡ lỗi:

import hcl
hcl.parser.DEBUG = True

Tác giả

Dustin Spicuzza ([email protected])@virtualroadside.com)

Lưu ý: Dự án này không liên quan đến Hashicorp

Để hiểu rõ hơn về Terraform, tôi muốn có thể dịch HCL thành JSON tương đương. Tôi đã nhận được trình phân tích cú pháp HCL (https://github.com/hashicorp/hcl) để xây dựng và các thử nghiệm để chạy nhưng tôi không thấy bất kỳ lệnh nào để lấy tệp HCL và xuất JSON.

Có một triển khai Python của HCL và nó bao gồm một tiện ích chuyển đổi HCL thành JSON, nhưng nó có một số hành vi khá lạ/bất ngờ và tôi muốn xác nhận rằng hành vi này đến từ ngôn ngữ HCL và không cụ thể cho việc thực hiện Python . ví dụ.

> cat foo.tf 
service {
    key = "aaa"
}

service {
    key = 0x10
    foo = "bar"
}

> hcltool foo.tf 
{
    "service": [
        {
            "foo": "bar",
            "key": "aaa"
        },
        {
            "key": 16
        }
    ]
}

Hỏi ngày 4 tháng 8 năm 2017 lúc 4:03Aug 4, 2017 at 4:03

3

Có một dự án nguồn mở ____10 và bạn có thể sử dụng để được trợ giúp, nhưng Terraform HCL không tiêu chuẩn như chúng thiết kế. Giải thích ở đây:

https://github.com/kvz/json2hcl/issues/4#issuecomment-275513256

Đáng buồn thay, hành vi này là do Thư viện HCL chính thức của Hasicorp do sự mơ hồ ở định dạng HCL. Do đó, chúng tôi không thực sự có thể cải thiện tình huống này. Chúng tôi đã có các cuộc thảo luận tương tự trong quá khứ, nếu bạn có thể muốn đọc thêm về chủ đề này và tại sao điều này có thể sẽ không được thay đổi trong tương lai:

REPO liên quan mà bạn có thể cài đặt công cụ:

https://github.com/kvz/json2hcl

Dưới đây là một ví dụ đồ đạc/infra.tf.json được chuyển đổi thành HCl:

$ json2hcl < fixtures/infra.tf.json > fixtures/infra.tf

Như một phần thưởng, cách khác cũng được hỗ trợ thông qua Cờ -reverse:

$ json2hcl -reverse < fixtures/infra.tf

Đã trả lời ngày 4 tháng 8 năm 2017 lúc 4:18Aug 4, 2017 at 4:18

Hướng dẫn python hcl to json - chuyển từ hcl sang json

BMWBMWBMW

40.7K12 Huy hiệu vàng94 Huy hiệu bạc114 Huy hiệu đồng12 gold badges94 silver badges114 bronze badges

2

Trang web này rất hữu ích cho các chuyển đổi một lần giữa HCL, JSON và YAML: https://www.hcl2json.com/

Đã trả lời ngày 18 tháng 4 năm 2018 lúc 14:24Apr 18, 2018 at 14:24

Kennbrodhagenkennbrodhagenkennbrodhagen

4.1282 Huy hiệu vàng26 Huy hiệu bạc21 Huy hiệu đồng2 gold badges26 silver badges21 bronze badges

1

Bạn cũng có thể sử dụng HCL2, như dưới đây:

with open('main.tf', 'r') as file:
    temp_dict = hcl2.load(file)

Đã trả lời ngày 16 tháng 11 lúc 5:25Nov 16 at 5:25