diff --git a/changelogs/fragments/220_synchronize_add_quiet_option.yml b/changelogs/fragments/220_synchronize_add_quiet_option.yml new file mode 100644 index 0000000..e64a50c --- /dev/null +++ b/changelogs/fragments/220_synchronize_add_quiet_option.yml @@ -0,0 +1,2 @@ +minor_changes: +- synchronize - add the ``quiet`` option to suppress non-error messages (https://github.com/ansible-collections/ansible.posix/issues/171). diff --git a/plugins/modules/synchronize.py b/plugins/modules/synchronize.py index 40fae71..9bbd307 100644 --- a/plugins/modules/synchronize.py +++ b/plugins/modules/synchronize.py @@ -8,7 +8,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type - DOCUMENTATION = r''' --- module: synchronize @@ -186,6 +185,12 @@ options: type: bool default: true version_added: '1.3.0' + quiet: + description: + - This option specifies quiet option which on true suppresses the output. + type: bool + default: no + version_added: '1.3.0' notes: - rsync must be installed on both the local and remote host. @@ -343,6 +348,12 @@ EXAMPLES = r''' src: /tmp/localpath/ dest: /tmp/remotepath rsync_path: /usr/gnu/bin/rsync + +- name: Synchronization with quiet option enabled + ansible.posix.synchronize: + src: some/relative/path + dest: /some/absolute/path + quiet: yes ''' @@ -419,6 +430,7 @@ def main(): delay_updates=dict(type='bool', default=True), mode=dict(type='str', default='push', choices=['pull', 'push']), link_dest=dict(type='list', elements='str'), + quiet=dict(type='bool', default=False) ), supports_check_mode=True, ) @@ -459,6 +471,7 @@ def main(): verify_host = module.params['verify_host'] link_dest = module.params['link_dest'] delay_updates = module.params['delay_updates'] + quiet = module.params['quiet'] if '/' not in rsync: rsync = module.get_bin_path(rsync, required=True) @@ -589,6 +602,9 @@ def main(): cmd.append(shlex_quote(source)) cmd.append(shlex_quote(dest)) + if quiet: + cmd.append('--quiet') + cmdstr = ' '.join(cmd) # If we are using password authentication, write the password into the pipe @@ -621,14 +637,17 @@ def main(): out_lines = out_clean.split('\n') while '' in out_lines: out_lines.remove('') - if module._diff: - diff = {'prepared': out_clean} - return module.exit_json(changed=changed, msg=out_clean, - rc=rc, cmd=cmdstr, stdout_lines=out_lines, - diff=diff) - return module.exit_json(changed=changed, msg=out_clean, - rc=rc, cmd=cmdstr, stdout_lines=out_lines) + result = dict(changed=changed, rc=rc, cmd=cmdstr, stdout_lines=out_lines, msg=out_clean) + + if quiet: + changes = out.count(changed_marker) if changed else 0 + result['msg'] = "%s files/directories have been synchronized" % changes + + if module._diff: + result['diff'] = {'prepared': out_clean} + + return module.exit_json(**result) if __name__ == '__main__': diff --git a/tests/integration/targets/synchronize/tasks/main.yml b/tests/integration/targets/synchronize/tasks/main.yml index 125a406..ba9ff87 100644 --- a/tests/integration/targets/synchronize/tasks/main.yml +++ b/tests/integration/targets/synchronize/tasks/main.yml @@ -265,46 +265,34 @@ - directory_a/foo.txt - directory_a - directory_b - -- name: setup - test for source with working dir with spaces in path - file: - state: directory - path: '{{output_dir}}/{{item}}' - delegate_to: '{{ inventory_hostname }}' - with_items: - - 'directory a' - - 'directory b' -- name: setup - create test new files - copy: - dest: '{{output_dir}}/directory a/{{item}}' - mode: '0644' - content: 'hello world' - with_items: - - foo.txt - delegate_to: '{{ inventory_hostname }}' -- name: copy source with spaces in dir path +- name: synchronize files with quiet option synchronize: - src: '{{output_dir}}/directory a/foo.txt' - dest: '{{output_dir}}/directory b/' - delegate_to: '{{ inventory_hostname }}' + src: '{{ output_dir }}/foo.txt' + dest: '{{ output_dir }}/foo.result' + quiet: true register: sync_result - ignore_errors: true -- name: get stat information for directory_b - stat: - path: '{{ output_dir }}/directory b/foo.txt' - register: stat_result_b - assert: that: - - '''changed'' in sync_result' - - sync_result.changed == true - - stat_result_b.stat.exists == True - - stat_result_b.stat.checksum == '2aae6c35c94fcfb415dbe95f408b9ce91ee846ed' + - '''files/directories have been synchronized'' in sync_result.msg' - name: Cleanup file: state: absent - path: '{{output_dir}}/{{item}}' - with_items: - - 'directory b/foo.txt' - - 'directory a/foo.txt' - - 'directory a' - - 'directory b' + path: '{{ output_dir }}/{{ item }}' + loop: + - foo.result + - bar.result +- name: synchronize files without quiet option + synchronize: + src: '{{ output_dir }}/foo.txt' + dest: '{{ output_dir }}/foo.result' + register: sync_result +- assert: + that: + - '''files/directories have been synchronized'' not in sync_result.msg' +- name: Cleanup + file: + state: absent + path: '{{ output_dir }}/{{ item }}' + loop: + - foo.result + - bar.result