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)