--- #################################################################### # WARNING: These are designed specifically for Ansible tests # # and should not be used as examples of how to write Ansible roles # #################################################################### # test code for ini_file plugins # (c) 2017 Red Hat Inc. # This file is part of Ansible # # Ansible is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Ansible is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Ansible. If not, see . - name: record the output directory set_fact: output_file={{ remote_tmp_dir }}/foo.ini - name: add "fav=lemonade" is in section "[drinks]" in specified file ini_file: path: "{{ output_file }}" section: drinks option: fav value: lemonade register: result1 - name: verify ini_file 'changed' is true assert: that: - result1 is changed - result1.msg == 'section and option added' - 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: expected1: | [drinks] fav = lemonade content1: "{{ output_content.content | b64decode }}" - name: Verify content of ini file is as expected assert: that: - content1 == expected1 - name: add "fav=lemonade" is in section "[drinks]" again ini_file: path: "{{ output_file }}" section: drinks option: fav value: lemonade register: result2 - name: Ensure unchanged assert: that: - result2 is not changed - result2.msg == 'OK' - name: Ensure "beverage=coke" is in section "[drinks]" ini_file: path: "{{ output_file }}" section: drinks option: beverage value: coke register: result3 - 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: expected3: | [drinks] fav = lemonade beverage = coke content3: "{{ output_content.content | b64decode }}" - name: assert 'changed' is true and content is OK assert: that: - result3 is changed - result3.msg == 'option added' - content3 == expected3 - name: Remove option "beverage=coke" ini_file: path: "{{ output_file }}" section: drinks option: beverage state: absent register: result4 - name: read content from output file slurp: src: "{{ output_file }}" register: output_content - name: get ini file content set_fact: content4: "{{ output_content.content | b64decode }}" - name: assert changed and content is as expected assert: that: - result4 is changed - result4.msg == 'option changed' - content4 == expected1 - name: remove section 'drinks' ini_file: path: "{{ output_file }}" section: drinks state: absent register: result5 - name: read content from output file slurp: src: "{{ output_file }}" register: output_content - name: get current ini file content set_fact: content5: "{{ output_content.content | b64decode }}" - name: assert changed and content is empty assert: that: - result5 is changed - result5.msg == 'section removed' - content5 == "\n" # allow_no_value - name: test allow_no_value ini_file: path: "{{ output_file }}" section: mysqld option: skip-name allow_no_value: yes register: result6 - name: assert section and option added assert: that: - result6 is changed - result6.msg == 'section and option added' - name: test allow_no_value idempotency ini_file: path: "{{ output_file }}" section: mysqld option: skip-name allow_no_value: yes register: result6 - name: assert 'changed' false assert: that: - result6 is not changed - result6.msg == 'OK' - name: test create empty section ini_file: path: "{{ output_file }}" section: new_empty_section allow_no_value: yes register: result6a - name: assert section added assert: that: - result6a is changed - result6a.msg == 'only section added' - name: test create empty section idempotency ini_file: path: "{{ output_file }}" section: new_empty_section allow_no_value: yes register: result6a - name: assert 'changed' false assert: that: - result6a is not changed - result6a.msg == 'OK' - name: test remove empty section ini_file: state: absent path: "{{ output_file }}" section: new_empty_section allow_no_value: yes - name: test allow_no_value with loop ini_file: path: "{{ output_file }}" section: mysqld option: "{{ item.o }}" value: "{{ item.v }}" allow_no_value: yes with_items: - { o: "skip-name-resolve", v: null } - { o: "max_connections", v: "500" } - 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: content7: "{{ output_content.content | b64decode }}" expected7: | [mysqld] skip-name skip-name-resolve max_connections = 500 - name: Verify content of ini file is as expected assert: that: - content7 == expected7 - name: change option with no value to option with value ini_file: path: "{{ output_file }}" section: mysqld option: skip-name value: myvalue register: result8 - 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: content8: "{{ output_content.content | b64decode }}" expected8: | [mysqld] skip-name = myvalue skip-name-resolve max_connections = 500 - name: assert 'changed' and msg 'option changed' and content is as expected assert: that: - result8 is changed - result8.msg == 'option changed' - content8 == expected8 - name: change option with value to option with no value ini_file: path: "{{ output_file }}" section: mysqld option: skip-name allow_no_value: yes register: result9 - 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: content9: "{{ output_content.content | b64decode }}" expected9: | [mysqld] skip-name skip-name-resolve max_connections = 500 - name: assert 'changed' and msg 'option changed' and content is as expected assert: that: - result9 is changed - result9.msg == 'option changed' - content9 == expected9 - name: Remove option with no value ini_file: path: "{{ output_file }}" section: mysqld option: skip-name-resolve state: absent register: result10 - 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: content10: "{{ output_content.content | b64decode }}" expected10: | [mysqld] skip-name max_connections = 500 - name: assert 'changed' and msg 'option changed' and content is as expected assert: that: - result10 is changed - result10.msg == 'option changed' - content10 == expected10 - name: Clean test file copy: content: "" dest: "{{ output_file }}" force: yes - name: Ensure "beverage=coke" is created within no section ini_file: section: path: "{{ output_file }}" option: beverage value: coke register: result11 - 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: expected11: "beverage = coke\n\n" content11: "{{ output_content.content | b64decode }}" - name: assert 'changed' is true and content is OK (no section) assert: that: - result11 is changed - result11.msg == 'option added' - content11 == expected11 - name: Ensure "beverage=coke" is modified as "beverage=water" within no section ini_file: path: "{{ output_file }}" option: beverage value: water section: register: result12 - 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: expected12: "beverage = water\n\n" content12: "{{ output_content.content | b64decode }}" - name: assert 'changed' is true and content is OK (no section) assert: that: - result12 is changed - result12.msg == 'option changed' - content12 == expected12 - name: remove option 'beverage' within no section ini_file: section: path: "{{ output_file }}" option: beverage state: absent register: result13 - name: read content from output file slurp: src: "{{ output_file }}" register: output_content - name: get current ini file content set_fact: content13: "{{ output_content.content | b64decode }}" - name: assert changed (no section) assert: that: - result13 is changed - result13.msg == 'option changed' - content13 == "\n" - name: Check add option without section before existing section block: - name: Add option with section ini_file: path: "{{ output_file }}" section: drinks option: beverage value: water - name: Add option without section ini_file: path: "{{ output_file }}" section: option: like value: tea - 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: expected14: | like = tea [drinks] beverage = water content14: "{{ output_content.content | b64decode }}" - name: Verify content of ini file is as expected 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 - name: Create starting ini file copy: # The content below is the following text file with BOM: # [section1] # var1=aaa # var2=bbb # [section2] # var3=ccc content: !!binary | 77u/W3NlY3Rpb24xXQp2YXIxPWFhYQp2YXIyPWJiYgpbc2VjdGlvbjJdCnZhcjM9Y2NjCg== dest: "{{ output_file }}" - name: Test ini breakage ini_file: path: "{{ output_file }}" section: section1 option: var4 value: 0 - 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: expected16: "[section1]\nvar1=aaa\nvar2=bbb\nvar4 = 0\n[section2]\nvar3=ccc\n" content16: "{{ output_content.content | b64decode }}" - debug: var: content16 - name: Verify content of ini file is as expected assert: that: - content16 == expected16 # Regression test for https://github.com/ansible-collections/community.general/pull/2578#issuecomment-868092282 - name: Create UTF-8 test file copy: content: !!binary | W2FwcDptYWluXQphdmFpbGFibGVfbGFuZ3VhZ2VzID0gZW4gZnIgZXMgZGUgcHQgamEgbHQgemhf VFcgaWQgZGEgcHRfQlIgcnUgc2wgaXQgbmxfTkwgdWsgdGEgc2kgY3MgbmIgaHUKIyBGdWxsIGxh bmd1YWdlIG5hbWVzIGluIG5hdGl2ZSBsYW5ndWFnZSAoY29tbWEgc2VwYXJhdGVkKQphdmFpbGFi bGVfbGFuZ3VhZ2VzX2Z1bGwgPSBFbmdsaXNoLCBGcmFuw6dhaXMsIEVzcGHDsW9sLCBEZXV0c2No LCBQb3J0dWd1w6pzLCDml6XmnKzoqp4sIExpZXR1dm9zLCDkuK3mlocsIEluZG9uZXNpYSwgRGFu c2ssIFBvcnR1Z3XDqnMgKEJyYXNpbCksINCg0YPRgdGB0LrQuNC5LCBTbG92ZW7FocSNaW5hLCBJ dGFsaWFubywgTmVkZXJsYW5kcywg0KPQutGA0LDRl9C90YHRjNC60LAsIOCupOCuruCuv+CutOCv jSwg4LeD4LeS4LaC4LeE4La9LCDEjGVza3ksIEJva23DpWwsIE1hZ3lhcgo= dest: '{{ output_file }}' - name: Add entries ini_file: section: "{{ item.section }}" option: "{{ item.option }}" value: "{{ item.value }}" path: '{{ output_file }}' create: true loop: - section: app:main option: sqlalchemy.url value: postgresql://app:secret@database/app - section: handler_filelog option: args value: (sys.stderr,) - section: handler_filelog option: class value: StreamHandler - section: handler_exc_handler option: args value: (sys.stderr,) - section: båz option: fföø value: ḃâŗ - section: båz option: fföø value: bar