Je veux remplacer une chaîne entre deux caractères @
Quelque chose comme ça
Salut, je suis @ Something.great @ d'une planète @ planet.outside.earth @
à partir d'un fichier de propriétés où les valeurs sont
Something.great = Niel Armstrong planet.outside.earth = Mars
Cela devrait donc convertir le texte ci-dessus en
Salut, je suis Niel Armstrong d'une planète Mars
Je dois y parvenir en utilisant Ansible
En utilisant la recherche et le remplacement
EDIT 1:
Non Pour les deux réponses ci-dessous. Je n'ai aucune idée des clés que j'ai entre N nombre de fichiers. Je dois rechercher une expression régulière dans un dossier contenant 100 fichiers pouvant contenir 1000 clés entre @ myKey @.
Je dois donc rechercher d'abord quelle est la valeur du fichier dans ce cas, myKey qui doit provenir de certains recherche regex, puis recherche cette valeur de recherche dans un fichier de propriétés de recherche où la valeur de myKey est présente.
Mon fichier de propriétés ressemble à ceci.
myKey=Ankit YourKey=Kevin OtherKey=Vladimir
p >
3 Réponses :
Réponse :
TASK [debug] "msg": "Hi I am Niel Armstrong from a planet Mars"
Sortie :
---
- hosts: local_test # local_test
vars:
string: "Hi I am @Something.great@ from a planet @planet.outside.earth@"
something:
great: "Niel Armstrong"
planet:
outside:
earth: "Mars"
gather_facts: false
tasks:
- debug:
msg: "{{ string | replace('@Something.great@', something.great) | replace ('@planet.outside.earth@', planet.outside.earth) }}"
Utilisez replace le module, si la chaîne est dans un fichier
- template:
src: test.j2
dest: "{{ path_to_file_with_the_substituted_text }}"
, ou utilise regex_replace filtre si la chaîne est disponible dans une variable
$ cat test.j2
Hi I am {{ Something.great }} from a planet {{ planet.outside.earth }}
Si vous remplacez les marqueurs «@@» par «{{}}», les variables seront remplacées. Par exemple
vars:
string: "Hi I am {{ Something.great }} from a planet {{ planet.outside.earth }}"
Something:
great: "Niel Armstrong"
planet:
outside:
earth: "Mars"
tasks:
- debug:
var: string
, ou avec le modèle
- set_fact:
string: "{{ string | regex_replace( item.regexp, item.replace) }}"
loop:
- regexp: '@Something.great@'
replace: 'Niel Armstrong'
- regexp: '@planet.outside.earth@'
replace: 'Mars'
et la tâche ci-dessous
- replace:
path: "{{ path_to_template }}"
regexp: "{{ item.regexp }}"
replace: "{{ item.replace }}"
loop:
- regexp: '@Something.great@'
replace: 'Niel Armstrong'
- regexp: '@planet.outside.earth@'
replace: 'Mars'
J'ai trouvé la solution.
Je vais d'abord chercher dans le répertoire le regex spécifique et le stocker dans Register.
- debug:
msg="{{lookup('file', '{{file}}')}}"
register: fileContent
- name: Storing the content of the file
set_fact:
fileString: "{{fileContent.msg}}"
- name: Find the tokens (@----@) in the fileString
set_fact:
tokens: "{{ fileString | regex_findall(regexp)}}"
vars:
regexp: '\@.*?\@'
- name: Print Token Objects
debug:
var: tokens
- debug:
msg="{{ lookup('ini', '{{item}} type=properties file=/lookup.properties') }}"
with_items:
- "{{tokens}}"
register: myresult
- debug:
var : myresult
- name: Replace the token in the configuration files
replace:
path: {{file}}
regexp: '{{token}}'
replace: "{{ lookup('ini', '{{token}} type=properties file=/lookup.properties')}}"
with_items: "{{tokens}}"
loop_control:
loop_var: token
Je vais écrire la liste des fichiers dans un fichier texte séparé config.txt
- name: Loop through the tasks
include_tasks: read-replace.yaml
with_items: "{{ lookup('file', '/config.txt').splitlines() }}"
loop_control:
loop_var: file
- name: Write list of files to be read for tokens
lineinfile:
path: /config.txt
line: "{{item.file.path}}"
create: yes
state: present
with_items:
- "{{filesname}}"
Je vais lire le contenu du fichier et remplacer le jeton en même temps
- name: Search Tokens
find:
paths: "{{ HOME_DIR }}"
hidden: yes
contains: "^.*(@.*@).*$"
recurse: no
use_regex: yes
file_type: file
patterns: "^(?!.*pattern\\.sh).*$"
register: filesname