]> WPIA git - infra.git/commitdiff
Merge "add: information to rewrite url on gigi pages to external URL"
authorFelix Dörre <felix@dogcraft.de>
Thu, 24 Sep 2020 20:16:05 +0000 (20:16 +0000)
committerGerrit Code Review <gigi-system@dogcraft.de>
Thu, 24 Sep 2020 20:16:05 +0000 (20:16 +0000)
manager/init-vm
packer/.gitignore [new file with mode: 0644]
packer/README.md [new file with mode: 0644]
packer/debian-9/http/preseed.cfg [new file with mode: 0644]
packer/debian-9/packer.json [new file with mode: 0644]
packer/debian-9/scripts/00-install-packages.sh [new file with mode: 0755]
packer/debian-9/scripts/01-configure-cloudinit.sh [new file with mode: 0755]
packer/debian-9/scripts/02-enable-services.sh [new file with mode: 0755]
packer/debian-9/scripts/99-cleanup.sh [new file with mode: 0755]

index c31611e7a74497d92dd845ca185ed0fa1804b5b3..72c7437f4fd4e0d7f5f508c1aff77e4061a63a23 100644 (file)
@@ -11,7 +11,7 @@ ssh -t -i vm-key $to "sudo -e /etc/ssh/sshd_config && sudo systemctl reload ssh"
 # ci-speedup
 read -rp 'We are done. Continue with additional setup to speed up CI builds? [y/N] ' prompt
 if [[ $prompt == "y" ]]; then
-    ssh -i vm-key $to 'sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get install -y git emacs-nox tmux curl puppet puppet-master lxc'
+    ssh -i vm-key $to 'sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get install -y git emacs-nox tmux curl puppet puppet-master lxc dbus rsync debootstrap'
     ssh -i vm-key $to 'sudo lxc-create -n base-image -t debian -- -r stretch --packages=gnupg2,puppet,lsb-release,debconf-utils'
     ssh -i vm-key $to 'sudo rm -r /var/lib/lxc/base-image/rootfs/var/lib/apt/lists'
 fi
diff --git a/packer/.gitignore b/packer/.gitignore
new file mode 100644 (file)
index 0000000..7ac2170
--- /dev/null
@@ -0,0 +1,4 @@
+output/
+packer_cache/
+
+packer-manifest.json
diff --git a/packer/README.md b/packer/README.md
new file mode 100644 (file)
index 0000000..940ccde
--- /dev/null
@@ -0,0 +1,32 @@
+# infra/packer
+
+## Description
+
+Packer provide an minimal Debian image which can be used to install the
+required puppet modules. The image provided should be used for continues
+integration and development.
+
+At the moment it only builds with and for QEMU.
+
+## Requirements
+
+- [Bash](https://www.gnu.org/software/bash)
+- [Packer](https://packer.io)
+- [QEMU](https://www.qemu.org)
+
+## Building
+
+Verify which Debian version you would like to use.
+
+``` sh
+$ cd debian-${DEBIAN_VERSION}
+$ packer build packer.json
+```
+
+## Login
+
+Default username and password is generated and should be changed if it's
+not used for development.
+
+- username: `wpia`
+- password: `wpia`
diff --git a/packer/debian-9/http/preseed.cfg b/packer/debian-9/http/preseed.cfg
new file mode 100644 (file)
index 0000000..22b76b9
--- /dev/null
@@ -0,0 +1,388 @@
+d-i partman/early_command \
+       string debconf-set partman-auto/disk "$(list-devices disk | head -n1)"
+
+#### Contents of the preconfiguration file (for stretch)
+### Localization
+# Preseeding only locale sets language, country and locale.
+d-i debian-installer/locale string en_US.UTF-8
+
+# The values can also be preseeded individually for greater flexibility.
+#d-i debian-installer/language string en
+#d-i debian-installer/country string NL
+#d-i debian-installer/locale string en_GB.UTF-8
+# Optionally specify additional locales to be generated.
+d-i localechooser/supported-locales multiselect en_US.UTF-8, de_DE.UTF-8
+
+# Keyboard selection.
+d-i keyboard-configuration/xkb-keymap select us
+# d-i keyboard-configuration/toggle select No toggling
+
+### Network configuration
+# Disable network configuration entirely. This is useful for cdrom
+# installations on non-networked devices where the network questions,
+# warning and long timeouts are a nuisance.
+#d-i netcfg/enable boolean false
+
+# netcfg will choose an interface that has link if possible. This makes it
+# skip displaying a list if there is more than one interface.
+d-i netcfg/choose_interface select auto
+
+# To pick a particular interface instead:
+#d-i netcfg/choose_interface select eth1
+
+# To set a different link detection timeout (default is 3 seconds).
+# Values are interpreted as seconds.
+#d-i netcfg/link_wait_timeout string 10
+
+# If you have a slow dhcp server and the installer times out waiting for
+# it, this might be useful.
+#d-i netcfg/dhcp_timeout string 60
+#d-i netcfg/dhcpv6_timeout string 60
+
+# If you prefer to configure the network manually, uncomment this line and
+# the static network configuration below.
+#d-i netcfg/disable_autoconfig boolean true
+
+# If you want the preconfiguration file to work on systems both with and
+# without a dhcp server, uncomment these lines and the static network
+# configuration below.
+#d-i netcfg/dhcp_failed note
+#d-i netcfg/dhcp_options select Configure network manually
+
+# Static network configuration.
+#
+# IPv4 example
+#d-i netcfg/get_ipaddress string 192.168.1.42
+#d-i netcfg/get_netmask string 255.255.255.0
+#d-i netcfg/get_gateway string 192.168.1.1
+#d-i netcfg/get_nameservers string 192.168.1.1
+#d-i netcfg/confirm_static boolean true
+#
+# IPv6 example
+#d-i netcfg/get_ipaddress string fc00::2
+#d-i netcfg/get_netmask string ffff:ffff:ffff:ffff::
+#d-i netcfg/get_gateway string fc00::1
+#d-i netcfg/get_nameservers string fc00::1
+#d-i netcfg/confirm_static boolean true
+
+# Any hostname and domain names assigned from dhcp take precedence over
+# values set here. However, setting the values still prevents the questions
+# from being shown, even if values come from dhcp.
+d-i netcfg/get_hostname string host01
+d-i netcfg/get_domain string test
+
+# If you want to force a hostname, regardless of what either the DHCP
+# server returns or what the reverse DNS entry for the IP is, uncomment
+# and adjust the following line.
+#d-i netcfg/hostname string somehost
+
+# Disable that annoying WEP key dialog.
+d-i netcfg/wireless_wep string
+# The wacky dhcp hostname that some ISPs use as a password of sorts.
+#d-i netcfg/dhcp_hostname string radish
+
+# If non-free firmware is needed for the network or other hardware, you can
+# configure the installer to always try to load it, without prompting. Or
+# change to false to disable asking.
+#d-i hw-detect/load_firmware boolean true
+
+### Network console
+# Use the following settings if you wish to make use of the network-console
+# component for remote installation over SSH. This only makes sense if you
+# intend to perform the remainder of the installation manually.
+#d-i anna/choose_modules string network-console
+#d-i network-console/authorized_keys_url string http://10.0.0.1/openssh-key
+#d-i network-console/password password r00tme
+#d-i network-console/password-again password r00tme
+
+### Mirror settings
+# If you select ftp, the mirror/country string does not need to be set.
+#d-i mirror/protocol string https
+d-i mirror/country string manual
+d-i mirror/http/hostname string deb.debian.org
+d-i mirror/http/directory string /debian
+d-i mirror/http/proxy string
+
+# Suite to install.
+#d-i mirror/suite string testing
+# Suite to use for loading installer components (optional).
+#d-i mirror/udeb/suite string testing
+
+### Account setup
+# Skip creation of a root account (normal user account will be able to
+# use sudo).
+#d-i passwd/root-login boolean false
+# Alternatively, to skip creation of a normal user account.
+#d-i passwd/make-user boolean false
+
+# Root password, either in clear text
+d-i passwd/root-password password root
+d-i passwd/root-password-again password root
+# or encrypted using a crypt(3)  hash.
+#d-i passwd/root-password-crypted password [crypt(3) hash]
+
+# To create a normal user account.
+d-i passwd/user-fullname string wpia
+d-i passwd/username string wpia
+# Normal user's password, either in clear text
+d-i passwd/user-password password wpia
+d-i passwd/user-password-again password wpia
+# or encrypted using a crypt(3) hash.
+#d-i passwd/user-password-crypted password [crypt(3) hash]
+# Create the first user with the specified UID instead of the default.
+#d-i passwd/user-uid string 1010
+
+# The user account will be added to some standard initial groups. To
+# override that, use this.
+#d-i passwd/user-default-groups string audio cdrom video
+
+### Clock and time zone setup
+# Controls whether or not the hardware clock is set to UTC.
+d-i clock-setup/utc boolean true
+
+# You may set this to any valid setting for $TZ; see the contents of
+# /usr/share/zoneinfo/ for valid values.
+d-i time/zone string Europe/Berlin
+
+# Controls whether to use NTP to set the clock during the install
+d-i clock-setup/ntp boolean true
+# NTP server to use. The default is almost always fine here.
+#d-i clock-setup/ntp-server string ntp.example.com
+
+### Partitioning
+## Partitioning example
+# If the system has free space you can choose to only partition that space.
+# This is only honoured if partman-auto/method (below) is not set.
+#d-i partman-auto/init_automatically_partition select biggest_free
+
+# Alternatively, you may specify a disk to partition. If the system has only
+# one disk the installer will default to using that, but otherwise the device
+# name must be given in traditional, non-devfs format (so e.g. /dev/sda
+# and not e.g. /dev/discs/disc0/disc).
+# For example, to use the first SCSI/SATA hard disk:
+#d-i partman-auto/disk string /dev/sda
+# In addition, you'll need to specify the method to use.
+# The presently available methods are:
+# - regular: use the usual partition types for your architecture
+# - lvm:     use LVM to partition the disk
+# - crypto:  use LVM within an encrypted partition
+d-i partman-auto/method string regular
+
+d-i partman-auto/choose_recipe select single-root-no-swap
+
+# Or provide a recipe of your own...
+# If you have a way to get a recipe file into the d-i environment, you can
+# just point at it.
+#d-i partman-auto/expert_recipe_file string /hd-media/recipe
+d-i partman-auto/expert_recipe string                         \
+      single-root-no-swap ::                                  \
+              1000 50 -1 ext4                                 \
+                      filesystem{ ext4 }                      \
+                      method{ format } format{ }              \
+                      use_filesystem{ }                       \
+                      mountpoint{ / }                         \
+              .
+
+# If not, you can put an entire recipe into the preconfiguration file in one
+# (logical) line. This example creates a small /boot partition, suitable
+# swap, and uses the rest of the space for the root partition:
+#d-i partman-auto/expert_recipe string                         \
+#      boot-root ::                                            \
+#              40 50 100 ext3                                  \
+#                      $primary{ } $bootable{ }                \
+#                      method{ format } format{ }              \
+#                      use_filesystem{ } filesystem{ ext3 }    \
+#                      mountpoint{ /boot }                     \
+#              .                                               \
+#              500 10000 1000000000 ext3                       \
+#                      method{ format } format{ }              \
+#                      use_filesystem{ } filesystem{ ext3 }    \
+#                      mountpoint{ / }                         \
+#              .                                               \
+#              64 512 300% linux-swap                          \
+#                      method{ swap } format{ }                \
+#              .
+
+
+#d-i partman-auto/init_automatically_partition \
+#  select Guided - use entire disk and set up LVM
+
+d-i partman-partitioning/confirm_write_new_label boolean true
+d-i partman/choose_partition select finish
+d-i partman/confirm boolean true
+d-i partman/confirm_nooverwrite boolean true
+
+# No swap
+d-i    partman-basicfilesystems/no_swap        boolean false
+
+
+## Controlling how partitions are mounted
+# The default is to mount by UUID, but you can also choose "traditional" to
+# use traditional device names, or "label" to try filesystem labels before
+# falling back to UUIDs.
+#d-i partman/mount_style select uuid
+d-i partman/mount_style select traditional
+
+### Base system installation
+# Configure APT to not install recommended packages by default. Use of this
+# option can result in an incomplete system and should only be used by very
+# experienced users.
+#d-i base-installer/install-recommends boolean false
+d-i base-installer/install-recommends boolean false
+
+# The kernel image (meta) package to be installed; "none" can be used if no
+# kernel is to be installed.
+#d-i base-installer/kernel/image string linux-image-686
+
+### Apt setup
+# You can choose to install non-free and contrib software.
+#d-i apt-setup/non-free boolean true
+#d-i apt-setup/contrib boolean true
+# Uncomment this if you don't want to use a network mirror.
+#d-i apt-setup/use_mirror boolean false
+# Select which update services to use; define the mirrors to be used.
+# Values shown below are the normal defaults.
+#d-i apt-setup/services-select multiselect security, updates
+#d-i apt-setup/security_host string security.debian.org
+
+# Additional repositories, local[0-9] available
+#d-i apt-setup/local0/repository string \
+#       http://local.server/debian stable main
+#d-i apt-setup/local0/comment string local server
+# Enable deb-src lines
+#d-i apt-setup/local0/source boolean true
+
+# Don't ask for more CDROM
+apt-cdrom-setup        apt-setup/disable-cdrom-entries boolean true
+apt-cdrom-setup        apt-setup/cdrom/set-first       boolean false
+
+# URL to the public key of the local repository; you must provide a key or
+# apt will complain about the unauthenticated repository and so the
+# sources.list line will be left commented out
+#d-i apt-setup/local0/key string http://local.server/key
+
+# By default the installer requires that repositories be authenticated
+# using a known gpg key. This setting can be used to disable that
+# authentication. Warning: Insecure, not recommended.
+#d-i debian-installer/allow_unauthenticated boolean true
+
+# Uncomment this to add multiarch configuration for i386
+#d-i apt-setup/multiarch string i386
+
+
+### Package selection
+#tasksel tasksel/first multiselect standard, web-server, kde-desktop
+tasksel tasksel/first multiselect SSH server
+
+# Individual additional packages to install
+# We need at least these to continue the preseeding later on.
+d-i pkgsel/include string openssh-server sudo
+
+# Whether to upgrade packages after debootstrap.
+# Allowed values: none, safe-upgrade, full-upgrade
+#d-i pkgsel/upgrade select none
+d-i pkgsel/upgrade select full-upgrade
+
+# Some versions of the installer can report back on what software you have
+# installed, and what software you use. The default is not to report back,
+# but sending reports helps the project determine what software is most
+# popular and include it on CDs.
+#popularity-contest popularity-contest/participate boolean false
+popularity-contest popularity-contest/participate boolean false
+
+### Boot loader installation
+# Grub is the default boot loader (for x86). If you want lilo installed
+# instead, uncomment this:
+#d-i grub-installer/skip boolean true
+# To also skip installing lilo, and install no bootloader, uncomment this
+# too:
+#d-i lilo-installer/skip boolean true
+
+
+# This is fairly safe to set, it makes grub install automatically to the MBR
+# if no other operating system is detected on the machine.
+d-i grub-installer/only_debian boolean true
+
+# This one makes grub-installer install to the MBR if it also finds some other
+# OS, which is less safe as it might not be able to boot that other OS.
+d-i grub-installer/with_other_os boolean true
+
+# Due notably to potential USB sticks, the location of the MBR can not be
+# determined safely in general, so this needs to be specified:
+#d-i grub-installer/bootdev  string /dev/sda
+# To install to the first device (assuming it is not a USB stick):
+#d-i grub-installer/bootdev  string default
+d-i grub-installer/bootdev  string default
+
+# Alternatively, if you want to install to a location other than the mbr,
+# uncomment and edit these lines:
+#d-i grub-installer/only_debian boolean false
+#d-i grub-installer/with_other_os boolean false
+#d-i grub-installer/bootdev  string (hd0,1)
+# To install grub to multiple disks:
+#d-i grub-installer/bootdev  string (hd0,1) (hd1,1) (hd2,1)
+
+# Optional password for grub, either in clear text
+#d-i grub-installer/password password r00tme
+#d-i grub-installer/password-again password r00tme
+# or encrypted using an MD5 hash, see grub-md5-crypt(8).
+#d-i grub-installer/password-crypted password [MD5 hash]
+
+# Use the following option to add additional boot parameters for the
+# installed system (if supported by the bootloader installer).
+# Note: options passed to the installer will be added automatically.
+#d-i debian-installer/add-kernel-opts string nousb
+
+### Finishing up the installation
+# During installations from serial console, the regular virtual consoles
+# (VT1-VT6) are normally disabled in /etc/inittab. Uncomment the next
+# line to prevent this.
+#d-i finish-install/keep-consoles boolean true
+
+# Avoid that last message about the install being complete.
+d-i finish-install/reboot_in_progress note
+
+# This will prevent the installer from ejecting the CD during the reboot,
+# which is useful in some situations.
+#d-i cdrom-detect/eject boolean false
+
+# This is how to make the installer shutdown when finished, but not
+# reboot into the installed system.
+#d-i debian-installer/exit/halt boolean true
+# This will power off the machine instead of just halting it.
+#d-i debian-installer/exit/poweroff boolean true
+
+### Preseeding other packages
+# Depending on what software you choose to install, or if things go wrong
+# during the installation process, it's possible that other questions may
+# be asked. You can preseed those too, of course. To get a list of every
+# possible question that could be asked during an install, do an
+# installation, and then run these commands:
+#   debconf-get-selections --installer > file
+#   debconf-get-selections >> file
+
+
+#### Advanced options
+### Running custom commands during the installation
+# d-i preseeding is inherently not secure. Nothing in the installer checks
+# for attempts at buffer overflows or other exploits of the values of a
+# preconfiguration file like this one. Only use preconfiguration files from
+# trusted locations! To drive that home, and because it's generally useful,
+# here's a way to run any shell command you'd like inside the installer,
+# automatically.
+
+# This first command is run as early as possible, just after
+# preseeding is read.
+#d-i preseed/early_command string anna-install some-udeb
+# This command is run immediately before the partitioner starts. It may be
+# useful to apply dynamic partitioner preseeding that depends on the state
+# of the disks (which may not be visible when preseed/early_command runs).
+#d-i partman/early_command \
+#       string debconf-set partman-auto/disk "$(list-devices disk | head -n1)"
+# This command is run just before the install finishes, but when there is
+# still a usable /target directory. You can chroot to /target and use it
+# directly, or use the apt-install and in-target commands to easily install
+# packages and run commands in the target system.
+#d-i preseed/late_command string apt-install zsh; in-target chsh -s /bin/zsh
+
+d-i preseed/late_command string echo 'wpia ALL = (root) NOPASSWD: ALL' > /target/etc/sudoers.d/wpia
diff --git a/packer/debian-9/packer.json b/packer/debian-9/packer.json
new file mode 100644 (file)
index 0000000..f675f93
--- /dev/null
@@ -0,0 +1,76 @@
+{
+  "builders": [
+    {
+      "accelerator": "kvm",
+      "boot_command": [
+        "<down><tab>",
+        "preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg ",
+        "language=en locale=en_US.UTF-8 ",
+        "country=DE keymap=us ",
+        "hostname=host01 domain=test ",
+        "<enter><wait>"
+      ],
+      "boot_wait": "1s",
+      "disk_compression": true,
+      "disk_detect_zeroes": "unmap",
+      "disk_discard": "unmap",
+      "disk_size": "2000M",
+      "format": "qcow2",
+      "headless": true,
+      "host_port_max": 2229,
+      "host_port_min": 2222,
+      "http_directory": "http",
+      "http_port_max": 9999,
+      "http_port_min": 9990,
+      "iso_checksum": "file:{{ user `source_checksum_url` }}",
+      "iso_url": "{{ user `source_iso` }}",
+      "output_directory": "{{ user `output_dir` }}",
+      "shutdown_command": "echo '{{ user `ssh_password` }}'  | sudo -S /sbin/shutdown -hP now",
+      "skip_compaction": false,
+      "ssh_password": "{{ user `ssh_password` }}",
+      "ssh_timeout": "1000s",
+      "ssh_username": "{{ user `ssh_username` }}",
+      "type": "qemu",
+      "vm_name": "{{ user `output_name` }}"
+    }
+  ],
+  "description": "This builder builds a QEMU image from a Debian \"netinst\" CD ISO file.\nIt contains a few basic tools and can be use as a \"cloud image\" alternative.\n",
+  "min_packer_version": "1.3.2",
+  "post-processors": [
+    {
+      "keep_input_artifact": true,
+      "type": "manifest"
+    }
+  ],
+  "provisioners": [
+    {
+      "sources": [
+        "scripts/00-install-packages.sh",
+        "scripts/01-configure-cloudinit.sh",
+        "scripts/02-enable-services.sh",
+        "scripts/99-cleanup.sh"
+      ],
+      "destination": "/tmp/",
+      "type": "file"
+    },
+    {
+      "inline": [
+        "/tmp/00-install-packages.sh",
+        "/tmp/01-configure-cloudinit.sh",
+        "/tmp/02-enable-services.sh",
+        "/tmp/99-cleanup.sh"
+      ],
+      "execute_command": "echo 'wpia' | sudo -S sh -c '{{ .Vars }} {{ .Path }}'",
+      "type": "shell"
+    }
+  ],
+  "variables": {
+    "output_dir": "output",
+    "output_name": "debian.qcow2",
+    "source_checksum_url": "https://cdimage.debian.org/cdimage/archive/9.13.0/amd64/iso-cd/SHA256SUMS",
+    "source_iso": "https://cdimage.debian.org/cdimage/archive/9.13.0/amd64/iso-cd/debian-9.13.0-amd64-netinst.iso",
+    "ssh_password": "wpia",
+    "ssh_username": "wpia"
+  }
+}
+
diff --git a/packer/debian-9/scripts/00-install-packages.sh b/packer/debian-9/scripts/00-install-packages.sh
new file mode 100755 (executable)
index 0000000..4d4914a
--- /dev/null
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+export DEBIAN_FRONTEND=noninteractive
+
+# Default packages installed, which makes the image usable for WPIA teams. These
+# tools are pretty important to have for QEMU, as it makes the image smarter.
+apt-get update
+apt-get install --no-install-recommends \
+    acpid \
+    cloud-init \
+    cloud-guest-utils \
+    lsb-release \
+    net-tools \
+    qemu-guest-agent \
+    puppet \
+    puppet-master \
+    --yes
+
+# These tools are just "nice to have".
+apt-get install --no-install-recommends \
+    curl \
+    git \
+    less \
+    localepurge \
+    vim \
+    emacs-nox \
+    tmux \
+    --yes
diff --git a/packer/debian-9/scripts/01-configure-cloudinit.sh b/packer/debian-9/scripts/01-configure-cloudinit.sh
new file mode 100755 (executable)
index 0000000..c014d6e
--- /dev/null
@@ -0,0 +1,68 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+# Configure cloud-init to allow image instanciation-time customization.
+# The only cloud-init "datasources" that make sense for this image are:
+#
+# * "None": this is the last resort when nothing works. This prevents
+#   cloud-init from exiting with an error because it didn't find any datasource
+#   at all. This in turns allow to start the QEMU image with no
+#
+# * "NoCloud": this fetches the cloud-init data from a ISO disk mounted into
+#   the new VM or from other non-network resources. See
+#   https://cloudinit.readthedocs.io/en/latest/topics/datasources/nocloud.html
+#   for more information.
+#
+# Ultimately, this configures "datasource_list" in
+# /etc/cloud/cloud.cfg.d/90_dpkg.cfg.
+echo "cloud-init       cloud-init/datasources  multiselect     NoCloud, None" \
+       | debconf-set-selections
+
+# Configure localepurge to remove unused locales. This makes the image smaller.
+echo "localepurge      localepurge/use-dpkg-feature    boolean true" \
+       | debconf-set-selections
+echo "localepurge      localepurge/nopurge     multiselect     en, en_US.UTF-8" \
+       | debconf-set-selections
+
+# Reconfigure cloud-init
+# Don't "lock" the "wpia" user password. It is configured directly by the
+# preseeding and all the rest depends on it. Cloud-init, with the default
+# configuration, overrides this user's settings and prevents from using it
+# without a SSH key (which needs to be passed by the "cloud" user-data, which
+# we may not always have.)
+cat <<EOF > /etc/cloud/cloud.cfg.d/91-debian-user.cfg
+# System and/or distro specific settings
+# (not accessible to handlers/transforms)
+system_info:
+   # This will affect which distro class gets used
+   distro: debian
+   # Default user name + that default users groups (if added/used)
+   default_user:
+     name: wpia
+     lock_passwd: false
+     gecos: Debian
+     groups: [adm, audio, cdrom, dialout, dip, floppy, netdev, plugdev, sudo, video]
+     sudo: ["ALL=(ALL) NOPASSWD:ALL"]
+     shell: /bin/bash
+   # Other config here will be given to the distro class and/or path classes
+   paths:
+      cloud_dir: /var/lib/cloud/
+      templates_dir: /etc/cloud/templates/
+      upstart_dir: /etc/init/
+   package_mirrors:
+     - arches: [default]
+       failsafe:
+         primary: http://deb.debian.org/debian
+         security: http://security.debian.org/
+   ssh_svcname: ssh
+EOF
+
+# Don't let cloud-init to take over the network configuration.
+# This prevents to have more fine-grained configuration and enable lot of
+# automagic configuration on interfaces that could (should!) be managed outside
+# of cloud-init.
+cat <<EOF > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
+network:
+  config: disabled
+EOF
diff --git a/packer/debian-9/scripts/02-enable-services.sh b/packer/debian-9/scripts/02-enable-services.sh
new file mode 100755 (executable)
index 0000000..003d2e6
--- /dev/null
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+# Boot more quickly
+sed -i 's/^GRUB_TIMEOUT=.*/GRUB_TIMEOUT=1/' /etc/default/grub
+update-grub
+
+# Prevent clearing the terminal when systemd invokes the initial getty
+# From: https://wiki.debian.org/systemd#Missing_startup_messages_on_console.28tty1.29_after_the_boot
+SYSTEMD_NO_CLEAR_FILE=/etc/systemd/system/getty@tty1.service.d/no-clear.conf
+mkdir --parents "$(dirname "$SYSTEMD_NO_CLEAR_FILE")"
+cat <<EOF > "$SYSTEMD_NO_CLEAR_FILE"
+[Service]
+TTYVTDisallocate=no
+EOF
+systemctl daemon-reload
+
+
+# Configure the ACPI daemon to gently turn off the VM when the "power button"
+# is pressed.
+cp /usr/share/doc/acpid/examples/powerbtn /etc/acpi/events/powerbtn
+cp /usr/share/doc/acpid/examples/powerbtn.sh /etc/acpi/powerbtn.sh
+chmod +x /etc/acpi/powerbtn.sh
+systemctl enable acpid
+
+
+# The QEMU guest agent helps the host to run the VM more optimally.
+systemctl enable qemu-guest-agent
diff --git a/packer/debian-9/scripts/99-cleanup.sh b/packer/debian-9/scripts/99-cleanup.sh
new file mode 100755 (executable)
index 0000000..4c4070d
--- /dev/null
@@ -0,0 +1,57 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+export DEBIAN_FRONTEND=noninteractive
+
+# Finally, cleanup all the things
+apt-get install --yes deborphan # Let's try to remove some more
+apt-get autoremove \
+  $(deborphan) \
+  deborphan \
+  dictionaries-common \
+  iamerican \
+  ibritish \
+  localepurge \
+  task-english \
+  tasksel \
+  tasksel-data \
+  --purge --yes
+
+# Remove downloaded .deb files
+apt-get clean
+
+# Remove instance-specific files: we want this image to be as "impersonal" as
+# possible.
+find \
+  /var/cache/apt \
+  /var/lib/apt \
+  /var/lib/dhcp \
+  /var/log \
+  -mindepth 1 -print -delete
+
+rm -vf \
+  /etc/network/interfaces.d/50-cloud-init.cfg \
+  /etc/adjtime \
+  /etc/hostname \
+  /etc/hosts \
+  /etc/ssh/*key* \
+  /var/cache/ldconfig/aux-cache \
+  /var/lib/systemd/random-seed \
+  ~/.bash_history \
+  "${SUDO_USER}/.bash_history"
+
+# From https://www.freedesktop.org/software/systemd/man/machine-id.html:
+# For operating system images which are created once and used on multiple
+# machines, [...] /etc/machine-id should be an empty file in the generic file
+# system image.
+truncate -s 0 /etc/machine-id
+
+# Recreate some useful files.
+touch /var/log/lastlog
+chown root:utmp /var/log/lastlog
+chmod 664 /var/log/lastlog
+
+
+# Free all unused storage block. This makes the final image smaller.
+fstrim --all --verbose