From 0c24e92708e39a1f249eab746cc9ab6c45d70e1f Mon Sep 17 00:00:00 2001 From: Ryan Smith Date: Wed, 12 Feb 2020 17:14:44 -0800 Subject: [PATCH 1/4] working --- .gitignore | 1 + ssm-diff | 7 ++++--- states/states.py | 9 +++++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index fd133da..3c9dda7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ build dist *.egg-info +parameters.yml diff --git a/ssm-diff b/ssm-diff index 73ebca1..50bbb6a 100755 --- a/ssm-diff +++ b/ssm-diff @@ -7,13 +7,13 @@ import os def init(args): - r, l = RemoteState(args.profile), LocalState(args.filename) + r, l = RemoteState(args.profile, args.overwrite), LocalState(args.filename) l.save(r.get(flat=False, paths=args.path)) def pull(args): dictfilter = lambda x, y: dict([ (i,x[i]) for i in x if i in set(y) ]) - r, l = RemoteState(args.profile), LocalState(args.filename) + r, l = RemoteState(args.profile, args.overwrite), LocalState(args.filename) diff = helpers.FlatDictDiffer(r.get(paths=args.path), l.get(paths=args.path)) if args.force: ref_set = diff.changed().union(diff.removed()).union(diff.unchanged()) @@ -38,7 +38,7 @@ def apply(args): def plan(args): - r, l = RemoteState(args.profile), LocalState(args.filename) + r, l = RemoteState(args.profile, args.overwrite), LocalState(args.filename) diff = helpers.FlatDictDiffer(r.get(paths=args.path), l.get(paths=args.path)) if diff.differ: @@ -54,6 +54,7 @@ if __name__ == "__main__": parser.add_argument('-f', help='local state yml file', action='store', dest='filename', default='parameters.yml') parser.add_argument('--path', '-p', action='append', help='filter SSM path') parser.add_argument('--profile', help='AWS profile name', action='store', dest='profile') + parser.add_argument('--overwrite', help='Overwrite on change', action='store', type=lambda x: (str(x).lower() == 'true'), dest='overwrite', default=True) subparsers = parser.add_subparsers(dest='func', help='commands') subparsers.required = True diff --git a/states/states.py b/states/states.py index bb96897..450cdd7 100644 --- a/states/states.py +++ b/states/states.py @@ -90,10 +90,11 @@ def save(self, state): class RemoteState(object): - def __init__(self, profile): + def __init__(self, profile, overwrite): if profile: boto3.setup_default_session(profile_name=profile) self.ssm = boto3.client('ssm') + self.overwrite = overwrite def get(self, paths=['/'], flat=True): p = self.ssm.get_paginator('get_parameters_by_path') @@ -132,11 +133,15 @@ def apply(self, diff): for k in diff.removed(): self.ssm.delete_parameter(Name=k) + if not self.overwrite: + print("Skipping overwrite of vars") + return + for k in diff.changed(): ssm_type = 'SecureString' if isinstance(diff.target[k], SecureTag) else 'String' self.ssm.put_parameter( Name=k, Value=repr(diff.target[k]) if type(diff.target[k]) == SecureTag else str(diff.target[k]), - Overwrite=True, + Overwrite=self.overwrite, Type=ssm_type) From 4e9c27c4773917de6f45886a843ddd1b7a8adb5c Mon Sep 17 00:00:00 2001 From: Ryan Smith Date: Thu, 13 Feb 2020 09:08:09 -0800 Subject: [PATCH 2/4] working --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index be38eac..91f6d3e 100755 --- a/setup.py +++ b/setup.py @@ -11,12 +11,12 @@ setup( description = 'A tool to manage contents of AWS SSM Parameter Store', name = 'ssm-diff', - version = '0.5', + version = '0.6', author = 'Sergey Motovilovets', author_email = 'motovilovets.sergey@gmail.com', license='MIT', url = 'https://github.com/runtheops/ssm-diff', - download_url = 'https://github.com/runtheops/ssm-diff/archive/0.5.tar.gz', + download_url = 'https://github.com/runtheops/ssm-diff/archive/0.6.tar.gz', long_description=long_description, long_description_content_type='text/markdown', keywords = ['aws', 'ssm', 'parameter-store'], From 624973a047ecb3ff319ec60c98baba34cd8e2989 Mon Sep 17 00:00:00 2001 From: Ryan M Smith Date: Fri, 24 Apr 2020 12:09:12 -0700 Subject: [PATCH 3/4] Update helpers.py --- states/helpers.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/states/helpers.py b/states/helpers.py index 08d313a..900a95a 100644 --- a/states/helpers.py +++ b/states/helpers.py @@ -56,6 +56,10 @@ def add(obj, path, value): obj[part] = value else: obj = obj.setdefault(part, {}) + # For some reason the line above returns NONE instead of {} sometimes. + # The line below is a hack to fix that + if isinstance(obj, str): + obj = {} def search(state, path): From 61a4252ea6543111a705f9ea2da22dfdcbc26245 Mon Sep 17 00:00:00 2001 From: Ryan M Smith Date: Fri, 24 Apr 2020 12:20:34 -0700 Subject: [PATCH 4/4] Update helpers.py --- states/helpers.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/states/helpers.py b/states/helpers.py index 900a95a..08d313a 100644 --- a/states/helpers.py +++ b/states/helpers.py @@ -56,10 +56,6 @@ def add(obj, path, value): obj[part] = value else: obj = obj.setdefault(part, {}) - # For some reason the line above returns NONE instead of {} sometimes. - # The line below is a hack to fix that - if isinstance(obj, str): - obj = {} def search(state, path):