শেফ (একক) রেসিপিটিতে লুপ দেওয়ার সঠিক উপায় কী?


8

কেউ দয়া করে আমাকে ব্যাখ্যা করতে পারেন শেফ কীভাবে কাজ করে? এটি একটি দুর্দান্ত বিস্তৃত প্রশ্ন, তাই এটি সংকুচিত করার জন্য আমার কাছে এই খুব সহজ রেসিপি রয়েছে যা ব্যবহারকারীর তালিকার উপরে চলে আসে এবং যদি ইতিমধ্যে বিদ্যমান না থাকে তবে প্রতিটি তৈরি করে। এটা কাজ করে না.

আমি লুপটি যা বলতে পারি তা থেকে প্রত্যাশা মতোই ঘটছে বলে মনে হচ্ছে। লুপটি প্রতিটি ব্যবহারকারী তৈরি করার জন্য আমার ব্যাশ কমান্ডগুলি সম্পন্ন করে একবার লুপের প্রতিটি পুনরাবৃত্তির জন্য কার্যকর করা হয়। যাইহোক, যখন ব্যাশ কমান্ডগুলি কার্যকর করা হয় তখন তারা কেবল প্রথম লুপ পুনরাবৃত্তি থেকে ব্যবহারকারীর মান বলে মনে হয়।

এই উদাহরণের অনুরূপ ভেরিয়েবল ডেটার উপরে থাকা কোনও রেসিপি লেখার সঠিক উপায় কী?

এই রেসিপিটি এখানে:

node[:users].each do |user|
  puts "in loop for #{user['username']}"
  bash "create_user" do
    user "root"
    code do
      puts "running 'useradd' for #{user['username']}"
      "useradd #{user['username']}"
    end
    not_if do
      puts "checking /etc/passwd for #{user['username']}"
      "cat /etc/passwd | grep #{user['username']}"
    end
  end
end

আমি নিম্নলিখিত সেটআপ দিয়ে ভ্যাগ্র্যান্ট ব্যবহার করে এটি পরীক্ষা করছি:

Vagrant::Config.run do |config|
  config.vm.box = "precise32"
  config.vm.box_url = "http://files.vagrantup.com/precise32.box"
  config.vm.provision :chef_solo do |chef|
    chef.add_recipe "sample"
    chef.json = {
      :users => [
        {:username => 'testA'},
        {:username => 'testB'},
        {:username => 'testC'},
        {:username => 'testD'},
        {:username => 'testE'},
      ],
    }
  end
end

রেসিপিটিতে বিবৃতি রাখে এমন বার্তাগুলি উত্সাহিত করে:

2013-03-08T01:03:46+00:00] INFO: Start handlers complete.
in loop for testA

in loop for testB

in loop for testC

in loop for testD

in loop for testE

[2013-03-08T01:03:46+00:00] INFO: Processing bash[create_user] action run (sample::default line 5)
checking /etc/passwd for testA

[2013-03-08T01:03:46+00:00] INFO: Processing bash[create_user] action run (sample::default line 5)
checking /etc/passwd for testA

[2013-03-08T01:03:46+00:00] INFO: Processing bash[create_user] action run (sample::default line 5)
checking /etc/passwd for testA

[2013-03-08T01:03:46+00:00] INFO: Processing bash[create_user] action run (sample::default line 5)
checking /etc/passwd for testA

[2013-03-08T01:03:46+00:00] INFO: Processing bash[create_user] action run (sample::default line 5)
checking /etc/passwd for testA

[2013-03-08T01:03:46+00:00] INFO: Chef Run complete in 0.026071 seconds

উত্তর:


5

আপনার স্ক্রিপ্ট নাম অনন্য করুন ...

bash "create_user_#{user}" do

এফডাব্লুআইডাব্লু, আমি https://github.com/fnichol/chef-user বেশ কয়েকবার ব্যবহার করেছি যা আপনাকে গুনাবলী এবং ডাটাবেগের উপর ভিত্তি করে ব্যবহারকারী তৈরি / মুছে ফেলার অনুমতি দেয়।


এত সহজ মনে হচ্ছে, ধন্যবাদ! ব্যবহারকারীদের রেসিপি তৈরি করা কেবলমাত্র একটি উদাহরণ ছিল যা আমি কেন আমার লুপটি অন্য রেসিপিগুলিতে কাজ করে না তা প্রায় আমার মাথা পেতে ব্যবহার করছিলাম। আবার ধন্যবাদ!
ম্যাথু জে মরিসন

10

শেফ ক্লায়েন্ট রান: মূল সংকলন এবং রূপান্তর দুটি মূল ধাপের মধ্যে পার্থক্য বোঝার মাধ্যমে আপনি যে আচরণটি দেখছেন তা ব্যাখ্যা করা যেতে পারে।

"সংকলন" পর্বের সময়, শেফ ক্লায়েন্ট একটি উত্স সংগ্রহ সংগ্রহ করতে আপনার রেসিপিগুলিতে কোড চালায় । এটি সেই সংস্থানগুলির একটি তালিকা যা আপনি শেফকে তাদের সিস্টেমের লক্ষ্যবস্তু এবং আপনার সিস্টেমে পরিচালনা করতে বলেছিলেন। উদাহরণস্বরূপ, একটি ডিরেক্টরি উত্স বলতে হবে যা /tmp/fooবিদ্যমান থাকতে হবে, এবং মূলের মালিকানাধীন:

directory "/tmp/foo" do
  owner "root"
end

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

সংস্থানগুলি তাদের নাম এবং প্রকারের দ্বারা স্বতন্ত্রভাবে চিহ্নিত করা হয় - আমাদের ডিরেক্টরি হবে directory[/tmp/foo]। অদ্ভুত জিনিসগুলি ঘটবে যখন আপনার একই নামের সাথে আলাদা আলাদা বৈশিষ্ট্যযুক্ত দুটি সংস্থান থাকবে - যা আপনার সমস্যার ব্যাখ্যা দেয় এবং ড্যারিন হোলস্টের উত্তরটি ব্যবহার করে এটি স্থির করা যেতে পারে:

node[:users].each do |user|
  puts "in loop for #{user['username']}"
  bash "create_user_#{user}" do
    user "root"
    code do
      puts "running 'useradd' for #{user['username']}"
      "useradd #{user['username']}"
    end
    not_if do
      puts "checking /etc/passwd for #{user['username']}"
      "cat /etc/passwd | grep #{user['username']}"
    end
  end
end

তবে, এই বিশেষ ক্ষেত্রে, আপনি শেফের ব্যবহারকারী সংস্থান ব্যবহার করে উপকৃত হবেন। আপনার রেসিপি (ডিবাগিং বার্তা ছাড়াই) এর প্রতিস্থাপন এখানে রয়েছে:

node[:users].each do |u|
  user u['username'] do
    action :create
  end
end

এটি কেন বাশ সংস্থানগুলির সেটের চেয়ে ভাল?

  1. ব্যবহারকারীর সংস্থান বিভিন্ন প্ল্যাটফর্ম জুড়ে একইভাবে কাজ করে - একই রেসিপি অপারেটিং সিস্টেমগুলিতে কাজ করবে যা ব্যবহারকারী তৈরি করতে "ইউজারডড" ব্যতীত অন্য কিছু ব্যবহার করে।
  2. এর জন্য দায়ী সরবরাহকারীরা কীভাবে ব্যবহারকারী ইতিমধ্যে বিদ্যমান কিনা তা যাচাই করতে জানেন, তাই আপনার দরকার নেই_আইফের।
  3. ব্যবহারকারীদের অপসারণ করতে, তাদের পাসওয়ার্ডগুলি লক করতে বা আনলক করতে এবং বিদ্যমান ব্যবহারকারীর অ্যাকাউন্টগুলিতে অন্যান্য বৈশিষ্ট্যগুলি আপডেট করতে একই সরবরাহকারী ব্যবহার করা যেতে পারে।

তবে সঠিক সংস্থানগুলি ব্যবহারের সর্বোত্তম কারণ হ'ল এটি আপনার উদ্দেশ্যকে আরও স্পষ্টভাবে যোগাযোগ করে। আপনার লক্ষ্য সম্ভবত শেল কমান্ডগুলির একগুচ্ছ চালানো নয় - এটি নিশ্চিত করা আপনার কম্পিউটারে কিছু ব্যবহারকারী উপস্থিত আছেন। যে কমান্ডগুলি ব্যবহৃত হত তা কেবল একটি বাস্তবায়ন বিশদ।

সরবরাহকারীরা এই বিবরণগুলি সজ্জিত করে, আমাদের কী চাই তা বর্ণনা করার জন্য আমাদের মুক্ত রেখে।


1
ধন্যবাদ, এটি কিছুটা স্পষ্ট করে। ব্যবহারকারীর তৈরির রেসিপিটি কেবলমাত্র একটি উদাহরণ যা আমি অন্য কোথাও থাকা লুপগুলি আমার প্রত্যাশা অনুযায়ী কাজ করি নি কেন তা আরও ভালভাবে বুঝতে পারি play
ম্যাথু জে মরিসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.