diff --git a/examples/roles/subfolder/other_role/tasks/main.yml b/examples/roles/subfolder/other_role/tasks/main.yml new file mode 100644 index 0000000000..b4d7f48966 --- /dev/null +++ b/examples/roles/subfolder/other_role/tasks/main.yml @@ -0,0 +1,4 @@ +--- +- name: Foo + debug: + msg: "Hello!" diff --git a/src/ansiblelint/config.py b/src/ansiblelint/config.py index c9522af079..cd82b48ab6 100644 --- a/src/ansiblelint/config.py +++ b/src/ansiblelint/config.py @@ -37,6 +37,7 @@ "name[play]", "role-name", "warning[empty-playbook]", # because ansible considers it warning only + "role-name[path]", # too new ] DEFAULT_KINDS = [ diff --git a/src/ansiblelint/constants.py b/src/ansiblelint/constants.py index 26745acc30..602b723915 100644 --- a/src/ansiblelint/constants.py +++ b/src/ansiblelint/constants.py @@ -136,8 +136,10 @@ def main(): } ROLE_IMPORT_ACTION_NAMES = { - "import_role", "ansible.builtin.import_role", - "include_role", "ansible.builtin.include_role", + "ansible.legacy.import_role", + "ansible.legacy.include_role", + "import_role", + "include_role", } diff --git a/src/ansiblelint/rules/role_name.md b/src/ansiblelint/rules/role_name.md index 0cf0f4a6f2..28aa8b8b6d 100644 --- a/src/ansiblelint/rules/role_name.md +++ b/src/ansiblelint/rules/role_name.md @@ -7,6 +7,10 @@ Role names must also start with an alphabetic character. For more information see the [roles directory](https://docs.ansible.com/ansible/devel/dev_guide/developing_collections_structure.html#roles-directory) topic in Ansible documentation. +`role-name[path]` message tells you to avoid using paths when importing roles. +You should only rely on Ansible's ability to find the role and refer to them +using fully qualified names. + ## Problematic Code ```yaml diff --git a/src/ansiblelint/rules/role_name.py b/src/ansiblelint/rules/role_name.py index b48982e3b0..90386b8d05 100644 --- a/src/ansiblelint/rules/role_name.py +++ b/src/ansiblelint/rules/role_name.py @@ -23,8 +23,9 @@ import re from pathlib import Path -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any +from ansiblelint.constants import ROLE_IMPORT_ACTION_NAMES from ansiblelint.file_utils import Lintable from ansiblelint.rules import AnsibleLintRule from ansiblelint.utils import parse_yaml_from_file @@ -53,12 +54,30 @@ class RoleNames(AnsibleLintRule): severity = "HIGH" done: list[str] = [] # already noticed roles list tags = ["deprecations", "metadata"] - version_added = "v4.3.0" + version_added = "v6.8.5" def __init__(self) -> None: """Save precompiled regex.""" self._re = re.compile(ROLE_NAME_REGEX) + def matchtask( + self, task: dict[str, Any], file: Lintable | None = None + ) -> list[MatchError]: + results = [] + if task["action"]["__ansible_module__"] in ROLE_IMPORT_ACTION_NAMES: + name = task["action"].get("name", "") + # breakpoint() + if "/" in name: + results.append( + self.create_matcherror( + "Avoid using paths when importing roles.", + filename=file, + linenumber=task["__line__"], + tag=f"{self.id}[path]", + ) + ) + return results + def matchdir(self, lintable: Lintable) -> list[MatchError]: return self.matchyaml(lintable)