Open ajalab opened 5 months ago
Hi, I'm experiencing the same issue.
I can add that I see it with registered_var is skipped
and registered_var is failed
as well.
It appears the issue only occurs when the following conditions are true:
registered_var is skipped
) is in the vars section of a task -> task 3 does not fail lintingregistered_var is skipped
in it is used in the task -> task 4 does not fail lintingOnly for task 2 do I receive the linting error like the original report:
An unhandled exception occurred while templating '{{ task_result is skipped }}'. Error was a <class 'ansible.errors.AnsibleFilterError'>, original message: The 'skipped' test expects a dictionary
- name: Task 1
ansible.builtin.debug:
msg: "Placeholder message"
register: task_result
- name: Task 2
ansible.builtin.debug:
msg: "Task 1 was skipped: {{ task_skipped }}"
vars:
task_skipped: "{{ task_result is skipped }}"
- name: Task 3
ansible.builtin.debug:
msg: "Task 1 was skipped: {{ task_result is skipped }}"
- name: Task 4
ansible.builtin.debug:
msg: "Task 1 was skipped: false"
vars:
task_skipped: "{{ task_result is skipped }}"
Summary
False
jinja[invalid]
rule violation withAnsibleFilterError
occurs, when we usechanged
filter for a registered variable in other variables defined invars
of a subsequent task.Issue Type
OS / ENVIRONMENT
pip install ansible-lint@git+https://github.com/ansible/ansible-lint.git
pip install ansible-lint
STEPS TO REPRODUCE
Prepare an Ansible playbook file
playbook.yml
with the below content.Then run
ansible-lint
.Desired Behavior
There should be no ansible-lint violations detected, since this
playbook.yml
should be a valid playbook file.Actual Behavior
It warns a
jinja[invalid]
violation only forPrint echo result with vars (violates jinja[invalid])
task.It's strange that the violation is reported for only the latter task. The two tasks
Print echo result
Print echo result with vars (violates jinja[invalid])
are equivalent except for the use of
changed
filter invars
section.Appendix
Playbook execution result
```console $ ansible-playbook playbook.yml [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' PLAY [Playbook] **************************************************************************************************************************************************************************************************************************** TASK [Echo] ******************************************************************************************************************************************************************************************************************************** changed: [localhost] TASK [Print echo result] ******************************************************************************************************************************************************************************************************************* ok: [localhost] => { "msg": "Result: changed" } TASK [Print echo result with vars (violates jinja[invalid])] ****************************************************************************************************************************************************************************** ok: [localhost] => { "msg": "Result: changed" } PLAY RECAP ********************************************************************************************************************************************************************************************************************************* localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ```Result of ansible-lint with verbose flags
```console $ ansible-lint -vvvv DEBUG Logging initialized to level 10 INFO Identified / as project root due file system root. DEBUG Options: Options(_skip_ansible_syntax_check=False, cache_dir=PosixPath('/Users/jp25308/.cache/ansible-compat/e3b0c4'), colored=True, configured=True, cwd=PosixPath('/Users/jp25308/tmp/ansible/lint-copy-result'), display_relative_path=True, exclude_paths=['.cache', '.git', '.hg', '.svn', '.tox'], format=None, lintables=[], list_rules=False, list_tags=False, write_list=[], parseable=False, quiet=0, rulesdirs=[PosixPath('/Users/jp25308/tmp/ansible/.env/lib/python3.12/site-packages/ansiblelint/rules')], skip_list=[], tags=[], verbosity=4, warn_list=['experimental', 'jinja', 'fqcn'], mock_filters=[], mock_modules=[], mock_roles=[], loop_var_prefix=None, only_builtins_allow_collections=[], only_builtins_allow_modules=[], var_naming_pattern=None, offline=None, project_dir='/', extra_vars=None, enable_list=[], skip_action_validation=True, strict=False, rules={}, profile=None, task_name_prefix='{stem} | ', sarif_file=None, config_file=None, generate_ignore=False, rulesdir=[], use_default_rules=False, version=False, list_profiles=False, ignore_file=None, max_tasks=100, max_block_depth=20) DEBUG CWD: /Users/jp25308/tmp/ansible/lint-copy-result DEBUG Logging initialized to level 10 DEBUG Effective yamllint rules used: {'anchors': {'level': 'error', 'forbid-undeclared-aliases': True, 'forbid-duplicated-anchors': False, 'forbid-unused-anchors': False}, 'braces': {'level': 'error', 'forbid': False, 'min-spaces-inside': 0, 'max-spaces-inside': 1, 'min-spaces-inside-empty': -1, 'max-spaces-inside-empty': -1}, 'brackets': {'level': 'error', 'forbid': False, 'min-spaces-inside': 0, 'max-spaces-inside': 0, 'min-spaces-inside-empty': -1, 'max-spaces-inside-empty': -1}, 'colons': {'level': 'error', 'max-spaces-before': 0, 'max-spaces-after': 1}, 'commas': {'level': 'error', 'max-spaces-before': 0, 'min-spaces-after': 1, 'max-spaces-after': 1}, 'comments': {'level': 'warning', 'require-starting-space': True, 'ignore-shebangs': True, 'min-spaces-from-content': 1}, 'comments-indentation': False, 'document-end': False, 'document-start': False, 'empty-lines': {'level': 'error', 'max': 2, 'max-start': 0, 'max-end': 0}, 'empty-values': False, 'float-values': False, 'hyphens': {'level': 'error', 'max-spaces-after': 1}, 'indentation': {'level': 'error', 'spaces': 'consistent', 'indent-sequences': True, 'check-multi-line-strings': False}, 'key-duplicates': {'level': 'error', 'forbid-duplicated-merge-keys': False}, 'key-ordering': False, 'line-length': {'level': 'error', 'max': 160, 'allow-non-breakable-words': True, 'allow-non-breakable-inline-mappings': False}, 'new-line-at-end-of-file': {'level': 'error'}, 'new-lines': {'level': 'error', 'type': 'unix'}, 'octal-values': {'forbid-implicit-octal': True, 'forbid-explicit-octal': True, 'level': 'error'}, 'quoted-strings': False, 'trailing-spaces': {'level': 'error'}, 'truthy': {'level': 'warning', 'allowed-values': ['true', 'false'], 'check-keys': True}} INFO Set ANSIBLE_LIBRARY=/Users/jp25308/.cache/ansible-compat/bc51c2/modules:/Users/jp25308/.ansible/plugins/modules:/usr/share/ansible/plugins/modules INFO Set ANSIBLE_COLLECTIONS_PATH=/Users/jp25308/.cache/ansible-compat/bc51c2/collections:/Users/jp25308/.ansible/collections:/usr/share/ansible/collections:/Users/jp25308/tmp/ansible/.env/lib/python3.12/site-packages INFO Set ANSIBLE_ROLES_PATH=/Users/jp25308/.cache/ansible-compat/bc51c2/roles:/Users/jp25308/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles DEBUG Effective yamllint rules used: {'anchors': {'level': 'error', 'forbid-undeclared-aliases': True, 'forbid-duplicated-anchors': False, 'forbid-unused-anchors': False}, 'braces': {'level': 'error', 'forbid': False, 'min-spaces-inside': 0, 'max-spaces-inside': 1, 'min-spaces-inside-empty': -1, 'max-spaces-inside-empty': -1}, 'brackets': {'level': 'error', 'forbid': False, 'min-spaces-inside': 0, 'max-spaces-inside': 0, 'min-spaces-inside-empty': -1, 'max-spaces-inside-empty': -1}, 'colons': {'level': 'error', 'max-spaces-before': 0, 'max-spaces-after': 1}, 'commas': {'level': 'error', 'max-spaces-before': 0, 'min-spaces-after': 1, 'max-spaces-after': 1}, 'comments': {'level': 'warning', 'require-starting-space': True, 'ignore-shebangs': True, 'min-spaces-from-content': 1}, 'comments-indentation': False, 'document-end': False, 'document-start': False, 'empty-lines': {'level': 'error', 'max': 2, 'max-start': 0, 'max-end': 0}, 'empty-values': False, 'float-values': False, 'hyphens': {'level': 'error', 'max-spaces-after': 1}, 'indentation': {'level': 'error', 'spaces': 'consistent', 'indent-sequences': True, 'check-multi-line-strings': False}, 'key-duplicates': {'level': 'error', 'forbid-duplicated-merge-keys': False}, 'key-ordering': False, 'line-length': {'level': 'error', 'max': 160, 'allow-non-breakable-words': True, 'allow-non-breakable-inline-mappings': False}, 'new-line-at-end-of-file': {'level': 'error'}, 'new-lines': {'level': 'error', 'type': 'unix'}, 'octal-values': {'forbid-implicit-octal': True, 'forbid-explicit-octal': True, 'level': 'error'}, 'quoted-strings': False, 'trailing-spaces': {'level': 'error'}, 'truthy': {'level': 'warning', 'allowed-values': ['true', 'false'], 'check-keys': True}} DEBUG Logging initialized to level 10 DEBUG Effective yamllint rules used: {'anchors': {'level': 'error', 'forbid-undeclared-aliases': True, 'forbid-duplicated-anchors': False, 'forbid-unused-anchors': False}, 'braces': {'level': 'error', 'forbid': False, 'min-spaces-inside': 0, 'max-spaces-inside': 1, 'min-spaces-inside-empty': -1, 'max-spaces-inside-empty': -1}, 'brackets': {'level': 'error', 'forbid': False, 'min-spaces-inside': 0, 'max-spaces-inside': 0, 'min-spaces-inside-empty': -1, 'max-spaces-inside-empty': -1}, 'colons': {'level': 'error', 'max-spaces-before': 0, 'max-spaces-after': 1}, 'commas': {'level': 'error', 'max-spaces-before': 0, 'min-spaces-after': 1, 'max-spaces-after': 1}, 'comments': {'level': 'warning', 'require-starting-space': True, 'ignore-shebangs': True, 'min-spaces-from-content': 1}, 'comments-indentation': False, 'document-end': False, 'document-start': False, 'empty-lines': {'level': 'error', 'max': 2, 'max-start': 0, 'max-end': 0}, 'empty-values': False, 'float-values': False, 'hyphens': {'level': 'error', 'max-spaces-after': 1}, 'indentation': {'level': 'error', 'spaces': 'consistent', 'indent-sequences': True, 'check-multi-line-strings': False}, 'key-duplicates': {'level': 'error', 'forbid-duplicated-merge-keys': False}, 'key-ordering': False, 'line-length': {'level': 'error', 'max': 160, 'allow-non-breakable-words': True, 'allow-non-breakable-inline-mappings': False}, 'new-line-at-end-of-file': {'level': 'error'}, 'new-lines': {'level': 'error', 'type': 'unix'}, 'octal-values': {'forbid-implicit-octal': True, 'forbid-explicit-octal': True, 'level': 'error'}, 'quoted-strings': False, 'trailing-spaces': {'level': 'error'}, 'truthy': {'level': 'warning', 'allowed-values': ['true', 'false'], 'check-keys': True}} INFO Set ANSIBLE_LIBRARY=/Users/jp25308/.cache/ansible-compat/bc51c2/modules:/Users/jp25308/.ansible/plugins/modules:/usr/share/ansible/plugins/modules INFO Set ANSIBLE_COLLECTIONS_PATH=/Users/jp25308/.cache/ansible-compat/bc51c2/collections:/Users/jp25308/.ansible/collections:/usr/share/ansible/collections:/Users/jp25308/tmp/ansible/.env/lib/python3.12/site-packages INFO Set ANSIBLE_ROLES_PATH=/Users/jp25308/.cache/ansible-compat/bc51c2/roles:/Users/jp25308/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles DEBUG data set to None for .ansible-lint-bak due to being '' (unknown) kind. INFO Executing syntax check on playbook playbook.yml (0.35s) DEBUG Examining playbook.yml of type playbook DEBUG Running rule internal-error DEBUG Running rule load-failure DEBUG Running rule parser-error DEBUG Running rule warning DEBUG Running rule yaml DEBUG Running rule args DEBUG Running rule avoid-implicit DEBUG Running rule command-instead-of-module DEBUG Running rule command-instead-of-shell DEBUG Running rule complexity DEBUG Running rule deprecated-bare-vars DEBUG Running rule deprecated-local-action DEBUG Running rule deprecated-module DEBUG Running rule fqcn DEBUG Running rule galaxy DEBUG Running rule ignore-errors DEBUG Running rule inline-env-var DEBUG Running rule jinja DEBUG NAME 'echo_result' (prefix='') DEBUG NAME 'is' (prefix=' ') DEBUG NAME 'changed' (prefix=' ') DEBUG NEWLINE '\n' (prefix=' ') DEBUG ENDMARKER '' (prefix='') DEBUG Stop. DEBUG NAME 'echo_result' (prefix='') DEBUG NAME 'is' (prefix=' ') DEBUG NAME 'changed' (prefix=' ') DEBUG NEWLINE '\n' (prefix='') DEBUG ENDMARKER '' (prefix='') DEBUG Stop. DEBUG ENDMARKER '' (prefix='\n') DEBUG Stop. DEBUG ENDMARKER '' (prefix='\n') DEBUG Stop. DEBUG NAME 'echo_result' (prefix='') DEBUG NAME 'is' (prefix=' ') DEBUG NAME 'changed' (prefix=' ') DEBUG NEWLINE '\n' (prefix=' ') DEBUG ENDMARKER '' (prefix='') DEBUG Stop. DEBUG NAME 'echo_result' (prefix='') DEBUG NAME 'is' (prefix=' ') DEBUG NAME 'changed' (prefix=' ') DEBUG NEWLINE '\n' (prefix='') DEBUG ENDMARKER '' (prefix='') DEBUG Stop. DEBUG ENDMARKER '' (prefix='\n') DEBUG Stop. DEBUG ENDMARKER '' (prefix='\n') DEBUG Stop. DEBUG Running rule key-order DEBUG Running rule latest DEBUG Running rule literal-compare DEBUG Running rule loop-var-prefix DEBUG Running rule meta-incorrect DEBUG Running rule meta-no-tags DEBUG Running rule meta-runtime DEBUG Running rule meta-video-links DEBUG Running rule name DEBUG Running rule no-changed-when DEBUG Running rule no-free-form DEBUG Running rule no-handler DEBUG Running rule no-jinja-when DEBUG Running rule no-relative-paths DEBUG Running rule no-tabs DEBUG Running rule package-latest DEBUG Running rule partial-become DEBUG Running rule playbook-extension DEBUG Running rule risky-file-permissions DEBUG Running rule risky-octal DEBUG Running rule risky-shell-pipe DEBUG Running rule role-name DEBUG Running rule run-once DEBUG Running rule sanity DEBUG Running rule schema DEBUG Running rule var-naming WARNING Listing 1 violation(s) that are fatal jinja[invalid]: An unhandled exception occurred while templating '{% if echo_result is changed %}changed{% else %}ok{% endif %}'. Error was a