1
votes

Ajouter une chaîne dans un fichier de configuration via ansible

J'ai besoin d'ajouter une nouvelle chaîne à l'un des fichiers de configuration. Je dois ajouter "mycustomimage" avec un "," dans "images =". Donc en bref, ma sortie requise est images = previousimage, mycustomimage

Vue de mycnf.conf

id= 1
images=previousimage,mycustomimage

Pour cela, j'ai essayé ce code

---
- hosts: test_server
  - name: Add new string after "," in images
    lineinfile:
        path: /home/mycnf.conf
        regexp: 'images='
        insertafter: '^,'
        line: mycustomimage

Sortie attendue

id=1
images=previousimage

Mais ça ne marche pas pour moi. Des pensées? Merci d'avance! Sid


7 commentaires

Pouvez-vous fournir un échantillon du résultat attendu?


C'est déjà mentionné dans la question. la sortie requise est images = image précédente, mycustomimage


Votre ligne est-elle toujours images = previousimage ?


Votre ligne initiale est ìmages = previousimage, (Elle se termine par une virgule)? Vais-je varier? S'il varie, peut-il contenir plusieurs images? Et dans ce cas, cela se terminera-t-il toujours par un coma? Et peut-il déjà contenir l'image personnalisée dans un endroit aléatoire? Veuillez éditer votre question et donner un exemple précis de votre ligne de configuration initiale, décrire de manière exhaustive les variations possibles le cas échéant et le résultat attendu.


Oui à quoi? Il y a 5 questions dans mon commentaire.


J'ai mis à jour ma question. Les réponses sont donc: cela ne se terminera pas par une virgule. Toute nouvelle chaîne doit commencer par une virgule. Comme par exemple -, mycustomimage et il n'y a pas de problème avec les lieux. @ Zeitounator


Si cela ne se termine pas par un coma, pourquoi essayez-vous d'insérer après un dans votre tâche d'exemple? C'est vraiment déroutant, d'où toutes mes questions ci-dessus.


4 Réponses :


1
votes

D'après votre exemple

  1. Vous savez que la dernière ligne que vous voulez avoir dans le fichier est images=previousimage,mycustomimage
  2. Vous souhaitez ajouter cette ligne à la place d'une ligne image =. * déjà existante si elle existe et ne correspond pas à la dernière.

Ce qui suit fera l'affaire

    - name: Replace line if needed
      lineinfile:
        path: /home/mycnf.conf
        regex: images=.*
        line: images=previousimage,mycustomimage

Remarque: si pour une raison quelconque, il n'y a pas de ligne correspondante dans votre fichier pour l'expression régulière, la ligne sera ajouté à la fin du fichier.


0 commentaires

1
votes

Cela aidera

- name: replace line
  lineinfile:
    path: myfile.txt
    regexp: "^image="
    line: 'image=previousimage,customimage'


0 commentaires

1
votes

En supposant que previousimage n'est pas connu, vous pouvez faire deux choses:

1.Obtenez cette ligne en utilisant grep , enregistrez-vous dans une variable et ajoutez la ligne p>

id={{ id }}
images={{ images | join(",") }}

2.Créez un modèle pour ce fichier de configuration et affichez-le chaque fois que le playbook s'exécute et qu'une modification est détectée:

- set_fact:
    images: <list of images retrieved by lookup or static>

- name: update config.something
  template:
     src: my_template.j2
     dest: /config/file.something

Le modèle ressemblera à ceci:

- name: get line
  shell: grep "^image=" /config/file.something
  register: current_image

- name: update image
  lineinfile:
    path: /config/file.something
    regexp: '^image='
    line: "{{ current_image.stdout }},{{ new_image | default('customimage') }}"


0 commentaires

1
votes

Nous supposerons que vous ne savez pas ce qu'est image précédente , que vous avez peut-être plusieurs images précédentes, que vous voulez ajouter mycustomimage et que vous voulez le livre pour être idempotent:

---
- hosts: all
  connection: ssh
  become: no
  gather_facts: no


  vars:
    image_name: mycustomimage

  tasks:
  - lineinfile:
      path: testfile.txt
      regexp: '^images=(.*(?<!{{ image_name }}))'
      line: '\1,{{ image_name }}'
      backrefs: yes

Expliquons donc l'expression rationnelle: ^ images = vous pouvez vous comprendre!

La première parenthèse commence le backref bloc, et il va tout aspirer jusqu'à la fin de la ligne: .*

Ensuite, il regarde ce qu'il vient d'aspirer et s'assure que {{image_name}} n'est pas à la fin: (?

Enfin, nous fermons le bloc backref avec ) .


0 commentaires