Ansible का उपयोग करके टेम्प्लेट फ़ाइलों के फ़ोल्डर को तैनात करना


47

क्या टेम्पलेट का पूरा एक फ़ोल्डर तैनात करने का एक आसान तरीका है .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

जवाबों:


67

आप with_fileglobअपने टेम्पलेट डायरेक्टरी से फाइलों की सूची प्राप्त करने के लिए उपयोग कर सकते हैं और इस तरह से j2 एक्सटेंशन को स्ट्रिप करने के लिए फिल्टर्स का उपयोग कर सकते हैं।

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

11
नोट with_fileglobहमेशा से संचालित होता है files/, आप के साथ खाका प्राप्त कर सकते हैं ../templates/mytemplate/*stackoverflow.com/a/27407566/1695680
थोरसुमोनर

2
धन्यवाद, यह सुपर सहायक है। मैंने पाया कि मुझे regex_replace फ़ंक्शन में शाब्दिक अवधि से बचने के लिए दो बैकस्लैश का उपयोग करना था। हो सकता है क्योंकि मेरे पास पूरे डिस्ट टेम्प्लेट का हिस्सा डबल कोट्स के भीतर था, इसलिए मैं टास्क डेफिनिशन के लिए YAML प्रारूप का उपयोग कर सकता था (जो कि मैं वन-लाइनर प्रारूप पर पसंद करता हूं)।
टोनी सेसरो

1
यह मान लेता है कि फ़ाइलें केवल टेम्पलेट फ़ोल्डर में रहती हैं, अगर आपको टेम्पलेट फ़ोल्डर के भीतर निर्देशिका और फ़ाइलों दोनों का समर्थन करने की आवश्यकता है, तो आपको with_filetree की आवश्यकता है - देखें stackoverflow.com/questions/41667864/…
danday74

एक नोट जो regex_replaceउन \.j2$मामलों के लिए लाइन के अंत में मेल खाना चाहिए जहां पैटर्न फ़ाइल नाम के अंदर मौजूद हो सकता है।
ब्रेट रयान

20

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


इसे " 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समूह के लिए आवश्यक सभी चर को परिभाषित करने के लिए " " फ़ाइल , या varsfilesplaybook के अंदर निर्देश से भरी हुई एक YAML फ़ाइल । देखो अगर हम ऐसा करते हैं तो यह कैसे साफ हो सकता है।

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

5
लिखने की एक सरल विधि हो सकती है template: src=templates/{{item}}.j2 dest=/etc/splat/{{item}}.conf, और फिर वस्तुओं की एक सादे सूची का उपयोग करें:with_items: - foo - bar
एथन

यह वास्तव में अब गलत लगता है। सही टेम्प्लेट लाइन होगी template: src={{item.src}} dest={{item.dest}}(यानी नहीं ${var}बल्कि {{var}})
फैबियानो फ्रांसेस्कोनी

@FabianoFrancesconi अपडेट किया गया।
Mxx

9

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

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

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


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

7

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

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

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

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


यह अभी तक विलय नहीं किया गया है :-(
मॉर्गन क्रिश्चियनसन

2
इसे मिला दिया गया है।
डेग वाइयर्स

क्या केवल * .conf फ़ाइलों को फ़िल्टर करने का एक तरीका है?
एंड्री

यकीन है, "जब:" भाग में आप एक अभिव्यक्ति लिख सकते हैं जो आपकी ज़रूरत पर फिट बैठता है।
डेग वियर्स

1
प्लगइन धीमा नहीं है, यह व्यक्तिगत रूप से प्रत्येक फ़ाइल को गति देने और कॉपी करने की प्रक्रिया है जो इसे धीमा कर देती है। लेकिन उस प्लगइन के साथ शायद ही कुछ करना है, प्लगइन टेम्प्लेटिंग या कॉपी करने के अलावा अन्य चीजों के लिए उपयोगी हो सकता है।
डाग वियर्स

3

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

     - 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') }}"

1

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

- 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() }}"

न्यूलाइन पर विभाजन के बारे में मानक चेतावनी पर ध्यान दें - फ़ाइल नाम में नई सीमाएँ हो सकती हैं। एक सुरक्षित समाधान एक शेल उपयोगिता का उपयोग करना है जो समर्थन करता है print0, जैसे कि find, और फिर विभाजित \u0000
देजय क्लेटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.