Комментирование строки с модулем Ansible lineinfile
мне трудно поверить, что нет ничего, что охватывает этот случай использования, но мой поиск оказался бесплодным.
у меня есть строка /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
есть ли способ glob-захватить остальную часть строки или просто вставить один комментарий char?
regexp: '^//archive/pipeline *'
line: '#//archive/pipeline *'
или
regexp: '^//archive/pipeline *'
line: '#//archive/pipeline '
Я пытаюсь обернуть голову вокруг lineinfile и из того, что я прочитал, похоже, что insertafter-это то, что я ищу, но "вставить после" - это не то, что я хочу?
3 ответов
можно использовать 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=да:
используется с состоянием=присутствует. Если задано, строка может содержать обратные ссылки (как позиционные, так и именованные), которые будут заполнены, если регулярное выражение совпадает.
такой:
- name: Comment out pipeline archive in fstab
lineinfile:
dest: /etc/fstab
regexp: '(?i)^(//archive/pipeline.*)'
line: '# '
backrefs: yes
state: present
Также обратите внимание, что я использую (?i)
опция для regexp, потому что ваше выражение поиска никогда не будет соответствовать Pipeline
С капиталом P в Примере fstab.
Это одна из многих причин lineinfile
- это антипаттерн. Во многих случаях шаблон является лучшим решением. В этом случае mount
модуль был разработан для этого.
- name: Remove the pipeline archive
mount: name="/archive/pipeline" state=absent
но "ах!"вы говорите, вы" хотите сохранить, чтобы гора была в fstab в одно время". Вы сделали один лучше, используя mount
, вы сохранили его в анзибль.