LXD container

CONTAINER=u2004
 
# Create container
lxc launch ubuntu:20.04 ${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"
 
# 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:
          mode: pull
          alias: ubuntu/focal/cloud
          server: https://images.linuxcontainers.org
          type: image
          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
                    dns_nameservers:
                      - 10.88.2.74
                      - 10.88.2.174
                    dns_search:
                      - dev.example.com
        profiles: ["disk-zfs", "nic-dev-mgmt"]