web-dev-qa-db-fra.com

Commenter une ligne avec le module Ansible lineinfile

J'ai du mal à croire qu'il n'y a rien qui couvre ce cas d'utilisation mais ma recherche s'est avérée infructueuse.

J'ai une ligne dans /etc/fstab pour monter un lecteur qui n'est plus disponible:

//archive/Pipeline /pipeline/Archives cifs ro,credentials=/home/username/.config/cifs 0   0

Ce que je veux c'est le changer en

#//archive/Pipeline /pipeline/Archives cifs ro,credentials=/home/username/.config/cifs 0   0

J'utilisais ça

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

s'attendant à ce qu'il insère simplement le symbole de commentaire (#), mais à la place, il a remplacé toute la ligne et je me suis retrouvé avec

#//archive/Pipeline

existe-t-il un moyen de capturer globalement le reste de la ligne ou simplement d'insérer le caractère de commentaire unique?

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

ou

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

J'essaie d'envelopper ma tête autour de lineinfile et d'après ce que j'ai lu, il semble que insertafter soit ce que je recherche, mais "insert after" n'est pas ce que je veux?

13
datakid

Vous pouvez utiliser le module replace pour votre cas:

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

Il remplacera toutes les occurrences de la chaîne qui correspond à regexp.

lineinfile d'autre part, ne fonctionne que sur une seule ligne (même si plusieurs correspondances sont trouvées dans un fichier). Il garantit qu'une ligne particulière est absente ou présente avec un contenu défini.

20
techraf

Utilisez backrefs = yes :

Utilisé avec état = présent. Si elle est définie, la ligne peut contenir des références arrières (à la fois positionnelles et nommées) qui seront renseignées si l'expression rationnelle correspond.

Comme ça:

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

Notez également que j'utilise (?i) option pour regexp, car votre expression de recherche ne correspondra jamais à Pipeline avec le P majuscule dans l'exemple fstab.

17
Konstantin Suvorov

C'est l'une des nombreuses raisons pour lesquelles lineinfile est un contre-modèle. Dans de nombreux cas, un modèle est la meilleure solution. Dans ce cas, le module mount a été conçu pour cela.

- name: Remove the pipeline archive
  mount: name="/archive/pipeline" state=absent

Mais "ah!" vous dites, vous "voulez conserver que la monture était en fstab à un moment donné". Vous avez fait mieux en utilisant mount, vous l'avez conservé en ansible.

2
tedder42