Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)