Create Ubuntu minimal image container
lxc remote add --protocol simplestreams ubuntu-minimal https://cloud-images.ubuntu.com/minimal/releases/ lxc launch ubuntu-minimal:lts ults lxc launch ubuntu-minimal:jammy u2204m # lxc exec u2004m -- apt install -y dnsutils vim inetutils-ping
#!/bin/bash if [ $# -lt 1 ]; then echo "Usage $0 <CONTAINER_NAME>" exit 1 else CONTAINER=$1 fi OS_VERSION=${2-lts} # create container lxc launch ubuntu:${OS_VERSION} ${CONTAINER} sleep 10 # deploy SSH key lxc file push --uid 0 --gid 0 --mode 600 ~/.ssh/id_rsa.pub ${CONTAINER}/root/.ssh/authorized_keys # configure http(s) proxy inside of container (if set on host) [ -z ${http_proxy} ] || echo "export http_proxy=$http_proxy" | lxc shell ${CONTAINER} -- tee -a /etc/environment [ -z ${https_proxy} ] || echo "export https_proxy=$https_proxy" | lxc shell ${CONTAINER} -- tee -a /etc/environment # update APT repository lxc exec ${CONTAINER} -- bash -c ". /etc/environment && apt update -qq && apt -qqq -y dist-upgrade" # Optional: install applications #lxc exec ${CONTAINER} -- bash -c ". /etc/environment && apt install -y haproxy"
Create default container
# launch from image lxc launch images:grafana-usage-dev grafana-usage-dev -p storage-zfs -p nic-mgmt-dev -p nic-mgmt-stage -c boot.autostart=true CONTAINER_NAME=www1-dev lxc launch ubuntu:20.04 ${CONTAINER_NAME} -c boot.autostart=true -p disk-zfs -p nic-dev-mgmt # -c security.privileged=true # lxc exec ${CONTAINER_NAME} -- rm /etc/netplan/50-cloud-init.yaml # lxc exec ${CONTAINER_NAME} -- bash -c "cat <<EOF> /etc/netplan/dev-mgmt.yaml # network: # version: 2 # ethernets: # dev-mgmt: # dhcp4: no # addresses: [10.33.0.131/24] # gateway4: 10.33.0.1 # routes: # - to: 10.33.0.0/16 # via: 10.33.0.1 # nameservers: # addresses: [10.0.0.111, 10.0.2.222] # search: [dev.example.com] # EOF # " lxc file push /root/.ssh/authorized_keys ${CONTAINER_NAME}/root/.ssh/authorized_keys lxc exec ${CONTAINER_NAME} -- apt update lxc exec ${CONTAINER_NAME} -- apt dist-upgrade -y lxc exec ${CONTAINER_NAME} -- apt purge -y lxd lxd-client unattended-upgrades packagekit linux-image-unsigned-5.6.0-1026-oem lxc exec ${CONTAINER_NAME} -- systemctl disable snapd.service && umount /snap && apt purge -y snapd lxc exec ${CONTAINER_NAME} -- apt autoremove -y lxc exec ${CONTAINER_NAME} -- apt clean lxc exec ${CONTAINER_NAME} -- locale-gen en_US.UTF-8
Create container with Ansible
- name: Create container hosts: lxd.example.com tasks: - name: Create LXD container lxd_container: name: www1-dev source: type: image mode: pull server: https://cloud-images.ubuntu.com/minimal/releases # server: https://images.linuxcontainers.org alias: "lts" # alias: ubuntu/focal/cloud protocol: simplestreams config: limits.cpu: "2" boot.autostart: "true" volatile.eth0.hwaddr: "00:16:3e:aa:bb:cc" user.user-data: | #cloud-config locale: en_US.UTF-8 timezone: Europe/Berlin apt: sources_list: | deb [arch=amd64] http://mirror.example.com/current/ubuntu $RELEASE main restricted universe multiverse deb [arch=amd64] http://mirror.example.com/current/ubuntu $RELEASE-updates main restricted universe multiverse deb [arch=amd64] http://mirror.example.com/current/ubuntu $RELEASE-security main restricted universe multiverse deb [arch=amd64] http://mirror.example.com/current/ubuntu $RELEASE-backports main restricted universe multiverse apt_upgrade: true package_upgrade: true packages: - openssh-server disable_root: false ssh_authorized_keys: - "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" user.network-config: | version: 1 config: - type: physical name: dev-mgmt subnets: - type: static address: 10.3.161.44/20 gateway: 10.3.160.1 routes: - gateway: 10.4.16.1 network: 10.4.0.0/16 dns_nameservers: - 10.88.2.74 - 10.88.2.174 dns_search: - dev.example.com profiles: ["disk-zfs", "nic-dev-mgmt"]