#!/bin/bash -e set -x # Get pip3 sudo apt-get update sudo apt-get install -y python3-pip # Get, build, and install cloud-init master branch from source curl -Lo cloud-init-master.zip https://github.com/cloud-init/cloud-init/archive/master.zip unzip cloud-init-master.zip cd cloud-init-master sudo pip3 install -r requirements.txt sudo python3 setup.py build sudo python3 setup.py install --init-system systemd sudo ln -s /usr/local/bin/cloud-init /usr/bin/cloud-init sudo cloud-init init --local sudo cloud-init status # Activate systemd services for svc in cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service; do sudo systemctl enable $svc sudo systemctl start $svc done # Configure cloud-init Datasource NoCloud # See: http://cloudinit.readthedocs.io/en/17.2/topics/datasources/nocloud.html?highlight=nocloud if grep -q ds=nocloud /boot/cmdline.txt; then sudo sed -i '${s?$? ds=nocloud;seedfrom=/boot/;instance-id=iid-raspberrypi-nocloud?}' /boot/cmdline.txt fi # Create meta-data cat | sudo tee /boot/meta-data > /dev/null <<'EOF' instance-id: iid-raspberrypi-nocloud EOF # Create user-data cat | sudo tee /boot/user-data > /dev/null <<'EOF' #cloud-config password: passw0rd chpasswd: { expire: True } EOF # Create a script to run per boot cat | sudo tee /var/lib/cloud/scripts/per-boot/00_run-parts.sh > /dev/null <<'EOF' #!/bin/bash # Prevent *.sh from returning itself if there are no matches shopt -s nullglob # Run every per-once script run-parts --regex '.*\.sh$' /boot/per-once # Rename every per-once script for f in /boot/per-once/*.sh; do mv $f $(dirname $f)/$(basename $f .sh).$(date +%F@%H.%M.%S) done # Run every per-boot script run-parts --regex '.*\.sh$' /boot/per-boot EOF sudo chmod +x /var/lib/cloud/scripts/per-boot/00_run-parts.sh # Create sample per-boot and per-once scripts sudo mkdir -p /boot/{per-boot,per-once} cat | sudo tee /boot/per-boot/01_get_ready.sh \ /boot/per-boot/02_do_it.sh \ /boot/per-once/01_prepare.sh \ /boot/per-once/02_install_stuff.sh > /dev/null <<'EOF' #!/bin/bash date="$(date +"%x %X")" script_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" script_name="$(basename ${BASH_SOURCE[0]} .sh)" log_name="$(basename $script_path)" echo "$date - $script_name" >> /home/pi/${log_name}.out EOF # vim: et sw=4 ts=4 sts=4 syntax=sh