mirror of
https://github.com/thegeeklab/ansible-later.git
synced 2024-11-24 13:50:41 +00:00
refactor: use lint-like rule identifier (#757)
This commit is contained in:
parent
80ac8ec34d
commit
2f4e35d83c
@ -18,8 +18,8 @@ HostVars
|
|||||||
Rolesfile
|
Rolesfile
|
||||||
Makefile
|
Makefile
|
||||||
Jinja2
|
Jinja2
|
||||||
ANSIBLE([0-9]{4})
|
ANS([0-9]{3})
|
||||||
LINT([0-9]{4})
|
YML([0-9]{3})
|
||||||
SCM
|
SCM
|
||||||
bools
|
bools
|
||||||
Check[A-Z].+
|
Check[A-Z].+
|
||||||
|
@ -41,10 +41,10 @@ class Candidate:
|
|||||||
excludes = self.config["rules"]["exclude_filter"]
|
excludes = self.config["rules"]["exclude_filter"]
|
||||||
|
|
||||||
if len(includes) == 0:
|
if len(includes) == 0:
|
||||||
includes = [s.sid for s in self.rules]
|
includes = [s.rid for s in self.rules]
|
||||||
|
|
||||||
for rule in self.rules:
|
for rule in self.rules:
|
||||||
if rule.sid in includes and rule.sid not in excludes:
|
if rule.rid in includes and rule.rid not in excludes:
|
||||||
target_rules.append(rule)
|
target_rules.append(rule)
|
||||||
|
|
||||||
return target_rules
|
return target_rules
|
||||||
@ -60,7 +60,7 @@ class Candidate:
|
|||||||
result = rule.check(self, self.config)
|
result = rule.check(self, self.config)
|
||||||
|
|
||||||
if not result:
|
if not result:
|
||||||
LOG.error(f"rule '{rule.sid}' returns an empty result object. Check failed!")
|
LOG.error(f"rule '{rule.rid}' returns an empty result object. Check failed!")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
labels = {
|
labels = {
|
||||||
@ -70,23 +70,23 @@ class Candidate:
|
|||||||
"passed": True,
|
"passed": True,
|
||||||
}
|
}
|
||||||
|
|
||||||
if rule.sid and rule.sid.strip():
|
if rule.rid and rule.rid.strip():
|
||||||
labels["sid"] = rule.sid
|
labels["rid"] = rule.rid
|
||||||
|
|
||||||
for err in result.errors:
|
for err in result.errors:
|
||||||
err_labels = copy.copy(labels)
|
err_labels = copy.copy(labels)
|
||||||
err_labels["passed"] = False
|
err_labels["passed"] = False
|
||||||
|
|
||||||
sid = self._format_id(rule.sid)
|
rid = self._format_id(rule.rid)
|
||||||
path = self.path
|
path = self.path
|
||||||
description = rule.description
|
description = rule.description
|
||||||
|
|
||||||
if isinstance(err, RuleBase.Error):
|
if isinstance(err, RuleBase.Error):
|
||||||
err_labels.update(err.to_dict())
|
err_labels.update(err.to_dict())
|
||||||
|
|
||||||
msg = f"{sid}rule '{description}' not met:\n{path}:{err}"
|
msg = f"{rid}rule '{description}' not met:\n{path}:{err}"
|
||||||
|
|
||||||
if rule.sid not in self.config["rules"]["warning_filter"]:
|
if rule.rid not in self.config["rules"]["warning_filter"]:
|
||||||
LOG.error(msg, extra=flag_extra(err_labels))
|
LOG.error(msg, extra=flag_extra(err_labels))
|
||||||
errors = errors + 1
|
errors = errors + 1
|
||||||
else:
|
else:
|
||||||
@ -138,9 +138,9 @@ class Candidate:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def _format_id(self, rule_id):
|
def _format_id(self, rule_id):
|
||||||
sid = rule_id.strip()
|
rid = rule_id.strip()
|
||||||
if sid:
|
if rid:
|
||||||
rule_id = f"[{sid}] "
|
rule_id = f"[{rid}] "
|
||||||
|
|
||||||
return rule_id
|
return rule_id
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ from ansiblelater.utils.yamlhelper import (
|
|||||||
class RuleMeta(type):
|
class RuleMeta(type):
|
||||||
def __call__(cls, *args):
|
def __call__(cls, *args):
|
||||||
mcls = type.__call__(cls, *args)
|
mcls = type.__call__(cls, *args)
|
||||||
mcls.sid = cls.sid
|
mcls.rid = cls.rid
|
||||||
mcls.description = getattr(cls, "description", "__unknown__")
|
mcls.description = getattr(cls, "description", "__unknown__")
|
||||||
mcls.helptext = getattr(cls, "helptext", "")
|
mcls.helptext = getattr(cls, "helptext", "")
|
||||||
mcls.types = getattr(cls, "types", [])
|
mcls.types = getattr(cls, "types", [])
|
||||||
@ -46,7 +46,7 @@ class RuleBase(metaclass=RuleExtendedMeta):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def sid(self):
|
def rid(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
@ -334,10 +334,10 @@ class RulesLoader:
|
|||||||
)
|
)
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
normalized_std = list(toolz.remove(lambda x: x.sid == "", self.rules))
|
normalize_rule = list(toolz.remove(lambda x: x.rid == "", self.rules))
|
||||||
unique_std = len(list(toolz.unique(normalized_std, key=lambda x: x.sid)))
|
unique_rule = len(list(toolz.unique(normalize_rule, key=lambda x: x.rid)))
|
||||||
all_std = len(normalized_std)
|
all_rules = len(normalize_rule)
|
||||||
if all_std != unique_std:
|
if all_rules != unique_rule:
|
||||||
sysexit_with_message(
|
sysexit_with_message(
|
||||||
"Found duplicate tags in rules definition. Please use unique tags only."
|
"Found duplicate tags in rules definition. Please use unique tags only."
|
||||||
)
|
)
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckBecomeUser(RuleBase):
|
class CheckBecomeUser(RuleBase):
|
||||||
sid = "ANSIBLE0015"
|
rid = "ANS115"
|
||||||
description = "Become should be combined with become_user"
|
description = "Become should be combined with become_user"
|
||||||
helptext = "the task has `become` enabled but `become_user` is missing"
|
helptext = "the task has `become` enabled but `become_user` is missing"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -5,7 +5,7 @@ from ansiblelater.utils import count_spaces
|
|||||||
|
|
||||||
|
|
||||||
class CheckBracesSpaces(RuleBase):
|
class CheckBracesSpaces(RuleBase):
|
||||||
sid = "ANSIBLE0004"
|
rid = "ANS104"
|
||||||
description = "YAML should use consistent number of spaces around variables"
|
description = "YAML should use consistent number of spaces around variables"
|
||||||
helptext = "no suitable numbers of spaces (min: {min} max: {max})"
|
helptext = "no suitable numbers of spaces (min: {min} max: {max})"
|
||||||
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
||||||
|
@ -22,7 +22,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckChangedInWhen(RuleBase):
|
class CheckChangedInWhen(RuleBase):
|
||||||
sid = "ANSIBLE0026"
|
rid = "ANS126"
|
||||||
description = "Use handlers instead of `when: changed`"
|
description = "Use handlers instead of `when: changed`"
|
||||||
helptext = "tasks using `when: result.changed` setting are effectively acting as a handler"
|
helptext = "tasks using `when: result.changed` setting are effectively acting as a handler"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckCommandHasChanges(RuleBase):
|
class CheckCommandHasChanges(RuleBase):
|
||||||
sid = "ANSIBLE0011"
|
rid = "ANS111"
|
||||||
description = "Commands should be idempotent"
|
description = "Commands should be idempotent"
|
||||||
helptext = (
|
helptext = (
|
||||||
"commands should only read while using `changed_when` or try to be "
|
"commands should only read while using `changed_when` or try to be "
|
||||||
|
@ -24,7 +24,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckCommandInsteadOfArgument(RuleBase):
|
class CheckCommandInsteadOfArgument(RuleBase):
|
||||||
sid = "ANSIBLE0017"
|
rid = "ANS117"
|
||||||
description = "Commands should not be used in place of module arguments"
|
description = "Commands should not be used in place of module arguments"
|
||||||
helptext = "{exec} used in place of file modules argument {arg}"
|
helptext = "{exec} used in place of file modules argument {arg}"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -4,7 +4,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckCommandInsteadOfModule(RuleBase):
|
class CheckCommandInsteadOfModule(RuleBase):
|
||||||
sid = "ANSIBLE0008"
|
rid = "ANS108"
|
||||||
description = "Commands should not be used in place of modules"
|
description = "Commands should not be used in place of modules"
|
||||||
helptext = "{exec} command used in place of {module} module"
|
helptext = "{exec} command used in place of {module} module"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -5,7 +5,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckCompareToEmptyString(RuleBase):
|
class CheckCompareToEmptyString(RuleBase):
|
||||||
sid = "ANSIBLE0012"
|
rid = "ANS112"
|
||||||
description = 'Don\'t compare to empty string ""'
|
description = 'Don\'t compare to empty string ""'
|
||||||
helptext = "use `when: var` rather than `when: var !=` (or conversely `when: not var`)"
|
helptext = "use `when: var` rather than `when: var !=` (or conversely `when: not var`)"
|
||||||
types = ["playbook", "task", "handler", "template"]
|
types = ["playbook", "task", "handler", "template"]
|
||||||
|
@ -5,7 +5,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckCompareToLiteralBool(RuleBase):
|
class CheckCompareToLiteralBool(RuleBase):
|
||||||
sid = "ANSIBLE0013"
|
rid = "ANS113"
|
||||||
description = "Don't compare to True or False"
|
description = "Don't compare to True or False"
|
||||||
helptext = "use `when: var` rather than `when: var == True` (or conversely `when: not var`)"
|
helptext = "use `when: var` rather than `when: var == True` (or conversely `when: not var`)"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckDeprecated(RuleBase):
|
class CheckDeprecated(RuleBase):
|
||||||
sid = "ANSIBLE9999"
|
rid = "ANS999"
|
||||||
description = "Deprecated features should not be used"
|
description = "Deprecated features should not be used"
|
||||||
helptext = "`{old}` is deprecated and should not be used anymore. Use `{new}` instead."
|
helptext = "`{old}` is deprecated and should not be used anymore. Use `{new}` instead."
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -25,7 +25,7 @@ from ansiblelater.utils import has_glob, has_jinja
|
|||||||
|
|
||||||
|
|
||||||
class CheckDeprecatedBareVars(RuleBase):
|
class CheckDeprecatedBareVars(RuleBase):
|
||||||
sid = "ANSIBLE0027"
|
rid = "ANS127"
|
||||||
description = "Deprecated bare variables in loops must not be used"
|
description = "Deprecated bare variables in loops must not be used"
|
||||||
helptext = (
|
helptext = (
|
||||||
"bare var '{barevar}' in '{loop_type}' must use full var syntax '{{{{ {barevar} }}}}' "
|
"bare var '{barevar}' in '{loop_type}' must use full var syntax '{{{{ {barevar} }}}}' "
|
||||||
|
@ -23,7 +23,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckFilePermissionMissing(RuleBase):
|
class CheckFilePermissionMissing(RuleBase):
|
||||||
sid = "ANSIBLE0018"
|
rid = "ANS118"
|
||||||
description = "File permissions unset or incorrect"
|
description = "File permissions unset or incorrect"
|
||||||
helptext = (
|
helptext = (
|
||||||
"`mode` parameter should set permissions explicitly (e.g. `mode: 0644`) "
|
"`mode` parameter should set permissions explicitly (e.g. `mode: 0644`) "
|
||||||
|
@ -22,7 +22,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckFilePermissionOctal(RuleBase):
|
class CheckFilePermissionOctal(RuleBase):
|
||||||
sid = "ANSIBLE0019"
|
rid = "ANS119"
|
||||||
description = "Octal file permissions must contain leading zero or be a string"
|
description = "Octal file permissions must contain leading zero or be a string"
|
||||||
helptext = "numeric file permissions without leading zero can behave in unexpected ways"
|
helptext = "numeric file permissions without leading zero can behave in unexpected ways"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -4,7 +4,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckFilterSeparation(RuleBase):
|
class CheckFilterSeparation(RuleBase):
|
||||||
sid = "ANSIBLE0016"
|
rid = "ANS116"
|
||||||
description = "Jinja2 filters should be separated with spaces"
|
description = "Jinja2 filters should be separated with spaces"
|
||||||
helptext = "no suitable numbers of spaces (required: 1)"
|
helptext = "no suitable numbers of spaces (required: 1)"
|
||||||
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars"]
|
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars"]
|
||||||
|
@ -22,7 +22,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckGitHasVersion(RuleBase):
|
class CheckGitHasVersion(RuleBase):
|
||||||
sid = "ANSIBLE0020"
|
rid = "ANS120"
|
||||||
description = "Git checkouts should use explicit version"
|
description = "Git checkouts should use explicit version"
|
||||||
helptext = "git checkouts should point to an explicit commit or tag, not `latest`"
|
helptext = "git checkouts should point to an explicit commit or tag, not `latest`"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckInstallUseLatest(RuleBase):
|
class CheckInstallUseLatest(RuleBase):
|
||||||
sid = "ANSIBLE0009"
|
rid = "ANS109"
|
||||||
description = "Package installs should use present, not latest"
|
description = "Package installs should use present, not latest"
|
||||||
helptext = "package installs should use `state=present` with or without a version"
|
helptext = "package installs should use `state=present` with or without a version"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -4,7 +4,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckLiteralBoolFormat(RuleBase):
|
class CheckLiteralBoolFormat(RuleBase):
|
||||||
sid = "ANSIBLE0014"
|
rid = "ANS114"
|
||||||
description = "Literal bools should be consistent"
|
description = "Literal bools should be consistent"
|
||||||
helptext = "literal bools should be written as `{bools}`"
|
helptext = "literal bools should be written as `{bools}`"
|
||||||
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars"]
|
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars"]
|
||||||
|
@ -4,7 +4,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckLocalAction(RuleBase):
|
class CheckLocalAction(RuleBase):
|
||||||
sid = "ANSIBLE0024"
|
rid = "ANS124"
|
||||||
description = "Don't use local_action"
|
description = "Don't use local_action"
|
||||||
helptext = "`delegate_to: localhost` should be used instead of `local_action`"
|
helptext = "`delegate_to: localhost` should be used instead of `local_action`"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -5,7 +5,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckMetaChangeFromDefault(RuleBase):
|
class CheckMetaChangeFromDefault(RuleBase):
|
||||||
sid = "ANSIBLE0021"
|
rid = "ANS121"
|
||||||
description = "Roles meta/main.yml default values should be changed"
|
description = "Roles meta/main.yml default values should be changed"
|
||||||
helptext = "meta/main.yml default values should be changed for: `{field}`"
|
helptext = "meta/main.yml default values should be changed for: `{field}`"
|
||||||
types = ["meta"]
|
types = ["meta"]
|
||||||
|
@ -4,7 +4,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckMetaMain(RuleBase):
|
class CheckMetaMain(RuleBase):
|
||||||
sid = "ANSIBLE0002"
|
rid = "ANS102"
|
||||||
description = "Roles must contain suitable meta/main.yml"
|
description = "Roles must contain suitable meta/main.yml"
|
||||||
helptext = "file should contain `{key}` key"
|
helptext = "file should contain `{key}` key"
|
||||||
types = ["meta"]
|
types = ["meta"]
|
||||||
|
@ -4,7 +4,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckNameFormat(RuleBase):
|
class CheckNameFormat(RuleBase):
|
||||||
sid = "ANSIBLE0007"
|
rid = "ANS107"
|
||||||
description = "Name of tasks and handlers must be formatted"
|
description = "Name of tasks and handlers must be formatted"
|
||||||
helptext = "name `{name}` should start with uppercase"
|
helptext = "name `{name}` should start with uppercase"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckNamedTask(RuleBase):
|
class CheckNamedTask(RuleBase):
|
||||||
sid = "ANSIBLE0006"
|
rid = "ANS106"
|
||||||
description = "Tasks and handlers must be named"
|
description = "Tasks and handlers must be named"
|
||||||
helptext = "module `{module}` used without or empty `name` attribute"
|
helptext = "module `{module}` used without or empty `name` attribute"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckNativeYaml(RuleBase):
|
class CheckNativeYaml(RuleBase):
|
||||||
sid = "LINT0008"
|
rid = "YML108"
|
||||||
description = "Use YAML format for tasks and handlers rather than key=value"
|
description = "Use YAML format for tasks and handlers rather than key=value"
|
||||||
helptext = "task arguments appear to be in key value rather than YAML format"
|
helptext = "task arguments appear to be in key value rather than YAML format"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -25,7 +25,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckNestedJinja(RuleBase):
|
class CheckNestedJinja(RuleBase):
|
||||||
sid = "ANSIBLE0023"
|
rid = "ANS123"
|
||||||
description = "Don't use nested Jinja2 pattern"
|
description = "Don't use nested Jinja2 pattern"
|
||||||
helptext = (
|
helptext = (
|
||||||
"there should not be any nested jinja pattern "
|
"there should not be any nested jinja pattern "
|
||||||
|
@ -4,7 +4,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckRelativeRolePaths(RuleBase):
|
class CheckRelativeRolePaths(RuleBase):
|
||||||
sid = "ANSIBLE0025"
|
rid = "ANS125"
|
||||||
description = "Don't use a relative path in a role"
|
description = "Don't use a relative path in a role"
|
||||||
helptext = "`copy` and `template` modules don't need relative path for `src`"
|
helptext = "`copy` and `template` modules don't need relative path for `src`"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -4,7 +4,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckScmInSrc(RuleBase):
|
class CheckScmInSrc(RuleBase):
|
||||||
sid = "ANSIBLE0005"
|
rid = "ANS105"
|
||||||
description = "Use `scm:` key rather than `src: scm+url`"
|
description = "Use `scm:` key rather than `src: scm+url`"
|
||||||
helptext = "usage of `src: scm+url` not recommended"
|
helptext = "usage of `src: scm+url` not recommended"
|
||||||
types = ["rolesfile"]
|
types = ["rolesfile"]
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckShellInsteadCommand(RuleBase):
|
class CheckShellInsteadCommand(RuleBase):
|
||||||
sid = "ANSIBLE0010"
|
rid = "ANS110"
|
||||||
description = "Shell should only be used when essential"
|
description = "Shell should only be used when essential"
|
||||||
helptext = "shell should only be used when piping, redirecting or chaining commands"
|
helptext = "shell should only be used when piping, redirecting or chaining commands"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -5,7 +5,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckTaskSeparation(RuleBase):
|
class CheckTaskSeparation(RuleBase):
|
||||||
sid = "ANSIBLE0001"
|
rid = "ANS101"
|
||||||
description = "Single tasks should be separated by empty line"
|
description = "Single tasks should be separated by empty line"
|
||||||
helptext = "missing task separation (required: 1 empty line)"
|
helptext = "missing task separation (required: 1 empty line)"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -4,7 +4,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckUniqueNamedTask(RuleBase):
|
class CheckUniqueNamedTask(RuleBase):
|
||||||
sid = "ANSIBLE0003"
|
rid = "ANS103"
|
||||||
description = "Tasks and handlers must be uniquely named within a single file"
|
description = "Tasks and handlers must be uniquely named within a single file"
|
||||||
helptext = "name `{name}` appears multiple times"
|
helptext = "name `{name}` appears multiple times"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckWhenFormat(RuleBase):
|
class CheckWhenFormat(RuleBase):
|
||||||
sid = "ANSIBLE0022"
|
rid = "ANS122"
|
||||||
description = "Don't use Jinja2 in when"
|
description = "Don't use Jinja2 in when"
|
||||||
helptext = (
|
helptext = (
|
||||||
"`when` is a raw Jinja2 expression, redundant {{ }} " "should be removed from variable(s)"
|
"`when` is a raw Jinja2 expression, redundant {{ }} " "should be removed from variable(s)"
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckYamlColons(RuleBase):
|
class CheckYamlColons(RuleBase):
|
||||||
sid = "LINT0005"
|
rid = "YML105"
|
||||||
description = "YAML should use consistent number of spaces around colons"
|
description = "YAML should use consistent number of spaces around colons"
|
||||||
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckYamlDocumentEnd(RuleBase):
|
class CheckYamlDocumentEnd(RuleBase):
|
||||||
sid = "LINT0009"
|
rid = "YML109"
|
||||||
description = "YAML should contain document end marker"
|
description = "YAML should contain document end marker"
|
||||||
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckYamlDocumentStart(RuleBase):
|
class CheckYamlDocumentStart(RuleBase):
|
||||||
sid = "LINT0004"
|
rid = "YML104"
|
||||||
description = "YAML should contain document start marker"
|
description = "YAML should contain document start marker"
|
||||||
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckYamlEmptyLines(RuleBase):
|
class CheckYamlEmptyLines(RuleBase):
|
||||||
sid = "LINT0001"
|
rid = "YML101"
|
||||||
description = "YAML should not contain unnecessarily empty lines"
|
description = "YAML should not contain unnecessarily empty lines"
|
||||||
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckYamlFile(RuleBase):
|
class CheckYamlFile(RuleBase):
|
||||||
sid = "LINT0006"
|
rid = "YML106"
|
||||||
description = "Roles file should be in yaml format"
|
description = "Roles file should be in yaml format"
|
||||||
helptext = "file does not have a .yml extension"
|
helptext = "file does not have a .yml extension"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckYamlHasContent(RuleBase):
|
class CheckYamlHasContent(RuleBase):
|
||||||
sid = "LINT0007"
|
rid = "YML107"
|
||||||
description = "Files should contain useful content"
|
description = "Files should contain useful content"
|
||||||
helptext = "the file appears to have no useful content"
|
helptext = "the file appears to have no useful content"
|
||||||
types = ["playbook", "task", "handler", "rolevars", "defaults", "meta"]
|
types = ["playbook", "task", "handler", "rolevars", "defaults", "meta"]
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckYamlHyphens(RuleBase):
|
class CheckYamlHyphens(RuleBase):
|
||||||
sid = "LINT0003"
|
rid = "YML103"
|
||||||
description = "YAML should use consistent number of spaces after hyphens"
|
description = "YAML should use consistent number of spaces after hyphens"
|
||||||
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ from ansiblelater.rule import RuleBase
|
|||||||
|
|
||||||
|
|
||||||
class CheckYamlIndent(RuleBase):
|
class CheckYamlIndent(RuleBase):
|
||||||
sid = "LINT0002"
|
rid = "YML102"
|
||||||
description = "YAML should not contain unnecessarily empty lines"
|
description = "YAML should not contain unnecessarily empty lines"
|
||||||
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"]
|
||||||
|
|
||||||
|
@ -123,8 +123,8 @@ class Settings:
|
|||||||
"include_filter": [],
|
"include_filter": [],
|
||||||
"exclude_filter": [],
|
"exclude_filter": [],
|
||||||
"warning_filter": [
|
"warning_filter": [
|
||||||
"ANSIBLE9999",
|
"ANS999",
|
||||||
"ANSIBLE9998",
|
"ANS998",
|
||||||
],
|
],
|
||||||
"ignore_dotfiles": True,
|
"ignore_dotfiles": True,
|
||||||
"exclude_files": [],
|
"exclude_files": [],
|
||||||
|
@ -9,7 +9,7 @@ A typical rule check will look like:
|
|||||||
{{< highlight Python "linenos=table" >}}
|
{{< highlight Python "linenos=table" >}}
|
||||||
class CheckBecomeUser(RuleBase):
|
class CheckBecomeUser(RuleBase):
|
||||||
|
|
||||||
sid = "ANSIBLE0015"
|
rid = "ANS115"
|
||||||
description = "Become should be combined with become_user"
|
description = "Become should be combined with become_user"
|
||||||
helptext = "the task has `become` enabled but `become_user` is missing"
|
helptext = "the task has `become` enabled but `become_user` is missing"
|
||||||
types = ["playbook", "task", "handler"]
|
types = ["playbook", "task", "handler"]
|
||||||
|
@ -16,19 +16,19 @@ ansible:
|
|||||||
# directory will be auto-detected and don't need to be added to this list.
|
# directory will be auto-detected and don't need to be added to this list.
|
||||||
custom_modules: []
|
custom_modules: []
|
||||||
|
|
||||||
# Settings for variable formatting rule (ANSIBLE0004)
|
# Settings for variable formatting rule (ANS104)
|
||||||
double-braces:
|
double-braces:
|
||||||
max-spaces-inside: 1
|
max-spaces-inside: 1
|
||||||
min-spaces-inside: 1
|
min-spaces-inside: 1
|
||||||
|
|
||||||
# List of allowed literal bools (ANSIBLE0014)
|
# List of allowed literal bools (ANS114)
|
||||||
literal-bools:
|
literal-bools:
|
||||||
- "True"
|
- "True"
|
||||||
- "False"
|
- "False"
|
||||||
- "yes"
|
- "yes"
|
||||||
- "no"
|
- "no"
|
||||||
|
|
||||||
# List of modules that don't need to be named (ANSIBLE0006).
|
# List of modules that don't need to be named (ANS106).
|
||||||
# You must specify each individual module name, globs or wildcards do not work!
|
# You must specify each individual module name, globs or wildcards do not work!
|
||||||
named-task:
|
named-task:
|
||||||
exclude:
|
exclude:
|
||||||
@ -41,7 +41,7 @@ ansible:
|
|||||||
- "import_role"
|
- "import_role"
|
||||||
- "import_tasks"
|
- "import_tasks"
|
||||||
|
|
||||||
# List of modules that are allowed to use the key=value format instead of the native YAML format (LINT0008).
|
# List of modules that are allowed to use the key=value format instead of the native YAML format (YML108).
|
||||||
# You must specify each individual module name, globs or wildcards do not work!
|
# You must specify each individual module name, globs or wildcards do not work!
|
||||||
native-yaml:
|
native-yaml:
|
||||||
exclude: []
|
exclude: []
|
||||||
@ -77,8 +77,8 @@ rules:
|
|||||||
# List of rule ID's that should be displayed as a warning instead of an error. By default,
|
# List of rule ID's that should be displayed as a warning instead of an error. By default,
|
||||||
# no rules are marked as warnings. This list allows to degrade errors to warnings for each rule.
|
# no rules are marked as warnings. This list allows to degrade errors to warnings for each rule.
|
||||||
warning_filter:
|
warning_filter:
|
||||||
- "ANSIBLE9999"
|
- "ANS999"
|
||||||
- "ANSIBLE9998"
|
- "ANS998"
|
||||||
|
|
||||||
# All dotfiles (including hidden folders) are excluded by default.
|
# All dotfiles (including hidden folders) are excluded by default.
|
||||||
# You can disable this setting and handle dotfiles by yourself with `exclude_files`.
|
# You can disable this setting and handle dotfiles by yourself with `exclude_files`.
|
||||||
|
@ -5,41 +5,41 @@ title: Included rules
|
|||||||
Reviews are useless without some rules to check against. `ansible-later` comes with a set of built-in checks, which are explained in the following table.
|
Reviews are useless without some rules to check against. `ansible-later` comes with a set of built-in checks, which are explained in the following table.
|
||||||
|
|
||||||
| Rule | ID | Description | Parameter |
|
| Rule | ID | Description | Parameter |
|
||||||
| ----------------------------- | ----------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------- |
|
| ----------------------------- | ------ | ----------------------------------------------------------------- | ---------------------------------------------------------------------- |
|
||||||
| CheckYamlEmptyLines | LINT0001 | YAML should not contain unnecessarily empty lines. | {max: 1, max-start: 0, max-end: 1} |
|
| CheckYamlEmptyLines | YML101 | YAML should not contain unnecessarily empty lines. | {max: 1, max-start: 0, max-end: 1} |
|
||||||
| CheckYamlIndent | LINT0002 | YAML should be correctly indented. | {spaces: 2, check-multi-line-strings: false, indent-sequences: true} |
|
| CheckYamlIndent | YML102 | YAML should be correctly indented. | {spaces: 2, check-multi-line-strings: false, indent-sequences: true} |
|
||||||
| CheckYamlHyphens | LINT0003 | YAML should use consistent number of spaces after hyphens (-). | {max-spaces-after: 1} |
|
| CheckYamlHyphens | YML103 | YAML should use consistent number of spaces after hyphens (-). | {max-spaces-after: 1} |
|
||||||
| CheckYamlDocumentStart | LINT0004 | YAML should contain document start marker. | {document-start: {present: true}} |
|
| CheckYamlDocumentStart | YML104 | YAML should contain document start marker. | {document-start: {present: true}} |
|
||||||
| CheckYamlColons | LINT0005 | YAML should use consistent number of spaces around colons. | {colons: {max-spaces-before: 0, max-spaces-after: 1}} |
|
| CheckYamlColons | YML105 | YAML should use consistent number of spaces around colons. | {colons: {max-spaces-before: 0, max-spaces-after: 1}} |
|
||||||
| CheckYamlFile | LINT0006 | Roles file should be in YAML format. | |
|
| CheckYamlFile | YML106 | Roles file should be in YAML format. | |
|
||||||
| CheckYamlHasContent | LINT0007 | Files should contain useful content. | |
|
| CheckYamlHasContent | YML107 | Files should contain useful content. | |
|
||||||
| CheckNativeYaml | LINT0008 | Use YAML format for tasks and handlers rather than key=value. | {native-yaml: {exclude: []}} |
|
| CheckNativeYaml | YML108 | Use YAML format for tasks and handlers rather than key=value. | {native-yaml: {exclude: []}} |
|
||||||
| CheckYamlDocumentEnd | LINT0009 | YAML should contain document end marker. | {document-end: {present: true}} |
|
| CheckYamlDocumentEnd | YML109 | YAML should contain document end marker. | {document-end: {present: true}} |
|
||||||
| CheckTaskSeparation | ANSIBLE0001 | Single tasks should be separated by an empty line. | |
|
| CheckTaskSeparation | ANS101 | Single tasks should be separated by an empty line. | |
|
||||||
| CheckMetaMain | ANSIBLE0002 | Meta file should contain a basic subset of parameters. | author, description, min_ansible_version, platforms, dependencies |
|
| CheckMetaMain | ANS102 | Meta file should contain a basic subset of parameters. | author, description, min_ansible_version, platforms, dependencies |
|
||||||
| CheckUniqueNamedTask | ANSIBLE0003 | Tasks and handlers must be uniquely named within a file. | |
|
| CheckUniqueNamedTask | ANS103 | Tasks and handlers must be uniquely named within a file. | |
|
||||||
| CheckBraces | ANSIBLE0004 | YAML should use consistent number of spaces around variables. | {double-braces: max-spaces-inside: 1, min-spaces-inside: 1} |
|
| CheckBraces | ANS104 | YAML should use consistent number of spaces around variables. | {double-braces: max-spaces-inside: 1, min-spaces-inside: 1} |
|
||||||
| CheckScmInSrc | ANSIBLE0005 | Use SCM key rather than `src: scm+url` in requirements file. | |
|
| CheckScmInSrc | ANS105 | Use SCM key rather than `src: scm+url` in requirements file. | |
|
||||||
| CheckNamedTask | ANSIBLE0006 | Tasks and handlers must be named. | {named-task: {exclude: [meta, debug, block, include\_\*, import\_\*]}} |
|
| CheckNamedTask | ANS106 | Tasks and handlers must be named. | {named-task: {exclude: [meta, debug, block, include\_\*, import\_\*]}} |
|
||||||
| CheckNameFormat | ANSIBLE0007 | Name of tasks and handlers must be formatted. | formats: first letter capital |
|
| CheckNameFormat | ANS107 | Name of tasks and handlers must be formatted. | formats: first letter capital |
|
||||||
| CheckCommandInsteadofModule | ANSIBLE0008 | Commands should not be used in place of modules. | |
|
| CheckCommandInsteadofModule | ANS108 | Commands should not be used in place of modules. | |
|
||||||
| CheckInstallUseLatest | ANSIBLE0009 | Package managers should not install with state=latest. | |
|
| CheckInstallUseLatest | ANS109 | Package managers should not install with state=latest. | |
|
||||||
| CheckShellInsteadCommand | ANSIBLE0010 | Use Shell only when piping, redirecting or chaining commands. | |
|
| CheckShellInsteadCommand | ANS110 | Use Shell only when piping, redirecting or chaining commands. | |
|
||||||
| CheckCommandHasChanges | ANSIBLE0011 | Commands should be idempotent and only used with some checks. | |
|
| CheckCommandHasChanges | ANS111 | Commands should be idempotent and only used with some checks. | |
|
||||||
| CheckCompareToEmptyString | ANSIBLE0012 | Don't compare to "" - use `when: var` or `when: not var`. | |
|
| CheckCompareToEmptyString | ANS112 | Don't compare to "" - use `when: var` or `when: not var`. | |
|
||||||
| CheckCompareToLiteralBool | ANSIBLE0013 | Don't compare to True/False - use `when: var` or `when: not var`. | |
|
| CheckCompareToLiteralBool | ANS113 | Don't compare to True/False - use `when: var` or `when: not var`. | |
|
||||||
| CheckLiteralBoolFormat | ANSIBLE0014 | Literal bools should be consistent. | {literal-bools: [True, False, yes, no]} |
|
| CheckLiteralBoolFormat | ANS114 | Literal bools should be consistent. | {literal-bools: [True, False, yes, no]} |
|
||||||
| CheckBecomeUser | ANSIBLE0015 | Become should be combined with become_user. | |
|
| CheckBecomeUser | ANS115 | Become should be combined with become_user. | |
|
||||||
| CheckFilterSeparation | ANSIBLE0016 | Jinja2 filters should be separated with spaces. | |
|
| CheckFilterSeparation | ANS116 | Jinja2 filters should be separated with spaces. | |
|
||||||
| CheckCommandInsteadOfArgument | ANSIBLE0017 | Commands should not be used in place of module arguments. | |
|
| CheckCommandInsteadOfArgument | ANS117 | Commands should not be used in place of module arguments. | |
|
||||||
| CheckFilePermissionMissing | ANSIBLE0018 | File permissions unset or incorrect. | |
|
| CheckFilePermissionMissing | ANS118 | File permissions unset or incorrect. | |
|
||||||
| CheckFilePermissionOctal | ANSIBLE0019 | Octal file permissions must contain leading zero or be a string. | |
|
| CheckFilePermissionOctal | ANS119 | Octal file permissions must contain leading zero or be a string. | |
|
||||||
| CheckGitHasVersion | ANSIBLE0020 | Git checkouts should use explicit version. | |
|
| CheckGitHasVersion | ANS120 | Git checkouts should use explicit version. | |
|
||||||
| CheckMetaChangeFromDefault | ANSIBLE0021 | Roles meta/main.yml default values should be changed. | |
|
| CheckMetaChangeFromDefault | ANS121 | Roles meta/main.yml default values should be changed. | |
|
||||||
| CheckWhenFormat | ANSIBLE0022 | Don't use Jinja2 in `when`. | |
|
| CheckWhenFormat | ANS122 | Don't use Jinja2 in `when`. | |
|
||||||
| CheckNestedJinja | ANSIBLE0023 | Don't use nested Jinja2 pattern. | |
|
| CheckNestedJinja | ANS123 | Don't use nested Jinja2 pattern. | |
|
||||||
| CheckLocalAction | ANSIBLE0024 | Don't use local_action. | |
|
| CheckLocalAction | ANS124 | Don't use local_action. | |
|
||||||
| CheckRelativeRolePaths | ANSIBLE0025 | Don't use a relative path in a role. | |
|
| CheckRelativeRolePaths | ANS125 | Don't use a relative path in a role. | |
|
||||||
| CheckChangedInWhen | ANSIBLE0026 | Use handlers instead of `when: changed`. | |
|
| CheckChangedInWhen | ANS126 | Use handlers instead of `when: changed`. | |
|
||||||
| CheckChangedInWhen | ANSIBLE0027 | Deprecated bare variables in loops must not be used. | |
|
| CheckChangedInWhen | ANS127 | Deprecated bare variables in loops must not be used. | |
|
||||||
| CheckDeprecated | ANSIBLE9999 | Deprecated features of `ansible-later` should not be used. | |
|
| CheckDeprecated | ANS999 | Deprecated features of `ansible-later` should not be used. | |
|
||||||
|
Loading…
Reference in New Issue
Block a user