用Ansible lineinfile模块

时间:2016-08-31 01:59:41

标签: ansible ansible-playbook

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

我在/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

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

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

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

我正试图将我的脑袋包裹在lineinfile中,并且从我读过的内容看起来像insertafter是我正在寻找的,但是"插入"不是我想要的吗?

3 个答案:

答案 0 :(得分:18)

您可以在案例中使用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仅适用于一行(即使在文件中找到多个匹配)。它确保特定行不存在或与定义的内容一起出现。

答案 1 :(得分:13)

使用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

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

答案 2 :(得分:2)

这是- name: Remove the pipeline archive mount: name="/archive/pipeline" state=absent 是反模式的众多原因之一。在许多情况下,模板是最佳解决方案。在这种情况下,mount模块就是为此而设计的。

    mavenCentral()
}

但是“啊!”你说,你“想要保持那座山一次在fstab”。您使用{{1}}做了一个更好的事情,您已将其保留在 in ansible