Configuração e Automação na KCL
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/bin
ao 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 kcl
comando (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 kcl
linha 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.k
configuraçã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 schema
sintaxe.
Por exemplo, a configuração do database
exemplo 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, schema
também pode combinar atributos opcionais check
, mixin
heranç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_identifier
meio 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|--overrides
parâmetro KCL CLI. O parâmetro contém três partes, por exemplo pkg
, identifier
, attribute
e 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 dea.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 OverrideFile
API 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