While writing an Ansible Task to add a user to the sudoers file on a Linux distribution, I encountered an error that kept the Ansible Task from completing.
The error encountered was:
ERROR: Syntax Error while loading YAML script, playbooks/bootstrap.yml Note: The error may actually appear before this position: line 29, column 44 regexp="^james ALL" line='james ALL=(ALL) NOPASSWD: ALL'
The particular Ansible Task looked similar to the following:
- name: Add user james to sudoers action: lineinfile dest=/etc/sudoers state=present regexp="^james ALL" line='james ALL=(ALL) NOPASSWD: ALL'
This particular error happens because of the way the Python YAML parser works with colons within attributes (see the YAML Syntax Gotchas).
If the space between NOPASSWD: and ALL is removed, and the line looks like line='james ALL=(ALL) NOPASSWD:ALL', the error does not occur. However, this is incorrect sudoers syntax.
Commenter bcoca on an Ansible GitHub issue page provided a fix for this, and based on bcoca's comment, a working version of the Ansible Task above would look like the following:
- name: Add james to sudoers action: 'lineinfile dest=/etc/sudoers state=present regexp="^james ALL" line="james ALL=(ALL) NOPASSWD: ALL"'
The following is another fix, found on the Ansible lineinmodule Examples page:
- name: Add james to sudoers lineinfile: "dest=/etc/sudoers state=present regexp='^james ALL' line='james ALL=(ALL) NOPASSWD: ALL'"