diff --git a/action/_v1_config_template.py b/action/_v1_config_template.py index 7ba07270..546b4c1e 100644 --- a/action/_v1_config_template.py +++ b/action/_v1_config_template.py @@ -145,14 +145,14 @@ class ConfigTemplateParser(ConfigParser.RawConfigParser): def write(self, fp): if self._defaults: fp.write("[%s]\n" % 'DEFAULT') - for key, value in self._defaults.items(): + for key, value in sorted(self._defaults.items()): self._write_check(fp, key=key, value=value) else: fp.write("\n") - for section in self._sections: + for section in sorted(self._sections): fp.write("[%s]\n" % section) - for key, value in self._sections[section].items(): + for key, value in sorted(self._sections[section].items()): self._write_check(fp, key=key, value=value, section=True) else: fp.write("\n") diff --git a/action/_v2_config_template.py b/action/_v2_config_template.py index 3209d3ac..d64e9e57 100644 --- a/action/_v2_config_template.py +++ b/action/_v2_config_template.py @@ -188,14 +188,14 @@ class ConfigTemplateParser(ConfigParser.RawConfigParser): def write(self, fp): if self._defaults: fp.write("[%s]\n" % 'DEFAULT') - for key, value in self._defaults.items(): + for key, value in sorted(self._defaults.items()): self._write_check(fp, key=key, value=value) else: fp.write("\n") - for section in self._sections: + for section in sorted(self._sections): fp.write("[%s]\n" % section) - for key, value in self._sections[section].items(): + for key, value in sorted(self._sections[section].items()): self._write_check(fp, key=key, value=value, section=True) else: fp.write("\n") diff --git a/tests/test-config_template.yml b/tests/test-config_template.yml index 95757658..2e966bd0 100644 --- a/tests/test-config_template.yml +++ b/tests/test-config_template.yml @@ -177,12 +177,56 @@ - "{{ test_ignore_none_type.content | b64decode | search('(?m)^india$') }}" - "{{ test_ignore_none_type.content | b64decode | search('(?m)^juliett kilo$') }}" + - name: Template multiple times to assert no changes + config_template: + src: "{{ playbook_dir }}/templates/test.ini" + dest: "/tmp/test_with_content.ini" + config_type: "ini" + config_overrides: "{{ item[1] }}" + register: template_changed + failed_when: template_changed | changed + with_nested: + - [ 0, 1, 2 ] + - [ "{{ test_config_ini_overrides }}" ] + vars: test_config_ini_overrides: DEFAULT: new_key: "new_value" foo: baz: "bar" + section1: + key1: "value1" + key2: "value2" + key3: "value3" + key4: "value4" + key5: "value5" + key6: "value6" + key7: "value7" + key8: "value8" + key9: "value9" + key10: "value10" + key11: "value11" + section2: + key1: "value1" + section3: + key1: "value1" + section4: + key1: "value1" + section5: + key1: "value1" + section6: + key1: "value1" + section7: + key1: "value1" + section8: + key1: "value1" + section9: + key1: "value1" + section10: + key1: "value1" + section11: + key1: "value1" test_config_yml_overrides: list_one: - four