सवाल उत्तरदायी का उपयोग कर टेम्पलेट फ़ाइलों के एक फ़ोल्डर को तैनात करना


क्या टेम्पलेट के समान नाम का उपयोग करके टेम्पलेट .j2 फ़ोल्डर से टेम्पलेट .j2 फ़ोल्डर से भरा फ़ोल्डर को तैनात करने का कोई आसान तरीका है, लेकिन प्रत्येक फ़ाइल के लिए टेम्पलेट मॉड्यूल का उपयोग करने के बजाय .j2 एक्सटेंशन के बिना?

अभी मेरे पास एक लंबी सूची है:

- name: create x template
  template:
    src=files/x.conf.j2
    dest=/tmp/x.conf
    owner=root
    group=root
    mode=0755
  notify:
    - restart myService

40
2018-02-26 21:36


मूल




जवाब:


आप उपयोग कर सकते हैं with_fileglob अपनी टेम्पलेट निर्देशिका से फ़ाइलों की सूची प्राप्त करने के लिए और इस तरह जे 2 एक्सटेंशन को पट्टी करने के लिए फ़िल्टर का उपयोग करें ..

- name: create x template
  template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('\.j2','') }}
  with_fileglob:
    - ../templates/*.j2

55
2017-10-28 05:08



ध्यान दें with_fileglob हमेशा से संचालित है files/, आप टेम्पलेट्स के साथ प्राप्त कर सकते हैं ../templates/mytemplate/*। stackoverflow.com/a/27407566/1695680 - ThorSummoner
धन्यवाद, यह बहुत उपयोगी है। मैंने पाया कि regex_replace फ़ंक्शन में शाब्दिक अवधि से बचने के लिए मुझे दो बैकस्लेश का उपयोग करना पड़ा। हो सकता है क्योंकि मेरे पास डबल डिस्प्ले के भीतर पूरा भाग टेम्पलेट भाग था इसलिए मैं कार्य परिभाषा के लिए वाईएएमएल प्रारूप का उपयोग कर सकता था (जिसे मैं एक-लाइनर प्रारूप पर पसंद करता हूं)। - Tony Cesaro
यह केवल टेम्पलेट फ़ोल्डर में फ़ाइलों को लाइव मानता है, अगर आपको टेम्पलेट्स फ़ोल्डर में दोनों निर्देशिकाओं और फ़ाइलों का समर्थन करने की आवश्यकता है तो आपको with_filetree - देखें stackoverflow.com/questions/41667864/... - danday74
एक नोट है कि regex_replace लाइन के अंत में मिलना चाहिए \.j2$ उन मामलों के लिए जहां फ़ाइल नाम के अंदर पैटर्न मौजूद हो सकता है। - Brett Ryan


माइकल देहान (Ansible के निर्माता) ने एक पोस्ट बनाया CoderWall जो बहुत ही समान मुद्दे के बारे में बात करता है। आप अपनी आवश्यकताओं (जैसे अनुमतियां और स्वामित्व) के अनुसार इसे समायोजित और विस्तारित कर सकते हैं। पद का प्रासंगिक हिस्सा यहां है:


इसका उपयोग करके सरलीकृत किया जा सकता है "with_items"और एक एकल notify बयान। यदि कोई भी कार्य बदलता है, तो सेवा को उसी तरह से अधिसूचित किया जाएगा जिसकी इसे प्लेबुक रन के अंत में पुनरारंभ करने की आवश्यकता है।

 - name:  template everything for fooserv
   template: src={{item.src}} dest={{item.dest}}
   with_items:
      - { src: 'templates/foo.j2', dest: '/etc/splat/foo.conf' }
      - { src: 'templates/bar.j2', dest: '/etc/splat/bar.conf' }
   notify: 
      - restart fooserv

ध्यान दें कि चूंकि हमारे पास ऐसे कार्य हैं जो एक से अधिक अद्वितीय तर्क लेते हैं, हम केवल "item" में 'template:'लाइन, लेकिन उपयोग करें with_items एक हैश (शब्दकोश) चर के साथ। यदि आप चाहें तो सूचियों का उपयोग करके आप इसे थोड़ा छोटा भी रख सकते हैं। यह एक स्टाइलिस्ट वरीयता है:

 - name:  template everything for fooserv
   template: src={{item.0}} dest={{item.1}}
   with_items:
      - [ 'templates/foo.j2', '/etc/splat/foo.conf' ]
      - [ 'templates/bar.j2', '/etc/splat/bar.conf' ]
   notify: 
      - restart fooserv

बेशक हम उस सूची को भी परिभाषित कर सकते हैं जिसे आप दूसरी फाइल में चल रहे थे, जैसे कि "groupvars/webservers"फाइल के लिए आवश्यक सभी चर परिभाषित करने के लिए फ़ाइल webservers समूह, या एक वाईएएमएल फ़ाइल "varsfiles"प्लेबुक के अंदर निर्देश। देखो कि अगर हम ऐसा करते हैं तो यह कैसे साफ हो सकता है।

- name: template everything for fooserv
  template: src={{item.src}} dest={{item.dest}}
  with_items: {{fooserv_template_files}}
  notify: 
      - restart fooserv

18
2018-03-04 04:04



लिखने के लिए एक आसान तरीका हो सकता है template: src=templates/{{item}}.j2 dest=/etc/splat/{{item}}.conf, और फिर वस्तुओं की एक सादा सूची का उपयोग करें: with_items: - foo - bar - Ethan
यह वास्तव में अब गलत लग रहा है। सही टेम्पलेट लाइन होगी template: src={{item.src}} dest={{item.dest}} (यानी नहीं ${var} बल्कि {{var}}) - Fabiano Francesconi
@FabianoFrancesconi अद्यतन। - Mxx


रसेल द्वारा जवाब काम करता है लेकिन इसे सुधार की जरूरत है

- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
   - files/*.j2

सभी $ Firs को जाने की जरूरत है क्योंकि यह regex_replace में गलत regex था। दूसरी बात सभी फाइलें टेम्पलेट निर्देशिका की बजाय फाइल निर्देशिका में होनी चाहिए


9
2018-01-16 16:47



सर्वर फॉल्ट में आपका स्वागत है! आपके उत्तर से पता चलता है कि प्रश्न के एक व्यावहारिक समाधान पिछले उत्तर के माध्यम से उपलब्ध है, इस प्रकार उस उत्तर के संपादन के रूप में अधिक उपयुक्त होगा। कृपया अपने वर्तमान उत्तर को हटाने और रसेल के जवाब में एक संपादन का सुझाव देने पर विचार करें। - Paul


मैंने एक फाइलट्री लुकअप प्लगइन लिखा है जो फाइल पेड़ों पर कार्रवाई के साथ मदद कर सकता है।

आप फ़ाइल पेड़ में फ़ाइलों पर भर्ती कर सकते हैं और फ़ाइल गुणों के आधार पर क्रियाएं (जैसे टेम्पलेट या प्रतिलिपि) कर सकते हैं। चूंकि सापेक्ष पथ वापस आ गया है, इसलिए आप आसानी से लक्ष्य प्रणाली पर फ़ाइलट्री को फिर से बना सकते हैं।

- name: Template complete tree
  template:
    src: '{{ item.src }}'
    dest: /web/{{ item.path }}
    force: yes
  with_filetree: some/path/
  when: item.state == 'file'

यह अधिक पठनीय प्लेबुक के लिए बनाता है।


5
2018-03-04 10:35



इसे अभी तक विलय नहीं किया गया है :-( - Morgan Christiansson
इसे विलय कर दिया गया है। - Dag Wieers
क्या केवल * .conf फाइलों को फ़िल्टर करने का कोई तरीका है? - Andrey
निश्चित रूप से, "कब:" भाग में आप एक अभिव्यक्ति लिख सकते हैं जो आपकी ज़रूरत के अनुरूप है। - Dag Wieers
प्लगइन धीमा नहीं है, यह अलग-अलग फाइलों को टेम्पलेट करने और प्रतिलिपि बनाने की प्रक्रिया है जो इसे धीमा कर देता है। लेकिन प्लगइन के साथ इसका कोई संबंध नहीं है, प्लगइन टेम्पलेटिंग या कॉपी करने की तुलना में अन्य चीजों के लिए उपयोगी हो सकता है। - Dag Wieers


नीचे दिए गए आदेश ने टेम्पलेट्स में जे 2 फाइलों के लिए एक रिकर्सिव लुकअप करने के लिए काम किया और इसे गंतव्य पर ले जाया। उम्मीद है कि यह किसी को गंतव्य पर टेम्पलेट की रिकर्सिव कॉपी की तलाश करने में मदद करता है।

     - name: Copying the templated jinja2 files
       template: src={{item}} dest={{RUN_TIME}}/{{ item | regex_replace(role_path+'/templates','') | regex_replace('\.j2', '') }}
       with_items: "{{ lookup('pipe','find {{role_path}}/templates -type f').split('\n') }}"

2
2017-12-15 15:25





निर्देशिका से वास्तविक फ़ाइलों की सूची को स्वचालित रूप से पकड़ने की संभावना है और बाद में उन्हें फिर से चालू करें ..

- name:         get the list of templates to transfer
  local_action: "shell ls templates/* | sed 's~.*/~~g'"
  register:     template_files

- name:         iterate and send templates
  template:     src=templates/{{ item }} dest=/mydestination/{{ item }}
  with_items:
  - "{{ template_files.stdout.splitlines() }}"

1
2017-07-31 16:07



न्यूलाइन पर विभाजन के बारे में मानक चेतावनी नोट करें - फ़ाइल नामों में न्यूलाइन हो सकती है। समर्थन का उपयोग करने वाली एक खोल उपयोगिता का उपयोग करने के लिए एक सुरक्षित समाधान है print0, जैसे कि find, और फिर विभाजित करें \u0000। - Dejay Clayton