Skip to content

no-free-form

This rule identifies any use of free-form module calling syntax and asks for switching to the full syntax.

Free-form syntax, also known as inline or shorthand, can produce subtle bugs. It can also prevent editors and IDEs from providing feedback, autocomplete and validation for the edited line.

Note

As long you just pass a YAML string that contains a = character inside as the parameter to the action module name, we consider this as using free-form syntax. Be sure you pass a dictionary to the module, so the free-form parsing is never triggered.

As raw module only accepts free-form, we trigger no-free-form[raw] only if we detect the presence of executable= inside raw calls. We advise the explicit use of args: for configuring the executable to be run.

This rule can produce messages as:

  • no-free-form - Free-form syntax is discouraged.
  • no-free-form[raw-non-string] - Passing a non-string value to raw module is neither documented nor supported.

Problematic code

---
- name: Example with discouraged free-form syntax
  hosts: localhost
  tasks:
    - name: Create a placefolder file
      ansible.builtin.command: chdir=/tmp touch foo # <-- don't use free-form
    - name: Use raw to echo
      ansible.builtin.raw: executable=/bin/bash echo foo # <-- don't use executable=
      changed_when: false

Correct code

---
- name: Example that avoids free-form syntax
  hosts: localhost
  tasks:
    - name: Create a placefolder file
      ansible.builtin.command:
        cmd: touch foo # <-- ansible will not touch it
        chdir: /tmp
    - name: Use raw to echo
      ansible.builtin.raw: echo foo
      args:
        executable: /bin/bash # <-- explicit is better
      changed_when: false

Note

This rule can be automatically fixed using --fix option.