Configuração e Automação na KCL

Jan 06 2023
Introdução Kusion Configuration Language (KCL) é um registro baseado em restrição de software livre e linguagem funcional. A KCL melhora a escrita de um grande número de configurações complexas por meio de tecnologia e prática de linguagem de programação madura e está comprometida em construir melhor modularidade, escalabilidade e estabilidade em torno da configuração, escrita lógica mais simples, automação rápida e boa extensão ecológica.

Introdução

Kusion Configuration Language (KCL) é um registro baseado em restrição de código aberto e linguagem funcional. A KCL melhora a escrita de um grande número de configurações complexas por meio de tecnologia e prática de linguagem de programação madura e está comprometida em construir melhor modularidade, escalabilidade e estabilidade em torno da configuração, escrita lógica mais simples, automação rápida e boa extensão ecológica.

Pré-requisito

Instale o KCL:

Cada versão do KCL inclui vários sistemas operacionais e arquiteturas. Essas versões binárias podem ser baixadas e instaladas manualmente no Github e adicionadas {install-location}/kclvm/binao ambiente PATH.

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

A melhor maneira de aprender um novo idioma é escrever alguns pequenos programas, e o mesmo vale para a configuração de idiomas. Podemos escrever programas KCL da mesma forma que escrevemos configurações.

Aqui está um simples hello.k:

hello = "KCL"

Como executar este programa depende do ambiente de desenvolvimento específico, primeiro assumimos que o sistema macOS ou Linux local instalou o kclcomando (ou insira o teste do ambiente Docker por docker run --rm -it kcl-lang/kusion bash) e, em seguida, execute o seguinte comando:

$ kcl hello.k
hello: KCL

A saída são dados de configuração no formato YAML. Embora este programa seja simples, podemos verificar o uso básico do ambiente de desenvolvimento e da kcllinha de comando executando o programa de configuração KCL na saída.

2. Configuração

Além dos pares chave-valor comuns, os dados de configuração comuns também têm dicionários aninhados e tipos de lista, e o tipo básico de valor inclui tipos booleanos e numéricos, além de strings. Aqui está uma server.kconfiguração um pouco mais complexa:

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

A saída YAML dessa configuração é a seguinte:

$ 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

A KCL fornece suporte abstrato para atributos com uma estrutura de atributo fixa e comportamento de valor padrão por meio da schemasintaxe.

Por exemplo, a configuração do databaseexemplo acima é geralmente o valor padrão. Podemos definir uma estrutura para a configuração padrão do banco de dados:

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}

Em seguida, passe database = DatabaseConfig {}para gerar uma estrutura com os mesmos atributos dos valores padrão. Também podemos modificar o valor padrão:

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

Além disso, schematambém pode combinar atributos opcionais check, mixinherança e módulos de extensão para obter configuração mais complexa e abstração de dados de política, detalhes podem ser encontrados aqui .

Automação

A KCL fornece muitos recursos relacionados à automação, incluindo principalmente ferramentas e APIs multilíngues. Por package_identifier : key_identifiermeio do modo, a KCL oferece suporte à indexação de qualquer valor de chave configurado, completando assim a adição, exclusão, modificação e consulta de qualquer valor de chave. Por exemplo, a figura a seguir mostra que podemos executar diretamente o seguinte comando para modificar a imagem. A diferença de código antes e depois da modificação também é mostrada na figura (Image Auto Updater).

Além disso, a capacidade de automação do KCL pode ser realizada e integrada ao CI/CD.

A KCL nos permite modificar diretamente os valores no modelo de configuração por meio do -O|--overridesparâmetro KCL CLI. O parâmetro contém três partes, por exemplo pkg, identifier, attributee override_value.

kcl main.k -O override_spec

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

  • identifier: Indica o identificador que precisa modificar a configuração, geralmente na forma de a.b.c.
  • value: Indica o valor da configuração que precisa ser modificada, que pode ser qualquer expressão legal da KCL, como valor literal de string/número, expressão de lista/dict/esquema, etc.
  • =: significa modificar o valor do identificador.
  • Quando o identificador existir, modifique o valor do identificador existente para value.
  • Quando o identificador não existir, adicione o atributo identificador e defina seu valor como valor.
  • -: significa excluir o atributo identificador.
  • Quando o identificador existir, exclua-o diretamente.
  • Quando o identificador não existe, nenhuma modificação é feita na configuração.

Além disso, fornecemos OverrideFileAPI para obter os mesmos recursos. Para obter detalhes, consulte APIs KCL .

Exemplos

Exemplo de atualização de substituição

Código 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

Código KCL:

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

kcl main.k -O config.x-

config:
  x: 1
  y: s