kcli-plan-authoring
13
总安装量
13
周安装量
#24702
全站排名
安装命令
npx skills add https://github.com/karmab/kcli --skill kcli-plan-authoring
Agent 安装分布
gemini-cli
11
windsurf
11
antigravity
11
claude-code
11
trae
10
codex
10
Skill 文档
kcli Plan Authoring
Plan File Structure
Plans are YAML files with Jinja2 templating. Resources are defined as top-level keys with a type field.
parameters:
param1: value1
param2: value2
resourcename:
type: resourcetype
key1: value1
key2: {{ param1 }}
Resource Types
VM (default if no type specified)
myvm:
image: fedora40
memory: 4096
numcpus: 2
disks:
- size: 20
- size: 10
pool: otherpool
nets:
- name: default
- name: mynet
ip: 192.168.1.10
netmask: 255.255.255.0
gateway: 192.168.1.1
cmds:
- echo hello > /tmp/test
files:
- path: /etc/myconfig
content: |
key=value
Profile
myprofile:
type: profile
image: centos9stream
memory: 2048
numcpus: 2
disks:
- 10
nets:
- default
Network
mynetwork:
type: network
cidr: 192.168.100.0/24
dhcp: true
nat: true
domain: mylab.local
Image
myimage:
type: image
url: https://example.com/image.qcow2
pool: default
Container
mycontainer:
type: container
image: nginx:latest
ports:
- 8080:80
Jinja2 Templating
Parameter Substitution
parameters:
cluster_name: mycluster
worker_count: 3
{{ cluster_name }}-master:
image: rhcos
{% for i in range(worker_count) %}
{{ cluster_name }}-worker-{{ i }}:
image: rhcos
{% endfor %}
Conditionals
parameters:
enable_storage: true
myvm:
image: fedora40
{% if enable_storage %}
disks:
- size: 100
{% endif %}
Custom Filters
kcli provides custom Jinja2 filters in kvirt/jinjafilters/jinjafilters.py:
Path/File Filters:
basename– Get filename from pathdirname– Get directory from pathdiskpath– Convert to /dev/ path if neededexists– Check if file/path existspwd_path– Handle workdir paths in containersreal_path– Get real/absolute pathread_file– Read file contents
String/Data Filters:
none– Return empty string if Nonetype– Return type name (string, int, dict, list)base64– Base64 encode valuecertificate– Wrap in BEGIN/END CERTIFICATE if neededcount– Count occurrences of character
Kubernetes/Cluster Filters:
kubenodes– Generate node names for clusterdefaultnodes– Generate default node listhas_ctlplane– Check if list has ctlplane/master entries
Version/Release Filters:
github_version– Get latest version from GitHub releasesmin_ocp_version– Compare OpenShift versions (minimum)max_ocp_version– Compare OpenShift versions (maximum)
Network Filters:
local_ip– Get local IP for network interfacenetwork_ip– Get IP from network CIDRipv6_wrap– Wrap IPv6 addresses in brackets
Utility Filters:
kcli_info– Get VM info via kcli commandfind_manifests– Find YAML manifests in directorywait_crd– Generate wait script for CRD creationwait_csv– Generate wait script for CSV readinessfilter_bgp_peers– Filter BGP peer list
Standard Jinja2 filters (default, join, upper, lower, etc.) also work
Parameter Files
Create kcli_parameters.yml alongside your plan:
cluster_name: prod
worker_count: 5
memory: 8192
Override at runtime:
kcli create plan -f myplan.yml -P worker_count=10 myplan
Common VM Parameters
| Parameter | Default | Description |
|---|---|---|
numcpus |
2 | Number of CPUs |
memory |
512 | Memory in MB |
pool |
default | Storage pool |
image |
None | Base image name |
nets |
[default] | Network list |
disks |
[{size:10}] | Disk list |
cmds |
[] | Post-boot commands |
files |
[] | Files to inject |
keys |
[] | SSH public keys |
start |
true | Auto-start VM |
cloudinit |
true | Enable cloud-init |
Plan Execution
# Create plan
kcli create plan -f myplan.yml myplanname
# Create with parameter overrides
kcli create plan -f myplan.yml -P memory=4096 -P image=fedora40 myplanname
# List plans
kcli list plan
# Get plan info
kcli info plan myplanname
# Delete plan (and all its resources)
kcli delete plan myplanname
# Update existing plan
kcli update plan -f myplan.yml myplanname
Debugging Plans
- Validate YAML syntax – Use
python -c "import yaml; yaml.safe_load(open('plan.yml'))" - Check Jinja2 rendering – Look for unbalanced
{{}}or{% %} - Run with debug –
kcli -d create plan -f plan.yml test - Check dependencies – Ensure images/networks exist before VMs reference them
Example: Multi-VM Plan
parameters:
domain: lab.local
base_image: centos9stream
labnetwork:
type: network
cidr: 10.0.0.0/24
dhcp: true
domain: {{ domain }}
webserver:
image: {{ base_image }}
memory: 2048
nets:
- labnetwork
cmds:
- dnf -y install nginx
- systemctl enable --now nginx
database:
image: {{ base_image }}
memory: 4096
disks:
- size: 20
- size: 50
nets:
- labnetwork
cmds:
- dnf -y install postgresql-server
- postgresql-setup --initdb