Skip to content

Linux Templates

This section demonstrates Linux-based virtual machine templates and configurations using Kraken manifests. These examples show how to create, configure, and deploy Linux VMs for various use cases.

Overview

Linux templates in Kraken provide:

  • Base images for rapid VM deployment
  • Template VMs in shutoff state for cloning
  • Cloud-init integration for automated setup
  • Package management and service configuration
  • Multi-distribution support (Ubuntu, CentOS, Fedora)

Linux Template VM

This example creates a Linux template VM that can be cloned for production use.

Template Configuration

linux-template.yaml
type: Application
version: "1.0.0"
metadata:
  name: "linux-template"
  labels:
    - "type:template"
    - "os:linux"
    - "distro:fedora"
spec:
  assets:
    - name: "fedora-base"
      type: "virtual_disk"
      format: "raw"
      url: "https://storage.googleapis.com/demo-bucket/fedora-base.img"

  resources:
    - type: "virdomain"
      name: "linux-template"
      spec:
        description: "Fedora-based Linux template for cloning"
        cpu: 2
        memory: "4294967296"  # 4 GB
        machine_type: "uefi"

        storage_devices:
          - name: "template-disk"
            type: "virtio_disk"
            source: "fedora-base"
            boot: 1
            capacity: 53687091200  # 50 GB

        network_devices:
          - name: "eth0"
            type: "virtio"

        tags:
          - "template"
          - "linux"
          - "fedora"

        state: "shutoff"  # Template state for cloning

Key Features

  • Template State: shutoff state makes it ready for cloning
  • UEFI Boot: Modern boot system for Linux
  • VirtIO Devices: High-performance storage and network
  • Fedora Base: Enterprise-ready Linux distribution
  • 50GB Storage: Adequate space for OS and applications

Ubuntu Server

Production-ready Ubuntu server configuration with cloud-init.

Ubuntu Server Manifest

ubuntu-server.yaml
type: Application
version: "1.0.0"
metadata:
  name: "ubuntu-server-{{ instance_id }}"
  labels:
    - "os:ubuntu"
    - "environment:{{ environment }}"
spec:
  assets:
    - name: "ubuntu-server"
      type: "virtual_disk"
      format: "raw"
      url: "https://cloud-images.ubuntu.com/releases/22.04/release/ubuntu-22.04-server-cloudimg-amd64.img"

  resources:
    - type: "virdomain"
      name: "ubuntu-server-{{ instance_id }}"
      spec:
        description: "Ubuntu 22.04 LTS server"
        cpu: 2
        memory: "4294967296"  # 4 GB
        machine_type: "uefi"

        storage_devices:
          - name: "root-disk"
            type: "virtio_disk"
            source: "ubuntu-server"
            boot: 1
            capacity: 42949672960  # 40 GB

        network_devices:
          - name: "eth0"
            type: "virtio"

        tags:
          - "ubuntu"
          - "server"
          - "production"

        state: "running"

        cloud_init_data:
          user_data: |
            #cloud-config
            package_update: true
            package_upgrade: true

            packages:
              - htop
              - curl
              - wget
              - git
              - unzip
              - software-properties-common
              - apt-transport-https
              - ca-certificates
              - gnupg
              - lsb-release

            # Create admin user
            users:
              - name: admin
                primary_group: admin
                shell: /bin/bash
                sudo: ALL=(ALL) NOPASSWD:ALL
                groups: sudo, adm
                lock_passwd: false
                ssh_authorized_keys:
                  - ssh-rsa AAAAB3NzaC1yc2E... # Add your SSH key

            # Basic security setup
            runcmd:
              - ufw --force enable
              - ufw default deny incoming
              - ufw default allow outgoing
              - ufw allow ssh
              - systemctl enable ssh
              - systemctl start ssh

          meta_data: |
            instance-id: ubuntu-server-{{ instance_id }}
            local-hostname: ubuntu-server-{{ instance_id }}

CentOS Stream

Enterprise Linux configuration with Red Hat ecosystem tools.

CentOS Stream Manifest

centos-stream.yaml
type: Application
version: "1.0.0"
metadata:
  name: "centos-stream-{{ instance_id }}"
  labels:
    - "os:centos"
    - "type:enterprise"
spec:
  assets:
    - name: "centos-stream"
      type: "virtual_disk"
      format: "qcow2"
      url: "https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2"

  resources:
    - type: "virdomain"
      name: "centos-stream-{{ instance_id }}"
      spec:
        description: "CentOS Stream 9 enterprise server"
        cpu: 4
        memory: "8589934592"  # 8 GB
        machine_type: "uefi"

        storage_devices:
          - name: "root-disk"
            type: "virtio_disk"
            source: "centos-stream"
            boot: 1
            capacity: 85899345920  # 80 GB

        network_devices:
          - name: "eth0"
            type: "virtio"

        tags:
          - "centos"
          - "enterprise"
          - "rhel-ecosystem"

        state: "running"

        cloud_init_data:
          user_data: |
            #cloud-config
            package_update: true

            packages:
              - epel-release
              - htop
              - curl
              - wget
              - git
              - vim
              - bind-utils
              - net-tools
              - firewalld

            # Configure firewall
            runcmd:
              - systemctl enable firewalld
              - systemctl start firewalld
              - firewall-cmd --permanent --add-service=ssh
              - firewall-cmd --reload

              # SELinux configuration
              - setsebool -P httpd_can_network_connect on
              - semanage fcontext -a -t httpd_exec_t "/var/www/html(/.*)?"
              - restorecon -R /var/www/html

          meta_data: |
            instance-id: centos-stream-{{ instance_id }}
            local-hostname: centos-stream-{{ instance_id }}

Development Environment

Linux development environment with common tools and IDEs.

Development VM Manifest

dev-environment.yaml
type: Application
version: "1.0.0"
metadata:
  name: "dev-environment-{{ developer_id }}"
  labels:
    - "purpose:development"
    - "team:engineering"
spec:
  assets:
    - name: "ubuntu-dev"
      type: "virtual_disk"
      format: "raw"
      url: "https://storage.googleapis.com/demo-bucket/ubuntu-22.04-dev.img"

  resources:
    - type: "virdomain"
      name: "dev-env-{{ developer_id }}"
      spec:
        description: "Linux development environment"
        cpu: 4
        memory: "8589934592"  # 8 GB
        machine_type: "uefi"

        storage_devices:
          - name: "system-disk"
            type: "virtio_disk"
            source: "ubuntu-dev"
            boot: 1
            capacity: 107374182400  # 100 GB
          - name: "projects-disk"
            type: "virtio_disk"
            capacity: 214748364800  # 200 GB

        network_devices:
          - name: "eth0"
            type: "virtio"

        tags:
          - "development"
          - "engineering"
          - "ide"

        state: "running"

        cloud_init_data:
          user_data: |
            #cloud-config
            package_update: true

            packages:
              # Development tools
              - build-essential
              - cmake
              - git
              - curl
              - wget
              - vim
              - nano
              - htop
              - tree
              - jq

              # Programming languages
              - python3
              - python3-pip
              - python3-venv
              - nodejs
              - npm
              - default-jdk

              # Container tools
              - docker.io
              - docker-compose

              # IDE and editors
              - code
              - vim
              - emacs

            # Create developer user
            users:
              - name: developer
                primary_group: developer
                shell: /bin/bash
                sudo: ALL=(ALL) NOPASSWD:ALL
                groups: sudo, docker, adm
                lock_passwd: false

            # Setup development directories
            runcmd:
              - mkdir -p /home/developer/projects
              - mkdir -p /home/developer/workspace
              - chown -R developer:developer /home/developer

              # Mount projects disk
              - mkfs.ext4 /dev/vdb
              - mount /dev/vdb /home/developer/projects
              - echo "/dev/vdb /home/developer/projects ext4 defaults 0 0" >> /etc/fstab

              # Docker setup
              - systemctl enable docker
              - systemctl start docker
              - usermod -aG docker developer

              # Install additional tools
              - snap install code --classic
              - snap install postman

          meta_data: |
            instance-id: dev-env-{{ developer_id }}
            local-hostname: dev-env-{{ developer_id }}

Common Linux Patterns

Package Management

# Ubuntu/Debian
packages:
  - apt-transport-https
  - software-properties-common
  - ca-certificates

# CentOS/RHEL
packages:
  - epel-release
  - yum-utils
  - device-mapper-persistent-data

User Management

users:
  - name: serviceuser
    system: true
    shell: /bin/false
    home: /var/lib/serviceuser
    create_home: true

  - name: developer
    groups: sudo, docker
    ssh_authorized_keys:
      - ssh-rsa AAAAB3NzaC1yc2E...

Service Configuration

runcmd:
  - systemctl enable myservice
  - systemctl start myservice
  - systemctl status myservice

  # Firewall rules
  - ufw allow 8080/tcp
  - firewall-cmd --permanent --add-port=8080/tcp

Storage Setup

# Format and mount additional storage
runcmd:
  - mkfs.ext4 /dev/vdb
  - mkdir -p /data
  - mount /dev/vdb /data
  - echo "/dev/vdb /data ext4 defaults 0 0" >> /etc/fstab

Best Practices

1. Template Management

  • Use shutoff state for template VMs
  • Minimize template size for faster cloning
  • Include essential packages only
  • Document template contents

2. Security Configuration

# Security hardening
runcmd:
  - ufw --force enable
  - fail2ban-server start
  - chmod 700 /home/user/.ssh
  - chmod 600 /home/user/.ssh/authorized_keys

3. Resource Optimization

# Appropriate sizing
cpu: 2              # For web servers
memory: "4294967296"  # 4GB for moderate workloads
capacity: 42949672960 # 40GB for OS + applications

4. Cloud-Init Best Practices

  • Test cloud-init configurations before deployment
  • Use package managers for software installation
  • Handle errors gracefully with proper scripting
  • Log activities for troubleshooting

Troubleshooting

Common Issues

  1. Boot failures: Check UEFI vs BIOS settings
  2. Package installation failures: Verify repository access
  3. SSH access issues: Check firewall and SSH key configuration
  4. Storage mounting failures: Validate disk device paths

Debug Commands

# Check cloud-init status
sudo cloud-init status

# View initialization logs
sudo cat /var/log/cloud-init-output.log

# Check system services
sudo systemctl status

Next Steps

  1. Customize templates for your specific needs
  2. Add monitoring and logging configuration
  3. Implement backup strategies
  4. Scale to multi-VM deployments