用Ansible lineinfile模块注释掉一行

dat*_*kid 13 ansible ansible-playbook

我发现很难相信没有任何内容涵盖这个用例,但我的搜索结果证明没有结果.

我有一条线路/etc/fstab来装载一个不再可用的驱动器:

//archive/Pipeline /pipeline/Archives cifs ro,credentials=/home/username/.config/cifs 0   0
Run Code Online (Sandbox Code Playgroud)

我想要的是改变它

#//archive/Pipeline /pipeline/Archives cifs ro,credentials=/home/username/.config/cifs 0   0
Run Code Online (Sandbox Code Playgroud)

我正在使用它

---
- 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
Run Code Online (Sandbox Code Playgroud)

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

#//archive/Pipeline
Run Code Online (Sandbox Code Playgroud)

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

 regexp: '^//archive/pipeline *'
 line: '#//archive/pipeline *'
Run Code Online (Sandbox Code Playgroud)

要么

 regexp: '^//archive/pipeline *'
 line: '#//archive/pipeline $1'
Run Code Online (Sandbox Code Playgroud)

我试图围绕lineinfile并且从我所读到的内容看起来像insertafter是我正在寻找的,但"插入后"不是我想要的?

tec*_*raf 20

您可以将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
Run Code Online (Sandbox Code Playgroud)

它将替换匹配的所有匹配字符串regexp.

lineinfile另一方面,只能在一行上工作(即使在文件中找到多个匹配).它确保特定行不存在或与定义的内容一起出现.


Kon*_*rov 17

使用backrefs = yes:

与state = present一起使用.如果设置,则行可以包含后向引用(位置和命名),如果正则表达式匹配,则将进行填充.

像这样:

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

另请注意,我使用(?i)regexp选项,因为您的搜索表达式永远不会与Pipeline示例fstab中的大写字母P 匹配.