diff --git a/changelogs/fragments/1972-ini_file-empty-str-value.yml b/changelogs/fragments/1972-ini_file-empty-str-value.yml new file mode 100644 index 0000000000..7beba5ac4c --- /dev/null +++ b/changelogs/fragments/1972-ini_file-empty-str-value.yml @@ -0,0 +1,2 @@ +bugfixes: + - ini_file - allows an empty string as a value for an option (https://github.com/ansible-collections/community.general/pull/1972). diff --git a/plugins/modules/files/ini_file.py b/plugins/modules/files/ini_file.py index e476c6e8d6..ac4c6d0cf3 100644 --- a/plugins/modules/files/ini_file.py +++ b/plugins/modules/files/ini_file.py @@ -114,9 +114,7 @@ from ansible.module_utils.basic import AnsibleModule def match_opt(option, line): option = re.escape(option) - return re.match('( |\t)*%s( |\t)*(=|$)' % option, line) \ - or re.match('#( |\t)*%s( |\t)*(=|$)' % option, line) \ - or re.match(';( |\t)*%s( |\t)*(=|$)' % option, line) + return re.match('[#;]?( |\t)*%s( |\t)*(=|$)' % option, line) def match_active_opt(option, line): @@ -251,9 +249,9 @@ def do_ini(module, filename, section=None, option=None, value=None, if not within_section and state == 'present': ini_lines.append('[%s]\n' % section) msg = 'section and option added' - if option and value: + if option and value is not None: ini_lines.append(assignment_format % (option, value)) - elif option and not value and allow_no_value: + elif option and value is None and allow_no_value: ini_lines.append('%s\n' % option) else: msg = 'only section added' @@ -312,7 +310,7 @@ def main(): allow_no_value = module.params['allow_no_value'] create = module.params['create'] - if state == 'present' and not allow_no_value and not value: + if state == 'present' and not allow_no_value and value is None: module.fail_json("Parameter 'value' must not be empty if state=present and allow_no_value=False") (changed, backup_file, diff, msg) = do_ini(module, path, section, option, value, state, backup, no_extra_spaces, create, allow_no_value) diff --git a/tests/integration/targets/ini_file/tasks/main.yml b/tests/integration/targets/ini_file/tasks/main.yml index 83b850809a..2e84147c72 100644 --- a/tests/integration/targets/ini_file/tasks/main.yml +++ b/tests/integration/targets/ini_file/tasks/main.yml @@ -444,3 +444,39 @@ assert: that: - content14 == expected14 + +- name: Check add option with empty string value + block: + - name: Remove drinks + ini_file: + path: "{{ output_file }}" + section: drinks + state: absent + - name: Remove tea + ini_file: + path: "{{ output_file }}" + section: + option: like + value: tea + state: absent + - name: Test with empty string + ini_file: + path: "{{ output_file }}" + section: extensions + option: evolve + value: "" + +- name: read content from output file + slurp: + src: "{{ output_file }}" + register: output_content + +- name: set expected content and get current ini file content + set_fact: + expected15: "\n[extensions]\nevolve = \n" + content15: "{{ output_content.content | b64decode }}" +- debug: var=content15 +- name: Verify content of ini file is as expected + assert: + that: + - content15 == expected15