From d593de3833014b4e83d7693a5e6691013122eb0e Mon Sep 17 00:00:00 2001 From: Jake Buchholz Date: Sun, 9 Aug 2020 21:27:28 -0700 Subject: [PATCH] Optional Additional Setup Profiles can specify 'setup_script' to do additional things. If additional files/dirs are required, a 'setup_copy' map will copy them to the build instance so that 'setup_script' can use/install them. TBD: docs. --- packer.conf | 4 ++-- scripts/builder.py | 21 ++++++++++++++++++++- scripts/setup-ami | 17 ++++++++++++++++- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/packer.conf b/packer.conf index 04962bf..a62d7de 100644 --- a/packer.conf +++ b/packer.conf @@ -69,8 +69,8 @@ builders = [ provisioners = [ { type = "file" - source = "../scripts/nvme-ebs-links" - destination = "/tmp/nvme-ebs-links" + source = "./profile/{{user `profile`}}/{{user `profile_build`}}/setup-ami.d" + destination = "/tmp/setup-ami.d" } { type = "shell" diff --git a/scripts/builder.py b/scripts/builder.py index c249ba9..ea23d99 100755 --- a/scripts/builder.py +++ b/scripts/builder.py @@ -513,16 +513,35 @@ class ConfigBuilder: profile = os.path.splitext(os.path.split(file)[-1])[0] self.build_profile(profile) + def rel_symlink(self, src_path, dest_dir, dest): + os.symlink( + os.path.relpath(src_path, dest_dir), + os.path.join(dest_dir, dest)) + def build_profile(self, profile): build_config = pyhocon.ConfigFactory.parse_file( os.path.join(self.config_path, f"{profile}.conf")) for build, cfg in build_config["BUILDS"].items(): build_dir = os.path.join(self.out_dir, profile, build) + setup_dir = os.path.join(build_dir, "setup-ami.d") # Always start fresh shutil.rmtree(build_dir, ignore_errors=True) - os.makedirs(build_dir) + os.makedirs(setup_dir) + + # symlink nvme script + self.rel_symlink("scripts/nvme-ebs-links", setup_dir, "nvme-ebs-links") + + # symlink additional setup_script + if "setup_script" in cfg.keys(): + self.rel_symlink(cfg["setup_script"], setup_dir, "setup_script") + del cfg["setup_script"] + + if "setup_copy" in cfg.keys(): + for dst, src in cfg["setup_copy"].items(): + self.rel_symlink(src, setup_dir, dst) + del cfg["setup_copy"] cfg["profile"] = profile cfg["profile_build"] = build diff --git a/scripts/setup-ami b/scripts/setup-ami index 1710ca9..e3c311d 100755 --- a/scripts/setup-ami +++ b/scripts/setup-ami @@ -154,7 +154,7 @@ install_core_packages() { } setup_mdev() { - cp /tmp/nvme-ebs-links "$TARGET/lib/mdev" + cp /tmp/setup-ami.d/nvme-ebs-links "$TARGET/lib/mdev" # insert nvme ebs mdev configs just above "# fallback" comment sed -n -i \ @@ -288,6 +288,19 @@ configure_ntp() { -i "$TARGET/etc/chrony/chrony.conf" } +setup_script() { + if [ -f /tmp/setup-ami.d/setup_script ]; then + einfo "Executing additional setup script" + ( + cd /tmp/setup-ami.d + chmod u+x ./setup_script + TARGET="$TARGET" ./setup_script + ) + else + einfo "No additional setup script" + fi +} + cleanup() { # Sweep cruft out of the image that doesn't need to ship or will be # re-generated when the image boots @@ -344,6 +357,8 @@ main() { create_alpine_user configure_ntp + setup_script + einfo "All done, cleaning up" cleanup }