.Erb ফাইল ভেরিয়েবলের জন্য পুতুল রফতানি করা সংস্থানসমূহ?


8

পরিস্থিতি: আমার কনফিগারেশন ফাইলটি এমন কোনও .erbফাইল দ্বারা সংজ্ঞায়িত করা হয় যা নীচে স্নিপেট অন্তর্ভুক্ত করে।

<% backupclients.each do |backup_files| -%>
Job {
  Name = "Server"
  JobDefs = "DefaultJob"
  Client = <%= backup_files %>-fd
  Pool = TeraMonth
  Write Bootstrap = "/var/lib/bacula/<%= backup_files %>.bsr"
}
<% end -%>

প্রতিটি ক্লায়েন্ট হোস্টের জন্য সার্ভারের কনফিগারেশন ফাইলটির পুনরাবৃত্তি প্রবেশের প্রয়োজন। যদি আমি একটি সাধারণ অ্যারে তৈরি করি তবে এটি ইস্যু ছাড়াই কাজ করবে। আমি কি কাজ করতে চান, তবে, প্রতিটি হোস্ট নিজেই রেজিস্টার করো এবং তারপর ব্যবহার করে তথ্য সংগ্রহ আছে <<| |>>pragma এক সঙ্গে কী করবেন অনুরূপ nagios_*ধরনের।

এর আদর্শ উদাহরণের মধ্যে একটি প্রকার রফতানি জড়িত।

class ssh {
  @@sshkey { $hostname: type => dsa, key => $sshdsakey }
  Sshkey <<| |>>
}

যাইহোক, আমি কীভাবে কোনও টাইপ লিখতে বা এটি এমনভাবে উল্লেখ করতে পারি তা .erbটেমপ্লেট থেকে মানগুলির অ্যারেটি পড়তে দেয় quite কোনও .erbফাইলের ভেরিয়েবল লুপের সাথে আমি কীভাবে রফতানি হওয়া সংস্থানগুলি ব্যবহার করতে পারি ?


তাদের কি একই ফাইলটিতে শেষ হওয়া দরকার? আমি প্রতিটি হোস্টকে পৃথক ফাইলে রাখতে চাই। /Etc/bacula/clientdefs/*.conf এর মতো কিছু । এটি মোকাবেলা করা আরও সহজ হওয়া উচিত।
জোড়াদেচি

উত্তর:


5

সুতরাং, আপনার প্রশ্নের সরাসরি জবাব দেওয়ার জন্য, আমি বিশ্বাস করি না যে ইরব থেকে সরাসরি রফতানি হওয়া সংস্থার একটি তালিকা পাওয়া সম্ভব। এটি রফতানি হওয়া সংস্থার প্রকৃতির কারণে। পুতুলের কাছে এগুলি কেবলমাত্র আরও সংস্থান যা হোস্টে তৈরি করা দরকার।

তবে, আপনি যা করছেন তা সম্পাদন করার একটি উপায় রয়েছে। আমি আমার পরিবেশে কয়েক জায়গায় এটি করি।

এখানে আমরা ফাইলগুলির একটি ডিরেক্টরি তৈরি করি, প্রতিটি হোস্টের জন্য একটি করে আমরা "ব্যাকুলা_ক্লিয়েন্ট" হিসাবে পতাকাঙ্কিত করতে চাই। আমরা ব্যবহার purge, forceএবং recurseযে পুতুল দ্বারা পরিচালিত হয় না ফাইল মুছে ফেলার জন্য অপশন (অর্থাত আপনি এই "তালিকা" থেকে একটি সিস্টেম সরাতে চান থাকেন)।

class bacula::client {

  @@file { "/etc/bacula_clients/$fqdn":
    ensure => present,
    content => "",
    require => File['/etc/bacula_clients'],
    tag => "bacula_client",
  }

}

class bacula::server {

  #
  # .. include whatever else the server requires, like package {} file {} service {}
  #

  file { "/etc/bacula_clients":
    ensure => directory,
    purge => true,
    recurse => true,
    force => true,
  }

  # Populate directory of client files.
  File <<| tag == "bacula_client" |>>

}

এরপরে, আমরা ফাইলগুলির জন্য এই ডিরেক্টরিটি স্ক্যান করতে .erb এ কিছু রুবি কোড ব্যবহার করি এবং সেগুলিতে কাজ করি:

<% 
bacula_clients_dir = '/etc/bacula_clients'
d = Dir.open(bacula_clients_dir)

# Remove directories from the list of entries in the directory (specifically '.' and '..'):
backupclients = d.entries.delete_if { |e| File.directory? "#{bacula_clients_dir}/#{e}" }

backupclients.each do |backup_files| 
-%>
Job {
  Name = "Server"
  JobDefs = "DefaultJob"
  Client = <%= backup_files %>-fd
  Pool = TeraMonth
  Write Bootstrap = "/var/lib/bacula/<%= backup_files %>.bsr"
}
<% end -%>

এখন আমার খারাপ লাগছে কারণ আমি আমার স্ক্রিপ্টগুলি দু'দিন আগে লেখা শেষ করেছি এবং এটি ফর্ম্যাটে খুব কাছাকাছি ... এটি বলেছে যে, আপনি আপনার উত্তরটি বোধ করেন বা আমার উত্তর আমার কাছে গ্রহণ করার পক্ষে আরও উপযুক্ত কিনা তা আমি আপনাকে বেছে নিতে দেব।
জেফ ফেরল্যান্ড

আমি বলব যদি অ্যাপ্লিকেশনটিতে কোনও কনফিগার ডিরেক্টরি ডিরেক্টরি বা ওয়াইল্ডকার্ড দ্বারা অন্তর্ভুক্ত থাকে (যেমন ব্যাকুলায় প্রদর্শিত হয়) তবে আপনার উত্তরটি আরও উপযুক্ত। আমি এটিকে আমার পরিবেশে স্ক্রিপ্টগুলির জন্য ব্যবহার করেছি যা লক্ষ্য হোস্টের সেটগুলিতে ফাইলগুলিকে ঘুরিয়ে দেয়। সুতরাং ব্যাশ স্ক্রিপ্টগুলি সহজভাবে করে ls /path/to/flag/files|while read hostname; do ssh $hostname ..; done
কাইল স্মিথ

4

ঠিক আছে, প্রথমে আমি হাল ছেড়ে @@দিয়ে আসল ফাইল টাইপটি সেট করলাম । উল্টোটি এটি এখনও ক্লায়েন্ট হোস্টে ভেরিয়েবল ব্যবহার করে।

class bacula-client ($database = false) {
    @@file { "${hostname}-bacula-client.conf":
            mode => 600,
            owner => bacula,
            group => root,
            path => "/etc/bacula/conf.d/${hostname}-client.conf",
            content => template("bacula-dir-cliententry.erb"),
            tag => 'bacula-client',
            notify => Service[bacula-director]
    }

    ...
}

এটি আমাকে এর্ব ফাইলটিতে এন্ট্রিগুলি ব্যবহার করতে দেয়:

<% if has_variable?("database") and database== "true" %>
    ...
<% end -%>

এবং আমার সাইট.পিপি ফাইলগুলিতে ঘোষণা যেমন: class { bacula-client: database => "true" }

ডিরেক্টরি নিজেই পরিচালনা করতে:

class bacula-director {
        file { '/etc/bacula/conf.d':
            ensure => directory,
            owner => bacula,
            group => root,
            mode => 600,
            purge => true,
            recurse => true
        }

        ...
}

পরিস্কার করা এবং পুনরাবৃত্তি নির্ধারিত নয় এমন কোনও কিছু পরিষ্কার করে। আমি যখন কোনও হোস্টকে অফলাইনে রাখি, puppetstoredconfigclean $hostnameতখন তথ্যগুলি পরিষ্কার হয়ে যায় এবং পরিচালক এর পুতুলের পরবর্তী রানটি অ্যাপোরিপিটে কনফিগারেশনটি পুনরায় সেট করে দেয়।

অবশেষে, ব্যাকুলা ডিরেক্টর সফ্টওয়্যার নিজেই আমার বেকুলা-ডায়ারকনফ ফাইলের শেষে আমাকে নিম্নলিখিতগুলি করার অনুমতি দেয়:

@|"sh -c 'for f in /etc/bacula/conf.d/*.conf ; do echo @${f} ; done'"

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


1

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

তারপরে, আপনি ফাইল সিস্টেমে একটি উত্সর্গীকৃত ডিরেক্টরিতে আপনার অ্যারেতে জড়ো করতে চান এমন সমস্ত সংস্থান রফতানি করতে চান। এই ডিরেক্টরি পথটি অনন্যভাবে লক্ষ্য সংস্থানগুলি সনাক্ত করতে ব্যবহৃত হবে।

তারপরে, আপনার টেমপ্লেটে, এই জাতীয় কিছু করুন:

    require 'rest_client'
    require 'json'
    resources=JSON.parse(RestClient.get("http://localhost:8080/v2/nodes/#{nodename}/resources", {:accept => :json}))

    retVal = Array.new
    resources.each do |resource|
       if resource["title"] =~ /^#{pathRegex}$/
           retVal.push(resource["title"])
       end
    end

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

কিছুটা হ্যাকি তবে এটি ভাল কাজ করে।

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