KCL의 구성 및 자동화

Jan 06 2023
소개 Kusion 구성 언어(KCL)는 오픈 소스 제약 기반 레코드 및 기능 언어입니다. KCL은 성숙한 프로그래밍 언어 기술과 실습을 통해 수많은 복잡한 구성의 작성을 개선하고 구성에 대한 더 나은 모듈성, 확장성 및 안정성, 더 간단한 논리 작성, 빠른 자동화 및 우수한 생태적 확장성을 구축하기 위해 노력하고 있습니다.

소개

KCL(Kusion Configuration Language) 은 오픈 소스 제약 기반 레코드 및 기능 언어입니다. KCL은 성숙한 프로그래밍 언어 기술과 실습을 통해 수많은 복잡한 구성의 작성을 개선하고 구성에 대한 더 나은 모듈성, 확장성 및 안정성, 더 간단한 논리 작성, 빠른 자동화 및 우수한 생태적 확장성을 구축하기 위해 노력하고 있습니다.

전제 조건

KCL 설치:

KCL의 각 릴리스에는 다양한 OS 및 아키텍처가 포함되어 있습니다. 이러한 바이너리 버전은 Github 에서 수동으로 다운로드하여 설치 {install-location}/kclvm/bin하고 환경 PATH에 추가 할 수 있습니다.

export PATH=$PATH:{install-location}/kclvm/bin

새로운 언어를 배우는 가장 좋은 방법은 몇 가지 작은 프로그램을 작성하는 것이며 언어 구성도 마찬가지입니다. 구성을 작성하는 것처럼 KCL 프로그램을 작성할 수 있습니다.

다음은 간단합니다 hello.k.

hello = "KCL"

이 프로그램을 실행하는 방법은 특정 개발 환경에 따라 다르며 먼저 로컬 macOS 또는 Linux 시스템이 kcl명령을 설치했다고 가정하고(또는 를 통해 Docker 환경 테스트에 진입 docker run --rm -it kcl-lang/kusion bash) 다음 명령을 실행합니다.

$ kcl hello.k
hello: KCL

출력은 YAML 형식의 구성 데이터입니다. kcl이 프로그램은 간단하지만 KCL 구성 프로그램을 출력으로 실행하여 개발 환경과 명령줄의 기본 사용법을 확인할 수 있습니다 .

2. 조금 더 복잡한 구성

공통 키-값 쌍 외에도 공통 구성 데이터에는 중첩된 사전 및 목록 유형이 있으며 값 기본 유형에는 문자열 외에 부울 및 숫자 유형이 포함됩니다. 다음은 약간 더 복잡한 server.k구성입니다.

# This is a KCL document

title = "KCL Example"
owner = {
    name = "The KCL Authors"
    data = "2020-01-02T03:04:05"
}
database = {
    enabled = True
    ports = [8000, 8001, 8002]
    data = [["delta", "phi"], [3.14]]
    temp_targets = {cpu = 79.5, case = 72.0}
}
servers = [
    {ip = "10.0.0.1", role = "frontend"}
    {ip = "10.0.0.2", role = "backend"}
]

이 구성의 YAML 출력은 다음과 같습니다.

$ kcl server.k 
title: KCL Example
owner:
  name: The KCL Authors
  data: '2020-01-02T03:04:05'
database:
  enabled: true
  ports:
  - 8000
  - 8001
  - 8002
  data:
  - - delta
    - phi
  - - 3.14
  temp_targets:
    cpu: 79.5
    case: 72.0
servers:
- ip: 10.0.0.1
  role: frontend
- ip: 10.0.0.2
  role: backend

schemaKCL은 구문 을 통해 고정된 속성 구조와 기본값 동작이 있는 속성에 대한 추상 지원을 제공 합니다.

예를 들어 database위의 예에서 구성은 일반적으로 기본값입니다. 데이터베이스의 기본 구성에 대한 구조를 정의할 수 있습니다.

schema DatabaseConfig:
    enabled: bool = True
    ports: [int] = [8000, 8001, 8002]
    data: [[str|float]] = [["delta", "phi"], [3.14]]
    temp_targets: {str: float} = {cpu = 79.5, case = 72.0}

그런 다음 database = DatabaseConfig {}기본 값과 동일한 특성을 가진 구조를 생성하도록 전달합니다. 기본값을 수정할 수도 있습니다.

database = DatabaseConfig {
    ports = [2020, 2021]
}

database = DatabaseConfig {
    ports = [1.2, 1.3]
}

$ kcl server.k 
KCL Compile Error[E2G22] : The type got is inconsistent with the type expected
    ---> File /path/to/server.k:8:2
    8 |    ports = [1.2, 1.3]
      5    ^  -> got [float(1.2)|float(1.3)]
    ---> File /path/to/server.k:3:2
    3 |    ports: [int] = [8000, 8001, 8002]
      5    ~  -> expect [int]
expect [int], got [float(1.2)|float(1.3)]

schema ServerConfig:
    ip: str
    role: "frontend" | "backend"

servers = [
    ServerConfig {ip = "10.0.0.1", role = "frontend"}
    ServerConfig {ip = "10.0.0.2", role = "backend"}
]

또한 , 선택적 속성 , 상속 및 확장 모듈을 schema결합하여 보다 복잡한 구성 및 정책 데이터 추상화를 달성할 수 있습니다. 자세한 내용은 여기 에서 확인할 수 있습니다 .checkmixin

오토메이션

KCL은 주로 도구 및 다국어 API를 포함하여 많은 자동화 관련 기능을 제공합니다. 모드를 통해 package_identifier : key_identifierKCL은 구성된 모든 키 값의 인덱싱을 지원하므로 모든 키 값의 추가, 삭제, 수정 및 쿼리를 완료합니다. 예를 들어, 다음 그림은 다음 명령을 직접 실행하여 이미지를 수정할 수 있음을 보여줍니다. 수정 전후의 코드 차이도 그림(Image Auto Updater)에 표시됩니다.

또한 KCL의 자동화 기능을 구현하여 CI/CD에 통합할 수 있습니다.

-O|--overridesKCL을 사용하면 KCL CLI 매개변수 를 통해 구성 모델의 값을 직접 수정할 수 있습니다 . 매개변수는 세 부분(예: , pkg및 )을 identifier포함 합니다.attributeoverride_value

kcl main.k -O override_spec

override_spec: [[pkgpath] ":"] identifier ("=" value | "-")

  • identifier: 일반적으로 형식으로 구성을 수정해야 하는 식별자를 나타냅니다 a.b.c.
  • value: 수정해야 하는 구성의 값을 나타내며 숫자/문자열 리터럴 값, 목록/사전/스키마 표현식 등과 같은 모든 합법적인 KCL 표현식일 수 있습니다.
  • =: 식별자의 값을 수정하는 것을 의미합니다.
  • 식별자가 존재하면 기존 식별자의 값을 value로 수정합니다.
  • 식별자가 존재하지 않는 경우 식별자 속성을 추가하고 해당 값을 값으로 설정합니다.
  • -: 식별자 속성을 삭제한다는 의미입니다.
  • 식별자가 있으면 직접 삭제하십시오.
  • 식별자가 없으면 구성이 수정되지 않습니다.

게다가, 우리 OverrideFile는 동일한 기능을 달성하기 위해 API를 제공합니다. 자세한 내용은 KCL API 를 참조하십시오 .

예시

업데이트 샘플

KCL 코드:

schema Person:
    name: str
    age: int

person = Person {
    name = "Alice"
    age = 18
}

kcl main.k -O :person.name=\"Bob\" -O :person.age=10

person:
  name: Bob
  age: 10

kcl main.k -O :person.name=\"Bob\" -O :person.age=10 -d
schema Person:
    name: str
    age: int

person = Person {
    name = "Bob"
    age = 10
}

schema Person:
    name: str
    age: int
    ids?: [int]

person = Person {
    name = "Alice"
    age = 10
}

kcl main.k -O :person.ids=\[1,2\]

person:
  name: Alice
  age: 10
  ids:
  - 1
  - 2

KCL 코드:

schema Config:
    x?: int = 1
    y?: str = "s"
    
config = Config {
    x = 2
}

kcl main.k -O config.x-

config:
  x: 1
  y: s