নিরাপদে কোনও একক মেশিনে উত্তরযোগ্য প্লেবুক সীমাবদ্ধ?


227

আমি কম্পিউটারের একটি ছোট গ্রুপের সাথে কিছু সাধারণ ব্যবহারকারীর পরিচালনা কাজের জন্য উত্তরীয় ব্যবহার করছি। বর্তমানে আমার কাছে আমার প্লেবুক সেট আছে hosts: allএবং আমার হোস্ট ফাইলটি কেবলমাত্র একটি একক গ্রুপ যা সমস্ত মেশিনের তালিকাভুক্ত রয়েছে:

# file: hosts
[office]
imac-1.local
imac-2.local
imac-3.local

আমি নিজেকে প্রায়শই একটি একক মেশিনকে লক্ষ্য করে দেখতে পেয়েছি। ansible-playbookকমান্ড করতে পারেন সীমা ভালো খেলে:

ansible-playbook --limit imac-2.local user.yml

তবে এটি বিশেষত সম্ভাব্য ধ্বংসাত্মক প্লেবুকের জন্য ভঙ্গুর মতো বলে মনে হচ্ছে। limitপতাকা ছাড়ার অর্থ প্লেবুকটি সর্বত্র চালানো হবে। যেহেতু এই সরঞ্জামগুলি কেবল মাঝেমধ্যে ব্যবহৃত হয়, বোধহয় প্লেব্যাকের পদক্ষেপ গ্রহণ করা উপযুক্ত বলে মনে হয় যাতে এখন থেকে আমরা কয়েক মাস ধরে দুর্ঘটনাক্রমে কিছুটা নষ্ট করি না।

কোনও একক মেশিনে প্লেবুক রান সীমাবদ্ধ করার জন্য কি সেরা অনুশীলন রয়েছে? সাধারণত কিছু গুরুত্বপূর্ণ বিবরণ বাদ দিলে প্লেবুকগুলি নিরীহ হওয়া উচিত।

উত্তর:


209

দেখা যাচ্ছে যে কোনও হোস্টের নাম সরাসরি প্লেবুকের মধ্যে প্রবেশ করা সম্ভব, সুতরাং প্লেবুকটি চালানো hosts: imac-2.localভাল কাজ করবে। তবে এটা এক ধরণের আকিদা।

একটি আরও ভাল সমাধান প্লেবুকের হোস্টগুলিকে ভেরিয়েবল ব্যবহার করে সংজ্ঞায়িত করা, তারপরে নির্দিষ্ট হোস্টের ঠিকানায় পাঠানো হতে পারে --extra-vars:

# file: user.yml  (playbook)
---
- hosts: '{{ target }}'
  user: ...

প্লেবুক চলছে:

ansible-playbook user.yml --extra-vars "target=imac-2.local"

যদি {{ target }}সংজ্ঞায়িত না করা হয়, প্লেবুক কিছুই করে না। হোস্ট ফাইল থেকে একটি গ্রুপও প্রয়োজনের মধ্যে দিয়ে যেতে পারে। সামগ্রিকভাবে, এটি একটি সম্ভাব্য ধ্বংসাত্মক প্লেবুকটি নির্মাণের পক্ষে অনেক বেশি নিরাপদ উপায় বলে মনে হচ্ছে।

একটি একক হোস্টকে লক্ষ্য করে প্লেবুক:

$ ansible-playbook user.yml --extra-vars "target=imac-2.local" --list-hosts

playbook: user.yml

  play #1 (imac-2.local): host count=1
    imac-2.local

একদল হোস্ট সহ প্লেবুক:

$ ansible-playbook user.yml --extra-vars "target=office" --list-hosts

playbook: user.yml

  play #1 (office): host count=3
    imac-1.local
    imac-2.local
    imac-3.local

হোস্ট সংজ্ঞা দিতে ভুলে যাওয়া নিরাপদ!

$ ansible-playbook user.yml --list-hosts

playbook: user.yml

  play #1 ({{target}}): host count=0

52
এই সঙ্গে 1.5.3 মধ্যে সমাধেয় হয়--limit office[0]
না.গো।

4
পরিবর্তনশীল চাহিদা উদ্ধৃত করা - অর্থাৎ: '{{ target }}'- অনুযায়ী docs.ansible.com/...
নরক পেং

9
এটি "ব্যর্থ নিরাপদ" উত্তর, অন্য কিছুগুলির মতো নয় - আপনি যদি কিছু ছেড়ে দেন তবে এটি কিছুই করবে না। জবাবদিহী 1.7 ব্যবহার করে 'কেবল' এক হোস্টের উপর চালানো run_onceএখনও ধ্বংসাত্মক হতে পারে তাই এটি এত ভাল ধারণা নয়।
রিচভেল

4
আপনি যদি একটি খাটো কমান্ড চান, তবে -eএর সমতুল্য--extra-vars
উইলিয়াম Turrell

1
যদি আপনার উত্তরযোগ্য কনফিগারেশনের প্রয়োজন হয় যে হোস্টগুলি খালি বা অপরিজ্ঞাত না হতে পারে তবে জিনজা ফিল্টারের সাথে মিলিত একটি চলক ব্যবহার করে যেমন:hosts: "{{ target | default('no_hosts')}}"
Zach Weg

178

একটি সুন্দর ছোট কৌশলও রয়েছে যা আপনাকে মধ্যস্থতাকারী তালিকা ছাড়াই কমান্ড লাইনে (বা একাধিক হোস্ট, আমার ধারণা) একক হোস্ট নির্দিষ্ট করতে দেয়:

ansible-playbook -i "imac1-local," user.yml

শেষে কমা নোট করুন ( , ); এটি ইঙ্গিত দেয় যে এটি একটি তালিকা নয়, একটি ফাইল নয়।

এখন, আপনি যদি দুর্ঘটনাক্রমে একটি সত্যের ইনভেন্টরি ফাইলটি পাস করে থাকেন তবে এটি আপনাকে রক্ষা করবে না, সুতরাং এটি এই নির্দিষ্ট সমস্যাটির জন্য ভাল সমাধান নাও হতে পারে। তবে এটি জানার একটি সহজ কৌশল!


2
এটা আশ্চর্যজনক. আমি নিয়মিত -l ফ্ল্যাগটি ব্যবহার করি, যা ইত্যাদি / উত্তরযোগ্য / হোস্টগুলির সাথে কাজ করে (যা ইসি 2 আবিষ্কার API ব্যবহার করে জনবহুল হয়) তবে কখনও কখনও আমার সত্যিই কেবল একটি একক মেশিনের প্রয়োজন হয়। ধন্যবাদ!
ভিক

3
এই কৌশলটি হোস্ট ফাইলটি ব্যবহার করা উচিত? আমি আমাদের ডেস্কটপ AWS EC2 সিস্টেমের জন্য একটি গতিশীল জায় যেমন হোস্ট ব্যবহার করছি এবং এটা ফেরৎ: skipping: no hosts matched। সম্ভবত এই কৌশলটি আর কাজ --limitকরে না?
hamx0r

1
এই কৌশলটি আমার পক্ষে কাজ করে নি। কিন্তু এই কাজ: $ ansible-playbook -kK --limit=myhost1 myplaybook.yml। মারওয়ানের উত্তর দেখুন।
ডন লি

2
এটি উল্লেখ করা উচিত যে এটি কাজ করার জন্য, হোস্টগুলি অবশ্যই allনাটক (গুলি) এ সেট করতে হবে - এটি বের করতে আমার কিছুটা সময় লেগেছে ...
রিমিগিয়াস স্ট্যাল্ডার

83

যদি প্লে- হোস্ট ভেরিয়েবলটি পরীক্ষা করে একক হোস্টের বেশি সরবরাহ করা হয় তবে এই পদ্ধতির প্রস্থানটি হবে । ব্যর্থ মডিউল যদি একক হোস্ট শর্ত পূরণ না হয় প্রস্থান করতে ব্যবহৃত হয়। নীচের উদাহরণগুলিতে দুটি হোস্ট এলিস এবং বব সহ হোস্ট ফাইল ব্যবহার করে।

ইউজার.আইএমএল (প্লেবুক)

---
- hosts: all
  tasks:
    - name: Check for single host
      fail: msg="Single host check failed."
      when: "{{ play_hosts|length }} != 1"
    - debug: msg='I got executed!'

হোস্ট ফিল্টার ছাড়াই প্লেবুক চালান

$ ansible-playbook user.yml
PLAY [all] ****************************************************************
TASK: [Check for single host] *********************************************
failed: [alice] => {"failed": true}
msg: Single host check failed.
failed: [bob] => {"failed": true}
msg: Single host check failed.
FATAL: all hosts have already failed -- aborting

একক হোস্টে প্লেবুক চালান

$ ansible-playbook user.yml --limit=alice

PLAY [all] ****************************************************************

TASK: [Check for single host] *********************************************
skipping: [alice]

TASK: [debug msg='I got executed!'] ***************************************
ok: [alice] => {
    "msg": "I got executed!"
}

1
নিশ্চিতভাবে সেরা এক, --limitযেতে উপায়
berto

7
play_hostsউত্তরীয় ২.২ এ অবমূল্যায়িত হয়েছে এবং এর সাথে প্রতিস্থাপিত হয়েছে ansible_play_hosts। প্রয়োজন ছাড়াই একটি হোস্টে চালানোর জন্য --limit, আপনি ব্যবহার করতে পারেন when: inventory_hostname == ansible_play_hosts[0]
ট্রেভর রবিনসন

[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{ play_hosts|length }} == ''উত্তর 2.8.4।
থমাস

32

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

---

- hosts: "{{ setupHosts }}"
  vars_prompt:
    - name: "setupHosts"
      prompt: "Which hosts would you like to setup?"
      private: no
  tasks:
    […]

2
খুব ঠান্ডা. এটিরও সুবিধা রয়েছে যে প্লেবুকটি ইনভেন্টরি ফাইলের সাথে সুনির্দিষ্ট নয়।
এরফান

2
সম্পাদনার জন্য Thx! আমি আসলে ভাবছিলাম কেন ইনপুটটি ডিফল্টরূপে "পাসওয়ার্ড শৈলীতে" চিকিত্সা করা হয়েছিল। আমি
ডক্সে

এই প্লেবুকের সাহায্যে প্রম্পটটি মুছে ফেলার জন্য হোস্টগুলি কমান্ড লাইন থেকে সেট করা যেতে পারে?
andig

1
@ এন্ডিগ --extra-varsএবং আপনার প্লেবুকের একটি সাধারণ
ভেরি

আসলে, আমি এটি কাজ করতে পারিনি - মনে {{ hosts }}হয় মান প্রবেশের আগে মূল্যায়ন করা হয় - বা কোনও বিশেষ কৌশল আছে?
রিমিগিয়াস স্ট্যাল্ডার

18

জেইমেলারের উত্তরটি প্রসারিত করতে, যদি আপনি দূরবর্তী মেশিনের কোনও উপসেটের সাথে মেলে ধরার প্যাটার্ন-ম্যাচিং ক্ষমতা রাখতে চান (ঠিক যেমন ansible কমান্ড করে) তবে সমস্ত মেশিনে দুর্ঘটনাক্রমে প্লেবুক চালানো খুব কঠিন করে তুলতে চাই, এটি হ'ল আমি কী নিয়ে এসেছি:

অন্যান্য উত্তরে একই প্লেবুক:

# file: user.yml  (playbook)
---
- hosts: '{{ target }}'
  user: ...

আসুন নিম্নলিখিত হোস্ট আছে:

imac-10.local
imac-11.local
imac-22.local

এখন, সমস্ত ডিভাইসে কমান্ডটি চালাতে, আপনাকে লক্ষ্য ভেরিয়েবলটি "সমস্ত" তে নির্ধারণ করতে হবে

ansible-playbook user.yml --extra-vars "target=all"

এবং এটি নির্দিষ্ট প্যাটার্নে সীমাবদ্ধ করতে আপনি সেট করতে পারেন target=pattern_here

বা, বিকল্পভাবে, আপনি যুক্তিটি ছেড়ে target=allএবং যুক্ত করতে পারেন --limit, উদাহরণস্বরূপ:

--limit imac-1*

অর্থাত। ansible-playbook user.yml --extra-vars "target=all" --limit imac-1* --list-hosts

যার ফলাফল:

playbook: user.yml

  play #1 (office): host count=2
    imac-10.local
    imac-11.local


13

সমস্ত উত্তরগুলি কীভাবে জটিল তা আমি সত্যিই বুঝতে পারি না, এটি করার উপায়টি সহজভাবে:

ansible-playbook user.yml -i hosts/hosts --limit imac-2.local --check

checkমোড কোন পরিবর্তন না করে, আপনি শুষ্ক রান মোডে চালাতে সক্ষম।


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

2
আহ, অবশ্যই, তবে লোকেরা যদি আমাকে উজ্জীবিত করে তবে এটি হতে পারে কারণ তারা উত্তরসূরি নবাবী (যেমন আমি যখন আমার উত্তরটি লিখেছিলাম) যা পতাকা সম্পর্কেও জানে না --check, তাই আমি অনুমান করি যে এটি এখনও দরকারী ডকুমেন্টেশন-অনুসারে, এই প্রশ্নটি খুব গুগল
নট করুন

6

ইসি 2 এক্সটার্নাল ইনভেন্টরি স্ক্রিপ্ট ব্যবহার করে এডাব্লুএস ব্যবহারকারীগণ কেবল উদাহরণ আইডি দ্বারা ফিল্টার করতে পারবেন:

ansible-playbook sample-playbook.yml --limit i-c98d5a71 --list-hosts

এটি কাজ করে কারণ ইনভেন্টরি স্ক্রিপ্টটি ডিফল্ট গ্রুপ তৈরি করে


4
বিকল্প - লিমিটটি ইসি 2 এর মধ্যে সীমাবদ্ধ নয় এবং আপনার তালিকাটির নাম / গোষ্ঠী হোস্ট করতে ব্যবহার করা যেতে পারে। ধন্যবাদ।
martinezdelariva

5

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

কাউকে প্লেবুকের দিকে ডেকে পাঠানোর জন্য একটি গ্রুপ নির্দিষ্ট করতে বাধ্য করার জন্য, আমরা প্লেবুকের শীর্ষে একটি ডামি এন্ট্রি বীজ করি:

[ansible-dummy-group]
dummy-server

তারপরে আমরা নীচের চেকটি ভাগ করে নেওয়া প্লেবুকের প্রথম পদক্ষেপ হিসাবে অন্তর্ভুক্ত করি:

- hosts: all
  gather_facts: False
  run_once: true
  tasks:
  - fail:
      msg: "Please specify a group to run this playbook against"
    when: '"dummy-server" in ansible_play_batch'

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


ansible_play_batchকেবলমাত্র বর্তমান ব্যাচকে তালিকাবদ্ধ করে, তাই ব্যাচিংয়ের সময় এটি এখনও অনিরাপদ। ansible_play_hostsপরিবর্তে এটি ব্যবহার করা ভাল ।
থমাস

তা বাদে, এই কৌশলটি সবচেয়ে সহজ এবং নিকটতম বলে মনে হয়েছিল যা বলা হয়েছিল; আমি এটি গ্রহণ করছি!
থমাস


4

এটি লক্ষ্যযুক্ত সার্ভারে নিজে প্লেবুকগুলি কীভাবে চালাতে পারে তা দেখায়।

আপনি যদি কোনও স্থানীয় সংযোগ ব্যবহার করতে চান তবে এটি কিছুটা কৌশলযুক্ত। তবে এটি ঠিক আছে যদি আপনি হোস্ট সেটিংয়ের জন্য ভেরিয়েবল ব্যবহার করেন এবং হোস্ট ফাইলটিতে লোকালহোস্টের জন্য একটি বিশেষ এন্ট্রি তৈরি করে create

(সমস্ত) প্লেবুকগুলিতে হোস্ট রয়েছে: লাইন এতে সেট করা আছে:

- hosts: "{{ target | default('no_hosts')}}"

ইনভেন্টরি হোস্ট ফাইলটিতে লোকালহোস্টের জন্য একটি এন্ট্রি যুক্ত করুন যা সংযোগটি স্থানীয় হতে সেট করে:

[localhost]
127.0.0.1  ansible_connection=local

তারপরে কমান্ড লাইনে রান কমান্ডগুলি সুস্পষ্টভাবে লক্ষ্য নির্ধারণ করে - উদাহরণস্বরূপ:

$ ansible-playbook --extra-vars "target=localhost" test.yml

জবাবদিহি টান ব্যবহার করার সময় এটি কাজ করবে:

$ ansible-pull -U <git-repo-here> -d ~/ansible --extra-vars "target=localhost" test.yml

আপনি যদি কমান্ড লাইনে ভেরিয়েবলটি সেট করতে ভুলে যান তবে কমান্ডটি নিরাপদে ত্রুটিযুক্ত হবে (যতক্ষণ না আপনি 'no_hosts' নামে একটি হোস্ট গ্রুপ তৈরি করেন নি!) এর সতর্কতা সহ:

skipping: no hosts matched

এবং উপরে উল্লিখিত হিসাবে আপনি একটি একক মেশিন (যতক্ষণ এটি আপনার হোস্ট ফাইলে থাকে ততক্ষণ) লক্ষ্যবস্তু করতে পারেন:

$ ansible-playbook --extra-vars "target=server.domain" test.yml

বা এর মতো কিছু সহ একটি গ্রুপ:

$ ansible-playbook --extra-vars "target=web-servers" test.yml

0

প্রভিশন নামে আমার একটি মোড়ক স্ক্রিপ্ট রয়েছে আপনাকে লক্ষ্যটি বাছাই করতে বাধ্য করে, তাই আমাকে অন্য কোথাও এটি পরিচালনা করতে হবে না।

যারা কৌতূহলী তাদের জন্য, আমি আমার ভ্যাগ্র্যান্টফাইলে যে বিকল্পগুলি ব্যবহার করে (মেঘ সিস্টেমের জন্য সংশ্লিষ্ট উত্তরযোগ্য আর্গ যুক্ত করে) এর জন্য ENV vars ব্যবহার করি এবং বাকী উত্তরীয় আরোগুলি দিয়ে যেতে দিন। যেখানে আমি এক সাথে 10 টিরও বেশি সার্ভার তৈরি এবং বিধান করছি যেখানে আমি ব্যর্থ সার্ভারগুলিতে একটি অটো পুনরায় চেষ্টা অন্তর্ভুক্ত করি (যতক্ষণ অগ্রগতি হচ্ছে - আমি একবারে 100 বা এর বেশি সার্ভার তৈরি করার সময় পেয়েছি প্রায়শই প্রথম কয়েকবার ব্যর্থ হতে পারে )।

echo 'Usage: [VAR=value] bin/provision [options] dev|all|TARGET|vagrant'
echo '  bootstrap - Bootstrap servers ssh port and initial security provisioning'
echo '  dev - Provision localhost for development and control'
echo '  TARGET - specify specific host or group of hosts'
echo '  all - provision all servers'
echo '  vagrant - Provision local vagrant machine (environment vars only)'
echo
echo 'Environment VARS'
echo '  BOOTSTRAP - use cloud providers default user settings if set'
echo '  TAGS - if TAGS env variable is set, then only tasks with these tags are run'
echo '  SKIP_TAGS - only run plays and tasks whose tags do not match these values'
echo '  START_AT_TASK - start the playbook at the task matching this name'
echo
ansible-playbook --help | sed -e '1d
    s#=/etc/ansible/hosts# set by bin/provision argument#
    /-k/s/$/ (use for fresh systems)/
    /--tags/s/$/ (use TAGS var instead)/
    /--skip-tags/s/$/ (use SKIP_TAGS var instead)/
    /--start-at-task/s/$/ (use START_AT_TASK var instead)/
'

0

কিছুটা আলাদা সমাধান হ'ল বিশেষ চলকটি ব্যবহার করা ansible_limitযা --limitউত্তরীয়ের বর্তমান সম্পাদনের জন্য সিএলআই বিকল্পের বিষয়বস্তু ।

- hosts: "{{ ansible_limit | default(omit) }}"

এখানে অতিরিক্ত ভেরিয়েবল সংজ্ঞায়িত করার দরকার নেই, কেবল --limitপতাকা সহ প্লেবুক চালান ।

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