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
4 Réponses :
D'après votre exemple
images=previousimage,mycustomimage
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.
Cela aidera
- name: replace line lineinfile: path: myfile.txt regexp: "^image=" line: 'image=previousimage,customimage'
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') }}"
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 )
.
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.