如何用 Ansible 替换文件中的字符?

How to replace character in files with Ansible?

对于这个 ansible 任务:

- name: wheel sudoers
  shell: sed -i -e "s/# %wheel\tALL=(ALL)\tNOPASSWD: ALL/%wheel\tALL=(ALL)\tNOPASSWD: ALL/g" /etc/sudoers

需要将 # %wheel\tALL=(ALL)\tNOPASSWD: ALL 替换为 %wheel\tALL=(ALL)\tNOPASSWD: ALL

但是这个语法在第一个 NOPASSWD: 区域后出错:

X mapping values are not allowed in this context

为什么我不能使用这种语法?

首先:
你不应该在 ansible 中使用 shellsed,而是 replace 模块。
例如:

- name: Allow sudo without password
  ansible.builtin.replace:
    path: /etc/sudoers
    regexp: '# %wheel\tALL=\(ALL\)\tNOPASSWD: ALL'
    replace: '%wheel ALL=(ALL) NOPASSWD: ALL'

查看 python doc 如何编写正确的正则表达式,espc。对于制表符 (\t) 和方括号。
查看 了解如何管理 sudoers。

第二个:
您的代码无法正常工作,因为您没有正确引用字符串。
这应该有效(感谢 Zeitonautor):

shell: "sed -i -e \"s/# %wheel\tALL=(ALL)\tNOPASSWD: ALL/%wheel\tALL=(ALL)\tNOPASSWD: ALL/g\" /etc/sudoers"

同时检查 this post 关于将 \tsed 一起使用的信息。使用 \t 不适用于每个版本的 sed.

再说一次:不要使用这个!请改用替换模块!