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'"