Add add_svcs, fix nvme, add eu-north-1 (#34)

* Allow additional services on the AMI's runlevels

I'm using this with my AMIs to add haveged to the boot runlevel to boost the amount of initial entropy on smaller instance types, so sshd can start in under 6s instead of over 2m.

add_svcs:
  boot:
    - haveged

* fix race condition with nvme-ebs /dev linking
* copy nvme stuff to build target in one operation
* add eu-north-1 region
This commit is contained in:
tomalok 2019-01-26 13:32:54 -08:00 committed by GitHub
parent 80c014d702
commit 4680ecd85e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 51 additions and 33 deletions

View File

@ -24,9 +24,11 @@ build/convert:
@echo "#!`pwd`/.py3/bin/python" > build/convert @echo "#!`pwd`/.py3/bin/python" > build/convert
@echo "import yaml, json, sys" >> build/convert @echo "import yaml, json, sys" >> build/convert
@echo "y = yaml.load(open(sys.argv[1]))" >> build/convert @echo "y = yaml.load(open(sys.argv[1]))" >> build/convert
@echo "for k in ['ami_access','deploy_regions','add_repos','add_pkgs']:" >> build/convert @echo "for k in ['ami_access','deploy_regions','add_repos','add_pkgs','add_svcs']:" >> build/convert
@echo " if k in y and isinstance(y[k], list):" >> build/convert @echo " if k in y and isinstance(y[k], list):" >> build/convert
@echo " y[k] = ','.join(str(x) for x in y[k])" >> build/convert @echo " y[k] = ','.join(str(x) for x in y[k])" >> build/convert
@echo " if k in y and isinstance(y[k], dict):" >> build/convert
@echo " y[k] = ':'.join(str(l) + '=' + ','.join(str(s) for s in ss) for l, ss in y[k].items())" >> build/convert
@echo "json.dump(y, sys.stdout, indent=4, separators=(',', ': '))" >> build/convert @echo "json.dump(y, sys.stdout, indent=4, separators=(',', ': '))" >> build/convert
@chmod +x build/convert @chmod +x build/convert

View File

@ -54,13 +54,10 @@ builders:
provisioners: provisioners:
- type: "file" - type: "file"
source: "nvme-ebs-links.sh" source: "nvme/"
destination: "/tmp/" destination: "/tmp"
- type: "file"
source: "nvme-ebs-mdev.conf"
destination: "/tmp/"
- type: "shell" - type: "shell"
script: "make_ami.sh" script: "make_ami.sh"
environment_vars: environment_vars:
- "ALPINE_RELEASE={{user `alpine_release`}}" - "ALPINE_RELEASE={{user `alpine_release`}}"
execute_command: 'sudo sh -c "{{ .Vars }} {{ .Path }} ''{{user `add_repos`}}'' ''{{user `add_pkgs`}}''"' execute_command: 'sudo sh -c "{{ .Vars }} {{ .Path }} ''{{user `add_repos`}}'' ''{{user `add_pkgs`}}'' ''{{user `add_svcs`}}''"'

View File

@ -157,7 +157,7 @@ install_core_packages() {
setup_mdev() { setup_mdev() {
local target="$1" local target="$1"
cp -a /tmp/nvme-ebs-links.sh "$target"/lib/mdev cp /tmp/nvme-ebs-links "$target"/lib/mdev
sed -n -i -e '/# fallback/r /tmp/nvme-ebs-mdev.conf' -e 1x -e '2,${x;p}' -e '${x;p}' "$target"/etc/mdev.conf sed -n -i -e '/# fallback/r /tmp/nvme-ebs-mdev.conf' -e 1x -e '2,${x;p}' -e '${x;p}' "$target"/etc/mdev.conf
} }
@ -229,11 +229,18 @@ EOF
enable_services() { enable_services() {
local target="$1" local target="$1"
local add_svcs="$2"
rc_add "$target" default sshd chronyd networking tiny-ec2-bootstrap rc_add "$target" default sshd chronyd networking tiny-ec2-bootstrap
rc_add "$target" sysinit devfs dmesg mdev hwdrivers rc_add "$target" sysinit devfs dmesg mdev hwdrivers
rc_add "$target" boot modules hwclock swap hostname sysctl bootmisc syslog acpid rc_add "$target" boot modules hwclock swap hostname sysctl bootmisc syslog acpid
rc_add "$target" shutdown killprocs savecache mount-ro rc_add "$target" shutdown killprocs savecache mount-ro
if [ -n "$add_svcs" ]; then
local lvl_svcs; for lvl_svcs in $(echo "$add_svcs" | tr : ' '); do
rc_add "$target" $(echo "$lvl_svcs" | tr =, ' ')
done
fi
} }
create_alpine_user() { create_alpine_user() {
@ -295,13 +302,14 @@ version_sorted() {
} }
main() { main() {
[ "$#" -ne 2 ] && die "Expecting two parameters\nUsage: $0 '<repo>[,<repo>]' '<pkg>[,<pkg>]'" [ "$#" -ne 3 ] && die "Expecting three parameters\nUsage: $0 '[<repo>[,...]]' '[<pkg>[,...]]' '[<lvl>=<svc>[,...][:...]]'"
[ "$ALPINE_RELEASE" != 'edge' ] && { [ "$ALPINE_RELEASE" != 'edge' ] && {
version_sorted $MIN_RELEASE $ALPINE_RELEASE || die "Minimum alpine_release is '$MIN_RELEASE'" version_sorted $MIN_RELEASE $ALPINE_RELEASE || die "Minimum alpine_release is '$MIN_RELEASE'"
} }
local add_repos="$1" local add_repos="$1"
local add_pkgs="$2" local add_pkgs="$2"
local add_svcs="$3"
local device="/dev/xvdf" local device="/dev/xvdf"
local target="/mnt/target" local target="/mnt/target"
@ -316,6 +324,7 @@ main() {
einfo "Creating root filesystem" einfo "Creating root filesystem"
make_filesystem "$device" "$target" make_filesystem "$device" "$target"
einfo "Configuring Alpine repositories"
setup_repositories "$target" "$add_repos" setup_repositories "$target" "$add_repos"
einfo "Fetching Alpine signing keys" einfo "Fetching Alpine signing keys"
@ -338,7 +347,7 @@ main() {
setup_mdev "$target" setup_mdev "$target"
setup_fstab "$target" setup_fstab "$target"
setup_networking "$target" setup_networking "$target"
enable_services "$target" enable_services "$target" "$add_svcs"
create_alpine_user "$target" create_alpine_user "$target"
configure_ntp "$target" configure_ntp "$target"

View File

@ -1,20 +0,0 @@
#!/bin/sh
[ -x /usr/sbin/nvme ] || exit
case $ACTION in
add|"")
BASE=$(echo $MDEV | sed -re 's/^(nvme[0-9]+n[0-9]+).*/\1/')
PART=$(echo $MDEV | sed -re 's/nvme[0-9]+n[0-9]+p?//g')
EBS=$(/usr/sbin/nvme id-ctrl "/dev/$BASE" -b 2>/dev/null | dd bs=32 skip=96 count=1 2>/dev/null | tr -d ' ')
EBS=${EBS#/dev/}$PART
ln -sf $MDEV ${EBS/xvd/sd}
ln -sf $MDEV ${EBS/sd/xvd}
;;
remove)
for TARGET in sd* xvd*
do
[ "$(readlink $TARGET 2>/dev/null)" = $MDEV ] && rm -f $TARGET
done
;;
esac

View File

@ -1,3 +0,0 @@
# ebs nvme links
nvme[0-9]+n[0-9]+.* root:root 0660 */lib/mdev/nvme-ebs-links.sh

22
nvme/nvme-ebs-links Executable file
View File

@ -0,0 +1,22 @@
#!/bin/sh
[ -x /usr/sbin/nvme ] || exit
case $ACTION in
add|"")
BASE=$(echo $MDEV | sed -re 's/^(nvme[0-9]+n[0-9]+).*/\1/')
PART=$(echo $MDEV | sed -re 's/nvme[0-9]+n[0-9]+p?//g')
until [ -n "$EBS" ]; do
EBS=$(/usr/sbin/nvme id-ctrl "/dev/$BASE" -b 2>/dev/null | dd bs=32 skip=96 count=1 2>/dev/null | tr -d ' ')
done
EBS=${EBS#/dev/}$PART
ln -sf "$MDEV" "${EBS/xvd/sd}"
ln -sf "$MDEV" "${EBS/sd/xvd}"
;;
remove)
for TARGET in sd* xvd*
do
[ "$(readlink $TARGET 2>/dev/null)" = "$MDEV" ] && rm -f "$TARGET"
done
;;
esac

3
nvme/nvme-ebs-mdev.conf Normal file
View File

@ -0,0 +1,3 @@
# ebs nvme links
nvme[0-9]+n[0-9]+.* root:root 0660 */lib/mdev/nvme-ebs-links

View File

@ -36,6 +36,13 @@ add_repos:
# List of additional packages to add to the AMI. # List of additional packages to add to the AMI.
add_pkgs: add_pkgs:
# Additional services to start at the specified level.
add_svcs:
# boot:
# - service1
# default:
# - service2
# Size of the AMI image (in GiB). # Size of the AMI image (in GiB).
volume_size: "1" volume_size: "1"
@ -55,6 +62,7 @@ deploy_regions:
- "us-west-2" - "us-west-2"
- "ca-central-1" - "ca-central-1"
- "eu-central-1" - "eu-central-1"
- "eu-north-1"
- "eu-west-1" - "eu-west-1"
- "eu-west-2" - "eu-west-2"
- "eu-west-3" - "eu-west-3"