def main(): module = AnsibleModule(argument_spec={ 'name': dict(required=True), 'compose_yaml': dict(), 'compose_file': dict(), 'prune': dict(default=False, type='bool'), 'with_registry_auth': dict(default=False, type='bool'), 'state': dict(default='present', choices=['present', 'absent']) }, supports_check_mode=False) state = module.params['state'] compose_yaml = module.params['compose_yaml'] compose_file = module.params['compose_file'] name = module.params['name'] if state == 'present': if compose_yaml and compose_file: module.fail_json(msg="both compose_file and compose_yaml " + "parameters given") elif compose_yaml: fd, compose_file = mkstemp() stack_file = open(compose_file, 'w') stack_file.write(compose_yaml) stack_file.close() os.close(fd) elif not compose_file: module.fail_json(msg="compose_yaml or compose_file " + "parameters required if state==up") before_stack_services = docker_stack_inspect(module, name) rc, out, err = docker_stack_deploy(module, name, compose_file) after_stack_services = docker_stack_inspect(module, name) if compose_yaml: os.remove(compose_file) if rc != 0: module.fail_json(msg="docker stack up deploy command failed", out=out, rc=rc, err=err) before_after_differences = json_diff(before_stack_services, after_stack_services) for k in before_after_differences.keys(): if isinstance(before_after_differences[k], dict): before_after_differences[k].pop('UpdatedAt', None) before_after_differences[k].pop('Version', None) if len(before_after_differences[k].keys()) == 0: before_after_differences.pop(k) if before_after_differences == {}: module.exit_json(changed=False) else: module.exit_json( changed=True, docker_stack_spec_diff=str(before_after_differences)) else: rc, out, err = module.run_command(["docker", "stack", "down", name]) if not rc == 0: module.fail_json(msg="'docker stack down' command failed", out=out, rc=rc, err=err) module.exit_json(changed=True, msg=out, err=err)
def main(): module = AnsibleModule(argument_spec={ 'name': dict(type='str', required=True), 'compose': dict(type='list', default=[]), 'prune': dict(type='bool', default=False), 'with_registry_auth': dict(type='bool', default=False), 'resolve_image': dict(type='str', choices=['always', 'changed', 'never']), 'state': dict(tpye='str', default='present', choices=['present', 'absent']), 'absent_retries': dict(type='int', default=0), 'absent_retries_interval': dict(type='int', default=1) }, supports_check_mode=False) if not HAS_JSONDIFF: return module.fail_json( msg="jsondiff is not installed, try 'pip install jsondiff'") if not HAS_YAML: return module.fail_json( msg="yaml is not installed, try 'pip install pyyaml'") state = module.params['state'] compose = module.params['compose'] name = module.params['name'] absent_retries = module.params['absent_retries'] absent_retries_interval = module.params['absent_retries_interval'] if state == 'present': if not compose: module.fail_json(msg=("compose parameter must be a list " "containing at least one element")) compose_files = [] for i, compose_def in enumerate(compose): if isinstance(compose_def, dict): compose_file_fd, compose_file = tempfile.mkstemp() module.add_cleanup_file(compose_file) with os.fdopen(compose_file_fd, 'w') as stack_file: compose_files.append(compose_file) stack_file.write(yaml_dump(compose_def)) elif isinstance(compose_def, string_types): compose_files.append(compose_def) else: module.fail_json(msg="compose element '%s' must be a " + "string or a dictionary" % compose_def) before_stack_services = docker_stack_inspect(module, name) rc, out, err = docker_stack_deploy(module, name, compose_files) after_stack_services = docker_stack_inspect(module, name) if rc != 0: module.fail_json(msg="docker stack up deploy command failed", out=out, rc=rc, err=err) before_after_differences = json_diff(before_stack_services, after_stack_services) for k in before_after_differences.keys(): if isinstance(before_after_differences[k], dict): before_after_differences[k].pop('UpdatedAt', None) before_after_differences[k].pop('Version', None) if not list(before_after_differences[k].keys()): before_after_differences.pop(k) if not before_after_differences: module.exit_json(changed=False) else: module.exit_json(changed=True, stack_spec_diff=json_diff(before_stack_services, after_stack_services, dump=True)) else: if docker_stack_services(module, name): rc, out, err = docker_stack_rm(module, name, absent_retries, absent_retries_interval) if rc != 0: module.fail_json(msg="'docker stack down' command failed", out=out, rc=rc, err=err) else: module.exit_json(changed=True, msg=out, err=err, rc=rc) module.exit_json(changed=False)
def _json_diff(d1: dict, d2: dict, **kwargs) -> str: dumper = JsonDumper(indent=2) kwargs = {"syntax": "symmetric", **kwargs} return json_diff(d1, d2, **kwargs, dumper=dumper, dump=True)