【问题标题】:How to replace character in files with Ansible?如何用 Ansible 替换文件中的字符?
【发布时间】:2021-07-04 03:11:49
【问题描述】:

对于这个可靠的任务:

- 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

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

【问题讨论】:

  • learnxinyminutes.com/docs/yaml。长话短说(一种可能的方式):shell: "sed -i -e \"s/# %wheel\\tALL=(ALL)\\tNOPASSWD: ALL/%wheel\\tALL=(ALL)\\tNOPASSWD: ALL/g\" /etc/sudoers"。同时,请看下面的答案,不要使用shell

标签: replace syntax ansible


【解决方案1】:

首先:
您不应该在 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) 和括号。
查看 this question 了解如何管理 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 的每个版本。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-21
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多