Комментирование строки с модулем 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, вы сохранили его в анзибль.