Konfigurasi & Otomasi di KCL

Jan 07 2023
Pengantar Kusion Configuration Language (KCL) adalah catatan berbasis kendala open source dan bahasa fungsional. KCL meningkatkan penulisan sejumlah besar konfigurasi kompleks melalui teknologi dan praktik bahasa pemrograman yang matang, dan berkomitmen untuk membangun modularitas, skalabilitas, dan stabilitas yang lebih baik di sekitar konfigurasi, penulisan logika yang lebih sederhana, otomatisasi cepat, dan ekstensionalitas ekologis yang baik.

pengantar

Kusion Configuration Language (KCL) adalah catatan berbasis kendala open source dan bahasa fungsional. KCL meningkatkan penulisan sejumlah besar konfigurasi kompleks melalui teknologi dan praktik bahasa pemrograman yang matang, dan berkomitmen untuk membangun modularitas, skalabilitas, dan stabilitas yang lebih baik di sekitar konfigurasi, penulisan logika yang lebih sederhana, otomatisasi cepat, dan ekstensionalitas ekologis yang baik.

Prasyarat

Instal KCL:

Setiap rilis KCL mencakup berbagai OS dan arsitektur. Versi biner ini dapat diunduh dan diinstal secara manual dari Github dan ditambahkan {install-location}/kclvm/binke lingkungan PATH.

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

Cara terbaik untuk mempelajari bahasa baru adalah dengan menulis beberapa program kecil, dan hal yang sama berlaku untuk mengonfigurasi bahasa. Kita dapat menulis program KCL seperti halnya menulis konfigurasi.

Ini sederhana hello.k:

hello = "KCL"

Cara menjalankan program ini tergantung pada lingkungan pengembangan tertentu, pertama-tama kita asumsikan bahwa sistem macOS atau Linux lokal telah menginstal kclperintah (atau masukkan tes lingkungan Docker dengan docker run --rm -it kcl-lang/kusion bash) dan kemudian jalankan perintah berikut:

$ kcl hello.k
hello: KCL

Outputnya adalah data konfigurasi dalam format YAML. Meskipun program ini sederhana, kami dapat memverifikasi penggunaan dasar lingkungan pengembangan dan kclbaris perintah dengan mengeksekusi program konfigurasi KCL ke output.

2. Konfigurasi

Selain pasangan kunci-nilai umum, data konfigurasi umum juga memiliki tipe kamus dan daftar bersarang, dan tipe dasar nilai mencakup tipe boolean dan numerik selain string. server.kBerikut konfigurasi yang sedikit lebih rumit :

# 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"}
]

Keluaran YAML dari konfigurasi ini adalah sebagai berikut:

$ 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

KCL memberikan dukungan abstrak untuk atribut dengan struktur atribut tetap dan perilaku nilai default melalui schemasintaks.

Misalnya, konfigurasi databasepada contoh di atas umumnya merupakan nilai default. Kita dapat mendefinisikan struktur untuk konfigurasi default 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}

Kemudian lulus database = DatabaseConfig {}untuk menghasilkan struktur dengan atribut yang sama dengan nilai default. Kami juga dapat mengubah nilai default:

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"}
]

Selain itu, schemajuga dapat menggabungkan check, mixin, atribut opsional, pewarisan dan modul ekstensi untuk mencapai konfigurasi yang lebih kompleks dan abstraksi data kebijakan, detailnya dapat ditemukan di sini .

Otomatisasi

KCL menyediakan banyak kemampuan terkait otomasi, terutama termasuk alat dan API multibahasa. Melalui package_identifier : key_identifiermode, KCL mendukung pengindeksan nilai kunci apa pun yang dikonfigurasi, sehingga menyelesaikan penambahan, penghapusan, modifikasi, dan kueri nilai kunci apa pun. Sebagai contoh, gambar berikut menunjukkan bahwa kita dapat langsung menjalankan perintah berikut untuk memodifikasi gambar. Perbedaan kode sebelum dan sesudah modifikasi juga ditunjukkan pada gambar (Image Auto Updater).

Selain itu, kemampuan otomatisasi KCL dapat direalisasikan dan diintegrasikan ke dalam CI/CD.

KCL memungkinkan kita untuk langsung memodifikasi nilai-nilai dalam model konfigurasi melalui -O|--overridesparameter KCL CLI. Parameter berisi tiga bagian misalnya, pkg, identifier, attributedan override_value.

kcl main.k -O override_spec

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

  • identifier: Menunjukkan pengenal yang perlu diubah konfigurasinya, biasanya dalam bentuk a.b.c.
  • value: Menunjukkan nilai konfigurasi yang perlu diubah, yang dapat berupa ekspresi KCL legal apa pun, seperti nilai literal angka/string, ekspresi daftar/dikt/skema, dll.
  • =: berarti mengubah nilai pengenal.
  • Saat pengenal ada, ubah nilai pengenal yang ada menjadi nilai.
  • Ketika pengenal tidak ada, tambahkan atribut pengenal dan tetapkan nilainya menjadi nilai.
  • -: berarti menghapus atribut pengidentifikasi.
  • Ketika pengidentifikasi ada, hapus secara langsung.
  • Ketika pengidentifikasi tidak ada, tidak ada modifikasi yang dilakukan pada konfigurasi.

Selain itu, kami menyediakan OverrideFileAPI untuk mencapai kemampuan yang sama. Untuk mengetahui detailnya, lihat KCL API .

Contoh

Timpa Contoh

Kode 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

Kode KCL:

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

kcl main.k -O config.x-

config:
  x: 1
  y: s