--- # Copyright 2016, Comcast Corp. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - name: Test config_template hosts: localhost connection: local gather_facts: yes tasks: # Test basic function of config_template - name: Template test INI template config_template: src: "{{ playbook_dir }}/templates/test.ini" dest: "/tmp/test.ini" config_overrides: "{{ test_config_ini_overrides }}" config_type: "ini" - name: Read test.ini slurp: src: /tmp/test.ini register: ini_file - debug: msg: "ini - {{ ini_file.content | b64decode }}" - name: Validate output assert: that: - "(lookup('ini', 'new_key section=DEFAULT file=/tmp/test.ini')) == 'new_value'" - "(lookup('ini', 'baz section=foo file=/tmp/test.ini')) == 'bar'" # Test basic function of config_template with content instead of src - name: Template test INI template config_template: content: "{{ lookup('file', playbook_dir + '/templates/test.ini') }}" dest: "/tmp/test_with_content.ini" config_overrides: "{{ test_config_ini_overrides }}" config_type: "ini" - name: Read test.ini slurp: src: /tmp/test_with_content.ini register: ini_file_with_content - debug: msg: "ini - {{ ini_file_with_content.content | b64decode }}" - name: Validate output assert: that: - "(lookup('ini', 'new_key section=DEFAULT file=/tmp/test_with_content.ini')) == 'new_value'" - "(lookup('ini', 'baz section=foo file=/tmp/test_with_content.ini')) == 'bar'" # Test list additions in config_template - name: Template test YML template config_template: src: "{{ playbook_dir }}/templates/test.yml" dest: "/tmp/test_extend.yml" config_overrides: "{{ test_config_yml_overrides }}" config_type: "yaml" list_extend: True - name: Read test_extend.yml slurp: src: /tmp/test_extend.yml register: extend_file - name: Read expected test_extend.yml slurp: src: "{{ playbook_dir }}/files/test_extend.yml.expected" register: extend_file_expected - debug: msg: "extend - {{ extend_file.content | b64decode }}" - debug: msg: "extend.expected - {{ extend_file_expected.content | b64decode }}" - name: Compare files assert: that: - "(extend_file.content | b64decode) == (extend_file_expected.content | b64decode)" # Test list replacement in config_template - name: Template test YML template config_template: src: "{{ playbook_dir }}/templates/test.yml" dest: "/tmp/test_no_extend.yml" config_overrides: "{{ test_config_yml_overrides }}" config_type: "yaml" list_extend: False - name: Read test_no_extend.yml slurp: src: /tmp/test_no_extend.yml register: no_extend_file - name: Read expected test_no_extend.yml slurp: src: "{{ playbook_dir }}/files/test_no_extend.yml.expected" register: no_extend_file_expected - debug: msg: "no_extend - {{ no_extend_file.content | b64decode }}" - debug: msg: "no_extend.expected - {{ no_extend_file_expected.content | b64decode }}" - name: Compare files assert: that: - "(no_extend_file.content | b64decode) == (no_extend_file_expected.content | b64decode)" # Test dumping hostvars using config overrides - name: Template test YML template with hostvars override config_template: src: "{{ playbook_dir }}/templates/test.yml" dest: "/tmp/test_hostvars.yml" config_overrides: "{{ test_config_yml_hostvars_overrides }}" config_type: "yaml" - name: Read test_hostvars.yml slurp: src: /tmp/test_hostvars.yml register: hostvars_file - debug: msg: "hostvars - {{ (hostvars_file.content | b64decode | from_yaml).test_hostvar }}" - debug: msg: "hostvars.expected - {{ test_config_yml_hostvars_overrides.test_hostvar }}" - name: Compare files assert: that: - "((hostvars_file.content | b64decode | from_yaml).test_hostvar) == (test_config_yml_hostvars_overrides.test_hostvar)" # Test multistropt ordering - name: Template MultiStrOpts using overrides config_template: src: test_multistropts.ini dest: /tmp/test_multistropts.ini config_overrides: testsection: test: output config_type: ini - name: Read test_multistropts.ini slurp: src: /tmp/test_multistropts.ini register: multistropts_file - name: Read test_multistropts.ini.expected slurp: src: files/test_multistropts.ini.expected register: multistropts_expected_file - debug: msg: "multistropts rendered - {{ multistropts_file.content | b64decode }}" - debug: msg: "multistropts expected - {{ multistropts_expected_file.content | b64decode }}" - name: Compare files assert: that: - "multistropts_file.content == multistropts_expected_file.content" # Test content attribute with a dictionary input and config_type equal to 'json' - name: Template test JSON template with content attribute config_template: dest: "/tmp/test_content_no_overrides.json" config_overrides: {} config_type: "json" content: "{{ lookup('file', playbook_dir ~ '/templates/test.json') | from_json }}" - name: Read test_content_no_overrides.json slurp: src: /tmp/test_content_no_overrides.json register: content_no_overrides_file - name: Read expected test_content_no_overrides.json slurp: src: "{{ playbook_dir }}/files/test_content_no_overrides.json.expected" register: content_no_overrides_file_expected - debug: msg: "content_no_overrides.json - {{ content_no_overrides_file.content | b64decode | from_json }}" - debug: msg: "content_no_overrides.json.expected - {{ content_no_overrides_file_expected.content | b64decode | from_json }}" # NOTE (alextricity25): The config_template module doesn't use ordered dicts when reading and writing json # data, so we can't guarantee that the string literal of both file's content will be the same. Instead, we compare # the content after transforming it into a dictionary. - name: Compare file content assert: that: - "(content_no_overrides_file.content | b64decode | from_json) == (content_no_overrides_file_expected.content | b64decode | from_json)" # Test the ignore_none_type attribute when set to False - name: Template test with ignore_none_type set to false config_template: src: "{{ playbook_dir }}/templates/test_ignore_none_type.ini" dest: "/tmp/test_ignore_none_type.ini" config_overrides: "{{ test_config_ini_overrides }}" config_type: "ini" ignore_none_type: False - name: Read test_ignore_none_type.ini slurp: src: /tmp/test_ignore_none_type.ini register: test_ignore_none_type - debug: msg: "test_ignore_none_type.ini - {{ test_ignore_none_type.content | b64decode }}" - name: Validate output has valueless options printed out assert: that: - "{{ test_ignore_none_type.content | b64decode | search('(?m)^india$') }}" - "{{ test_ignore_none_type.content | b64decode | search('(?m)^juliett kilo$') }}" # Test basic function of config_template - name: Template test INI comments config_template: src: "{{ playbook_dir }}/templates/test_with_comments.ini" dest: "/tmp/test_with_comments.ini" config_overrides: "{{ test_config_ini_overrides }}" config_type: "ini" tags: test - name: Read test.ini slurp: src: /tmp/test_with_comments.ini register: ini_file tags: test - debug: msg: "ini - {{ ini_file.content | b64decode }}" - name: Validate output tags: test assert: that: - "(lookup('ini', 'new_key section=DEFAULT file=/tmp/test_with_comments.ini')) == 'new_value'" - "(lookup('ini', 'baz section=foo file=/tmp/test_with_comments.ini')) == 'bar'" - "{{ ini_file.content | b64decode | search('#This is a comment')}}" - "{{ ini_file.content | b64decode | search('# A default section comment\n# broken into multiple lines\n\\[DEFAULT\\]')}}" - name: Template multiple times to assert no changes config_template: src: "{{ playbook_dir }}/templates/test_with_comments.ini" dest: "/tmp/test_with_comments.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 test_config_yml_hostvars_overrides: test_hostvar: "{{ ansible_default_ipv4.address }}"