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