如何用 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 中使用 shell
和 sed
,而是 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 关于将 \t
与 sed
一起使用的信息。使用 \t
不适用于每个版本的 sed
.
再说一次:不要使用这个!请改用替换模块!
对于这个 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 中使用 shell
和 sed
,而是 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
) 和方括号。
查看
第二个:
您的代码无法正常工作,因为您没有正确引用字符串。
这应该有效(感谢 Zeitonautor):
shell: "sed -i -e \"s/# %wheel\tALL=(ALL)\tNOPASSWD: ALL/%wheel\tALL=(ALL)\tNOPASSWD: ALL/g\" /etc/sudoers"
同时检查 this post 关于将 \t
与 sed
一起使用的信息。使用 \t
不适用于每个版本的 sed
.
再说一次:不要使用这个!请改用替换模块!