জবাবদিহিতা ব্যবহার করে টেমপ্লেট ফাইলের একটি ফোল্ডার স্থাপন করা


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আপনার টেম্পলেট ডিরেক্টরি থেকে ফাইলগুলির তালিকা পেতে এবং জে 2 এক্সটেনশনটি এভাবে ছাঁটাতে ফিল্টারগুলি ব্যবহার করতে পারেন ..

- 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
ThorSummoner

2
ধন্যবাদ, এটি অত্যন্ত সহায়ক। আমি দেখতে পেয়েছি যে রিজেক্স_রেপ্লেস ফাংশনে আক্ষরিক সময় থেকে বাঁচতে আমাকে দুটি ব্যাকস্ল্যাশ ব্যবহার করতে হয়েছিল। সম্ভবত আমার ডাবল উদ্ধৃতিগুলির মধ্যে পুরো নিয়ম টেম্পলেট অংশ ছিল তাই আমি কার্য সংজ্ঞা (যা আমি ওয়ান-লাইনারের ফর্ম্যাটটির চেয়ে বেশি পছন্দ করি) এর জন্য ওয়াইএএমএল ফর্ম্যাটটি ব্যবহার করতে পারি।
টনি সিজারো

1
এই শুধুমাত্র অনুমান লাইভ ফাইল মধ্যে টেমপ্লেট ফোল্ডার, যদি আপনি টেমপ্লেট মধ্যে উভয় ডিরেক্টরি এবং ফাইলগুলি সমর্থন ফোল্ডার তারপর আপনি with_filetree প্রয়োজন হবে - দেখুন stackoverflow.com/questions/41667864/...
danday74

ফাইলনামের ভিতরে প্যাটার্নের উপস্থিতি থাকতে পারে এমন ক্ষেত্রে regex_replaceএকটি লাইনের শেষে মিল থাকা উচিত note \.j2$
ব্রেট রায়ান 12

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বা প্লেবুকের varsfilesভিতরে " " নির্দেশিকা থেকে বোঝা একটি ওয়াইএএমএল ফাইল " " সংজ্ঞায়িত করতে পারলাম । দেখুন আমরা কীভাবে এটি পরিষ্কার করতে পারে।

- 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}})
ফ্যাবিও ফ্রান্সেসকোনি

পুনঃটুইট হয়েছে
এমএক্সএক্স

9

রাসেলের উত্তরটি কাজ করে তবে এর উন্নতি প্রয়োজন

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

সমস্ত Fi এর firs যেতে হবে কারণ এটি regex_replace এ ভুল রেজিএক্স ছিল। দ্বিতীয়ত সমস্ত ফাইল টেমপ্লেট ডিরেক্টরি পরিবর্তে ফাইল ডিরেক্টরিতে থাকা উচিত


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
এটি একীভূত করা হয়েছে।
ড্যাগ উইয়ার্স

ফিল্টার করার কোনও উপায় কি কেবল * .কনফ ফাইল বলতে হবে?
অ্যান্ড্রে

অবশ্যই, "কখন:" অংশে আপনি একটি অভিব্যক্তি লিখতে পারেন যা আপনার প্রয়োজনের সাথে খাপ খায়।
ড্যাগ উইয়ার্স

1
প্লাগইনটি ধীর নয়, এটি প্রতিটি ফাইলকে স্বতন্ত্রভাবে টেম্পলেট করার এবং অনুলিপি করার প্রক্রিয়া যা এটি ধীর করে দেয়। তবে প্লাগইনটির সাথে এর খুব কমই কোনও সম্পর্ক রয়েছে, টেম্প্লেটিং বা অনুলিপি করা ছাড়া প্লাগইনটি অন্য কোনও কাজে কার্যকর হতে পারে।
ডাগ উইয়ার্স

3

নীচের কমান্ডটি টেমপ্লেটগুলিতে জে 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') }}"

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
দেজয় ক্লেটন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.