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