| name | kcli |
| description | Comprehensive guide for kcli usage. Use when creating VMs, deploying plans, managing clusters, or performing any kcli operations. Covers all common user workflows. |
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).
Remote Host Optimization
When the user asks to run a kcli command against a specific host that is not defined as a client in ~/.kcli/config.yml, run the command directly on that host via SSH instead of trying to use -C:
ssh root@myhost "kcli create vm -i centos9stream myvm"
ssh root@myhost "kcli list vm"
ssh root@myhost "kcli create plan -f plan.yml myplan"
This is both faster (libvirt calls stay local on the host) and avoids needing to add a client entry.
Important Behavior
- Always run commands directly. When the user asks to create/deploy/manage something, execute the command immediately — don't show it and wait for confirmation.
Quick Reference
kcli create vm -i <image> <name>
kcli list vm
kcli ssh <name>
kcli console <name>
kcli start/stop/restart vm <name>
kcli delete vm <name>
kcli create plan -f plan.yml <name>
kcli list plan
kcli delete plan <name>
kcli create kube <type> <name>
kcli list kube
kcli delete kube <name>
kcli list available-images
kcli download image <name>
kcli list image
kcli list network / pool / host
kcli create network -c <cidr> <name>
kcli create pool -p <path> <name>
Creating VMs
Basic VM Creation
kcli create vm -i fedora40 myvm
kcli create vm -c 3 myvm
kcli ssh
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
kcli create vm -i centos9stream \
-P nets=['{"name":"default","ip":"192.168.122.100"}'] \
myvm
kcli create vm -i fedora40 \
-P cmds=['dnf -y install nginx','systemctl enable --now nginx'] \
webserver
kcli create vm -p myprofile myvm
kcli create vm -i ubuntu2204 \
-P disks=['{"size":20}','{"size":100,"pool":"data"}'] \
myvm
VM Management
kcli list vm
kcli list vm -o yaml
kcli list vm -o json
kcli info vm myvm
kcli info vm myvm -f ip
kcli start vm myvm
kcli stop vm myvm
kcli restart vm myvm
kcli ssh myvm
kcli ssh -u root myvm
kcli console myvm
kcli console myvm --serial
kcli update vm myvm -P memory=8192
kcli update vm myvm -P numcpus=8
kcli create disk -s 50 myvm
kcli create snapshot myvm snap1
kcli list snapshot myvm
kcli revert snapshot myvm snap1
kcli delete snapshot myvm snap1
kcli delete vm myvm
kcli delete vm myvm --yes
Plans (Infrastructure as Code)
Plans are YAML files with Jinja2 templating for deploying complete environments.
Basic Plan Structure
parameters:
base_image: centos9stream
domain: lab.local
labnet:
type: network
cidr: 192.168.100.0/24
dhcp: true
webserver:
image: {{ base_image }}
memory: 2048
numcpus: 2
nets:
- labnet
cmds:
- dnf -y install nginx
- systemctl enable --now nginx
Plan Commands
kcli create plan -f myplan.yml myplan
kcli create plan -f myplan.yml -P base_image=fedora40 myplan
kcli list plan
kcli info plan myplan
kcli delete plan myplan
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
kcli create kube generic -P ctlplanes=1 -P workers=2 myk8s
kcli create kube k3s -P ctlplanes=1 -P workers=2 myk3s
kcli create kube openshift \
-P pull_secret=~/pull-secret.json \
-P ctlplanes=3 \
-P workers=2 \
myocp
Cluster Management
kcli list kube
kcli get kubeconfig mycluster
export KUBECONFIG=~/.kcli/clusters/mycluster/kubeconfig
kcli scale kube generic -P workers=5 mycluster
kcli delete kube mycluster
Images
kcli list available-images
kcli download image fedora40
kcli download image centos9stream
kcli download image ubuntu2204
kcli list image
kcli delete image fedora40
Common images: fedora40, centos9stream, ubuntu2204, rhel9, debian12, rocky9, almalinux9
Networks and Storage
Networks
kcli create network -c 192.168.100.0/24 mynet
kcli create network -c 10.0.0.0/24 --dhcp --nat privatenet
kcli list network
kcli info network mynet
kcli delete network mynet
Storage Pools
kcli create pool -p /var/lib/libvirt/images default
kcli create pool -p /home/vms myvms
kcli list pool
kcli delete pool myvms
Provider/Client Management
kcli list client
kcli switch mykvm
kcli -C aws list vm
kcli -C gcp create vm -i ubuntu2204 myvm
kcli -C all list vm
kcli info host
kcli list host
Profiles
Profiles are reusable VM templates defined in ~/.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
kcli -d create vm -i fedora40 myvm
kcli -d list vm
kcli info vm myvm
kcli ssh myvm
cat /var/log/cloud-init.log
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
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:
alias kcli='podman run --rm -it \
-v ~/.kcli:/root/.kcli:z \
-v /var/run/libvirt:/var/run/libvirt:z \
quay.io/karmab/kcli'
kcli list vm
Useful Tips
-
Last VM shortcut: Many commands work without VM name (uses last created)
kcli ssh
kcli console
-
Output formats: Most list commands support -o yaml or -o json
-
Parameter files: Use kcli_parameters.yml alongside plans for defaults
-
Render plans: Preview templated plans before deploying
kcli render -f myplan.yml
-
Export VMs: Create images from running VMs
kcli export vm myvm