packerBuilder
packerBuilder.py
Description: Run a Packer Build and push it to SSM params Owner: CloudOps Version: 1.0
1#!/usr/bin/env python3 2""" 3packerBuilder.py 4 5Description: Run a Packer Build and push it to SSM params 6Owner: CloudOps 7Version: 1.0 8 9""" 10 11import argparse 12import os 13import sys 14import json 15from pathlib import Path 16from utils import common 17from utils import aws 18 19REGION = os.environ.get('AWS_DEFAULT_REGION', 'us-east-1') 20 21if __name__ == "__main__": 22 print("packerBuilder.__main__(): BEGIN") 23 24 # 25 # ArgParse 26 # 27 parser = argparse.ArgumentParser(description='Build an AMI in AWS using a packer template.') 28 parser.add_argument( 29 '-t', 30 '--template', 31 action='store', 32 type=str, 33 required=True, 34 help='packer template to build') 35 36 parser.add_argument( 37 '-b', 38 '--builder', 39 action='store', 40 type=str, 41 required=True, 42 help='builder inside of template to build') 43 44 parser.add_argument( 45 '-s', 46 '--ssmpath', 47 action='store', 48 type=str, 49 required=False, 50 default="/rekor/amis", 51 help='base path to push AMI ID into SSM Param [default: /rekor/amis]') 52 53 args = parser.parse_args() 54 55 _TEMPLATE = args.template 56 _BUILDER = args.builder 57 _SSM_PATH = '/'.join((args.ssmpath, _TEMPLATE.split('.json')[0])) 58 59 if not os.path.exists(_TEMPLATE): 60 print("packerBuilder.__main__(): Template file () does not exist") 61 sys.exit(1) 62 63 _PACKER_VERSION = common.subprocess_long("/bin/packer -v", check=True).stdout 64 print("packerBuilder.__main__(): packer version: " + _PACKER_VERSION) 65 66 _COMMAND = 'AWS_ACCESS_KEY_ID="{}" AWS_SECRET_ACCESS_KEY="{}" AWS_DEFAULT_REGION="{}" /bin/packer build --only={} {}'.format( 67 os.environ['AWS_ACCESS_KEY_ID'], 68 os.environ['AWS_SECRET_ACCESS_KEY'], 69 os.environ['AWS_DEFAULT_REGION'], 70 _BUILDER, 71 _TEMPLATE) 72 73 print('packerBuilder.__main__(): Building AMI.') 74 _process_output = common.subprocess_long(_COMMAND, check=True) 75 76 if not os.path.exists("manifest.json"): 77 print("packerBuilder.__main__(): Manifest is missing. Packer build must have failed.") 78 sys.exit(2) 79 80 print(Path("manifest.json").read_text()) 81 82 # 83 # Create an array of AMI IDs with region:ami_id 84 # 85 _AMI_IDS = json.loads(Path("manifest.json").read_text())['builds'][-1]['artifact_id'].split(',') 86 for _AMI_INFO in _AMI_IDS: 87 _AMI_REGION = _AMI_INFO.split(':')[0] 88 _AMI_ID = _AMI_INFO.split(':')[1] 89 print('packerBuilder.__main__(): Saving ami (' + _AMI_ID + ') in region (' + _AMI_REGION + ') into SSM Param (' + _SSM_PATH + ')') 90 91 aws.ssm_put_parameter(name=_SSM_PATH, value=_AMI_ID, region=_AMI_REGION)