kcli User Guide
kcli is a unified CLI for managing virtual infrastructure across multiple providers (Libvirt/KVM, AWS, GCP, Azure, vSphere, KubeVirt, OpenStack, oVirt, Proxmox, Hetzner, IBM Cloud).
Quick Reference
# VM Operations kcli create vm -i <image> <name> # Create VM kcli list vm # List VMs kcli ssh <name> # SSH into VM kcli console <name> # Graphical console kcli start/stop/restart vm <name> # Control VM state kcli delete vm <name> # Delete VM # Plans (Infrastructure as Code) kcli create plan -f plan.yml <name> # Deploy plan kcli list plan # List plans kcli delete plan <name> # Delete plan and resources # Kubernetes Clusters kcli create kube <type> <name> # Deploy cluster kcli list kube # List clusters kcli delete kube <name> # Delete cluster # Images kcli list available-images # Show downloadable images kcli download image <name> # Download cloud image kcli list image # List local images # Infrastructure kcli list network / pool / host # List resources kcli create network -c <cidr> <name> # Create network kcli create pool -p <path> <name> # Create storage pool
Creating VMs
Basic VM Creation
# From cloud image (downloads if needed) kcli create vm -i fedora40 myvm # Shorthand (kcli remembers last VM) kcli ssh # SSH to last created VM
With Custom Resources
kcli create vm -i centos9stream \ -P memory=4096 \ -P numcpus=4 \ -P disks=[20,50] \ myvm
Common VM Parameters
| Parameter | Default | Description |
|---|---|---|
numcpus | 2 | Number of CPUs |
memory | 512 | Memory in MB |
disks | [10] | Disk sizes in GB |
nets | [default] | Networks to attach |
pool | default | Storage pool |
cloudinit | true | Enable cloud-init |
start | true | Start VM after creation |
keys | [] | SSH public keys to inject |
cmds | [] | Commands to run at boot |
files | [] | Files to inject |
Advanced VM Examples
# With static IP
kcli create vm -i centos9stream \
-P nets=['{"name":"default","ip":"192.168.122.100"}'] \
myvm
# With post-boot commands
kcli create vm -i fedora40 \
-P cmds=['dnf -y install nginx','systemctl enable --now nginx'] \
webserver
# From profile
kcli create vm -p myprofile myvm
# Multiple disks with options
kcli create vm -i ubuntu2204 \
-P disks=['{"size":20}','{"size":100,"pool":"data"}'] \
myvm
VM Management
# List VMs kcli list vm # Table format kcli list vm -o yaml # YAML output kcli list vm -o json # JSON output # VM Information kcli info vm myvm # Full details kcli info vm myvm -f ip # Just IP address # State Control kcli start vm myvm kcli stop vm myvm kcli restart vm myvm # Access kcli ssh myvm # SSH as default user kcli ssh -u root myvm # SSH as root kcli console myvm # VNC/SPICE console kcli console myvm --serial # Serial console # Modify kcli update vm myvm -P memory=8192 # Change memory kcli update vm myvm -P numcpus=8 # Change CPUs kcli create disk -s 50 myvm # Add 50GB disk # Snapshots kcli create snapshot myvm snap1 kcli list snapshot myvm kcli revert snapshot myvm snap1 kcli delete snapshot myvm snap1 # Delete kcli delete vm myvm # With confirmation kcli delete vm myvm --yes # Skip confirmation
Plans (Infrastructure as Code)
Plans are YAML files with Jinja2 templating for deploying complete environments.
Basic Plan Structure
# myplan.yml
parameters:
base_image: centos9stream
domain: lab.local
# Network (created first)
labnet:
type: network
cidr: 192.168.100.0/24
dhcp: true
# VM (uses the network)
webserver:
image: {{ base_image }}
memory: 2048
numcpus: 2
nets:
- labnet
cmds:
- dnf -y install nginx
- systemctl enable --now nginx
Plan Commands
# Deploy kcli create plan -f myplan.yml myplan # Deploy with parameter overrides kcli create plan -f myplan.yml -P base_image=fedora40 myplan # List and manage kcli list plan kcli info plan myplan kcli delete plan myplan # Deletes all resources # Update existing plan kcli update plan -f myplan.yml myplan
Multi-VM Plan with Loop
parameters:
cluster_name: web
node_count: 3
{% for i in range(node_count) %}
{{ cluster_name }}-node-{{ i }}:
image: centos9stream
memory: 2048
nets:
- default
{% endfor %}
Resource Types in Plans
| Type | Description |
|---|---|
| (none) | VM (default if no type specified) |
network | Virtual network |
pool | Storage pool |
image | Download image from URL |
profile | Reusable VM template |
container | Container workload |
kube | Kubernetes cluster |
Kubernetes Clusters
Supported Types
- •
generic/kubeadm- Standard Kubernetes - •
openshift/okd- OpenShift - •
k3s- Lightweight K3s - •
rke2- Rancher RKE2 - •
microshift- Edge MicroShift - •
hypershift- Hosted control planes - •
aks/eks/gke- Cloud managed
Deploy Clusters
# Generic Kubernetes kcli create kube generic -P ctlplanes=1 -P workers=2 myk8s # K3s (lightweight) kcli create kube k3s -P ctlplanes=1 -P workers=2 myk3s # OpenShift (requires pull secret) kcli create kube openshift \ -P pull_secret=~/pull-secret.json \ -P ctlplanes=3 \ -P workers=2 \ myocp
Cluster Management
# List clusters kcli list kube # Get kubeconfig kcli get kubeconfig mycluster export KUBECONFIG=~/.kcli/clusters/mycluster/kubeconfig # Scale workers kcli scale kube generic -P workers=5 mycluster # Delete kcli delete kube mycluster
Images
# List available cloud images kcli list available-images # Download image kcli download image fedora40 kcli download image centos9stream kcli download image ubuntu2204 # List downloaded images kcli list image # Delete image kcli delete image fedora40
Common images: fedora40, centos9stream, ubuntu2204, rhel9, debian12, rocky9, almalinux9
Networks and Storage
Networks
# Create network kcli create network -c 192.168.100.0/24 mynet kcli create network -c 10.0.0.0/24 --dhcp --nat privatenet # List and delete kcli list network kcli info network mynet kcli delete network mynet
Storage Pools
# Create pool kcli create pool -p /var/lib/libvirt/images default kcli create pool -p /home/vms myvms # List and delete kcli list pool kcli delete pool myvms
Provider/Client Management
# List configured clients kcli list client # Switch default client kcli switch mykvm # Use specific client for command kcli -C aws list vm kcli -C gcp create vm -i ubuntu2204 myvm # List VMs from all clients kcli -C all list vm # Host information kcli info host kcli list host
Profiles
Profiles are reusable VM templates defined in ~/.kcli/profiles.yml:
# ~/.kcli/profiles.yml
small:
numcpus: 1
memory: 1024
disks:
- 10
webserver:
image: centos9stream
numcpus: 2
memory: 4096
cmds:
- dnf -y install nginx
- systemctl enable --now nginx
Usage:
kcli create vm -p webserver myweb
Debug and Troubleshooting
# Debug mode (verbose output) kcli -d create vm -i fedora40 myvm kcli -d list vm # Check VM details kcli info vm myvm # Check cloud-init logs (after SSH) kcli ssh myvm cat /var/log/cloud-init.log # Verify provider connectivity kcli list host kcli info host
Common Issues
No IP address: Check DHCP on network, wait for cloud-init
kcli info network default
SSH fails: Verify key injection worked
kcli ssh -l myvm # Show SSH command
Permission denied (libvirt): Add user to groups
sudo usermod -aG qemu,libvirt $(id -un) newgrp libvirt
Configuration Files
~/.kcli/ ├── config.yml # Client/provider configuration ├── profiles.yml # VM profiles ├── id_rsa # SSH private key (auto-used) └── clusters/ # Cluster state files
Minimal config.yml
default: client: local local: type: kvm host: 127.0.0.1 pool: default
Container Mode
Run kcli without installation:
# With libvirt socket alias kcli='podman run --rm -it \ -v ~/.kcli:/root/.kcli:z \ -v /var/run/libvirt:/var/run/libvirt:z \ quay.io/karmab/kcli' # Then use normally kcli list vm
Useful Tips
- •
Last VM shortcut: Many commands work without VM name (uses last created)
bashkcli ssh # SSH to last VM kcli console # Console of last VM
- •
Output formats: Most list commands support
-o yamlor-o json - •
Parameter files: Use
kcli_parameters.ymlalongside plans for defaults - •
Render plans: Preview templated plans before deploying
bashkcli render -f myplan.yml
- •
Export VMs: Create images from running VMs
bashkcli export vm myvm