使用ansible如何从文件中删除一行?

13

我有一个名为authorized_keys的文件,需要使用Ansible脚本删除其中的一行。

问题在于,当我尝试删除包含“+”字符的行时,Ansible无法删除该行。

例如,authorized_keys文件如下:

 .....
 abhi foo+bar saken
 ......(EOF)

我想要移除abhi foo+bar saken这行,但是因为有+字符,Ansible无法删除这一行。

我可以移除不含+字符的行。

任务:

- name: Delete keys in sysadmin/.ssh/authoriezd_keys
  lineinfile: dest=/home/{{name}}/.ssh/authorized_keys
              state=absent 
              regexp='^{{key}}$' 

PS:我正在使用Ansible的lineinfile模块


请展示你的任务。你使用的是Windows/Linux/Mac操作系统? - udondan
我正在使用Linux,我刚刚更新了任务。 - Birendra Kumar
2
使用 lineinfile 通常意味着你最好写一个文件,可以使用 copytemplate。这样可以完全控制文件,而不必担心其内容。 - tedder42
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Birendra Kumar
3
你不使用一个模块来完成这个任务有没有特别的原因?这里是一个可以参考的模块链接:http://docs.ansible.com/authorized_key_module.html - Michal Gasek
是的,我需要经常更新授权密钥。基本上,我将我的Flask应用程序的cron作业放在那里。为此,当到达end_time时,我需要从授权文件(而不是文件)以及数据库中删除一个密钥。为此,我不能使用authorized_key模块。 - Birendra Kumar
1个回答

12

问题可能是正则表达式中的+有特定含义。

您应该通过转义+来解决它。如果您无法在定义{{ key }}的源代码中进行转义,可以使用replace Jinja 过滤器进行转义:

- name: Delete keys in sysadmin/.ssh/authoriezd_keys
  lineinfile: dest=/home/{{name}}/.ssh/authorized_keys
              state=absent
              regexp='^{{ key | replace("+", "\+") }}$'

如果{{ key }}中包含在正则表达式中有特殊意义的字符,那么你可能会遇到更多问题。如果是这种情况,我认为安全的方式是创建自己的过滤器插件,其中你只需要通过re.escape返回输入内容。


我尝试了你的解决方案,但对我不起作用。你能否提供其他方法来解决“+”字符的问题? - Birendra Kumar
你能试试多个反斜杠的变化吗?有趣的是,在评论区域无法发布反斜杠,呵呵!试试两个或三个反斜杠。 - udondan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接