使用 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.
中
我很难相信没有任何内容涵盖此用例,但事实证明我的搜索毫无结果。
我在 /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.