使用 Ansible lineinfile 模块注释掉一行

Commenting out a line with Ansible lineinfile module

我很难相信没有任何内容涵盖此用例,但事实证明我的搜索毫无结果。

我在 /etc/fstab 中有一行用于安装不再可用的驱动器:

//archive/Pipeline /pipeline/Archives cifs ro,credentials=/home/username/.config/cifs 0   0

我要的是改成

#//archive/Pipeline /pipeline/Archives cifs ro,credentials=/home/username/.config/cifs 0   0

我正在使用这个

---
- hosts: slurm
  remote_user: root

  tasks:
    - name: Comment out pipeline archive in fstab
      lineinfile:
        dest: /etc/fstab
        regexp: '^//archive/pipeline'
        line: '#//archive/pipeline'
        state: present
      tags: update-fstab

期望它只插入注释符号 (#),但它替换了整行,我最终得到了

#//archive/Pipeline

有没有办法全局捕获该行的其余部分或只插入单个注释字符?

 regexp: '^//archive/pipeline *'
 line: '#//archive/pipeline *'

 regexp: '^//archive/pipeline *'
 line: '#//archive/pipeline '

我正在努力思考 lineinfile,而我"ve read it looks like insertafter is what I'm looking for, but "在“之后插入的内容”不是我想要的吗?

您可以为您的案例使用 replace 模块:

---
- hosts: slurm
  remote_user: root

  tasks:
    - name: Comment out pipeline archive in fstab
      replace:
        dest: /etc/fstab
        regexp: '^//archive/pipeline'
        replace: '#//archive/pipeline'
      tags: update-fstab

它将替换匹配 regexp.

的所有字符串 另一方面,

lineinfile 仅适用于一行(即使在一个文件中找到多个匹配)。它确保特定行不存在或存在定义的内容。

使用backrefs=yes:

Used with state=present. If set, line can contain backreferences (both positional and named) that will get populated if the regexp matches.

像这样:

- name: Comment out pipeline archive in fstab
  lineinfile:
    dest: /etc/fstab
    regexp: '(?i)^(//archive/pipeline.*)'
    line: '# '
    backrefs: yes
    state: present

另请注意,我对正则表达式使用 (?i) 选项,因为在示例 fstab 中,您的搜索表达式永远不会匹配 Pipeline 和大写 P。

这是 lineinfile 是反模式的众多原因之一。在许多情况下,模板是最好的解决方案。在这种情况下,mount 模块就是为此设计的。

- name: Remove the pipeline archive
  mount: name="/archive/pipeline" state=absent

但是"ah!"你说,你"want to preserve that the mount was in fstab at one time"。您通过使用 mount 做得更好,您将它保存在 ansible.