কমান্ড লাইন থেকে উত্তরযোগ্য প্লেবুকের হোস্টগুলি ওভাররাইড করে


110

এটি এমন একটি প্লেবুকের খণ্ড যা আমি ব্যবহার করছি ( server.yml):

- name: Determine Remote User
  hosts: web
  gather_facts: false
  roles:
    - { role: remote-user, tags: [remote-user, always] }

আমার হোস্ট ফাইলটিতে সার্ভারের বিভিন্ন গ্রুপ রয়েছে, যেমন

[web]
x.x.x.x

[droplets]
x.x.x.x

এখন আমি এই প্লেবুকটি চালানোর জন্য চালানো থেকে ansible-playbook -i hosts/<env> server.ymlওভাররাইড করতে চাই ।hosts: webserver.yml[droplets]

আমি server.ymlসরাসরি সম্পাদনা না করেই কেবল একবারের জিনিস হিসাবে ওভাররাইড করতে পারি ?

ধন্যবাদ।

উত্তর:


128

আমি মনে করি না উত্তরীয় এই বৈশিষ্ট্যটি সরবরাহ করে যা এটি হওয়া উচিত। এখানে এমন কিছু যা আপনি করতে পারেন:

hosts: "{{ variable_host | default('web') }}"

এবং আপনি variable_hostকমান্ড-লাইন অথবা একটি ভার্স ফাইল থেকে পাস করতে পারেন , যেমন:

ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"

3
একটি ছোট সংশোধন প্রয়োজন। এটি হওয়া উচিতhosts: "{{ variable_host | default('web')}}"
এসপিএম

16
এই নোটটি এখানে আমি মনে করি যে এই সমাধানটির জন্য অনুসন্ধানযোগ্য উত্তরসূরিদের উত্তরটি সম্পূর্ণ করব: উদাহরণ:ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"
ফ্রেববিট

1
যখন (অর্থাত কি অনুক্রমে) এ ansible পার্স ভেরিয়েবল ভেরিয়েবল আছে group_vars/allপ্রদর্শিত হয় বিশ্লেষণ হতে পরেhosts: প্লেবুক এর লাইন। তবে, ভেরিয়েবলগুলি vars:এবং ভেরিয়েবলগুলি লাইনের vars_files:আগে পার্স করা হয় hosts:? দ্রষ্টব্য আমি প্রাধান্য সম্পর্কে জিজ্ঞাসা করছি না
ফিলিপ আলভারেজ

2
আপনি -eপরিবর্তে ব্যবহার করতে পারেন --extra-vars
বিশেষ্য

আরও তথ্যের জন্য অন্যান্য উত্তরগুলি দেখুন
আনন্দ বার্কি ফিলিপস

63

যে কেউ সমাধানটির সন্ধান করতে পারে For
প্লে বুক

- hosts: '{{ host }}'
  tasks:
  - debug: msg="Host is {{ ansible_fqdn }}"

জায়

[web]
x.x.x.x

[droplets]
x.x.x.x

কমান্ড: ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets" সুতরাং অতিরিক্ত গ্রুপে আপনি গ্রুপের নামটি নির্দিষ্ট করতে পারবেন


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

আমি মনে করি উপরের উত্তরের মতো ডিফল্ট সেট করা উচিত।
kakaz

19

এটি কিছুটা দেরি হয়ে গেছে তবে আমি মনে করি আপনি --limit or -lআরও নির্দিষ্ট হোস্টগুলিতে প্যাটার্নটি সীমাবদ্ধ করতে কমান্ডটি ব্যবহার করতে পারেন । (সংস্করণ ২.৩.২.০)

আপনি থাকতে পারে - hosts: all (or group) tasks: - some_task

এবং তারপরে ansible-playbook playbook.yml -l some_more_strict_host_or_pattern এবং --list-hostsকোনটি হোস্টে এই কনফিগারেশনটি প্রয়োগ করা হবে তা দেখতে পতাকা ব্যবহার করুন ।


3
আমি জবাবদিহি করতে খুব নতুন কিন্তু আমি এটি একটি খুব কার্যকর সমাধান হিসাবে বিবেচনা করি, অন্যদের তুলনায় অনেক বেশি কমপ্যাক্ট। কেন এটি ডাউনভোটেড ছিল?
আলেসান্দ্রো ডেন্তেলা 15

16
এটা বিপজ্জনক. limitপ্লেবুকের প্রভাবিত হোস্টের তালিকায় যদি কেউ ভুলে যায় তবে অনেক ক্ষতি হতে পারে।
আলেকজান্ডার শ্যাচব্লিকিন

3
আমি দেখতে পেয়েছি যে --extra-vars "variable_host=newtarget(s)"গৃহীত সমাধানের মতো ব্যবহার করাও বিপজ্জনক এবং আরও জটিল সমাধান। এটি একটি ডিফল্ট হোস্ট ব্যবহার করে webযার পরিবর্তে এখানে প্রয়োগ করা যেতে পারে all। আপনি কোনও ভুল না এড়াতে ডিফল্ট হিসাবে একটি কঠোর হোস্ট গ্রুপটি ব্যবহার করতে পারেন এবং --list-hostsআপনি কোন হোস্টগুলি প্রভাবিত করছেন সে সম্পর্কে পরিষ্কার ধারণা পেতে পতাকাটি ব্যবহার করতে পারেন।
জোনাথন হামেল

3
অতিরিক্ত-ওয়ারগুলির সাথে সমাধান খালি গোষ্ঠী (বা অ-বিদ্যমান) ডিফল্ট মান হিসাবে নির্দিষ্ট করার অনুমতি দেয়। সুতরাং আপনি যদি কমান্ড লাইনের মাধ্যমে ভেরিয়েবল সরবরাহ করতে ভুলে যান তবে খারাপ কিছু হয় না। "--Limit" বিকল্পের সাথে সমাধান আরও বিপজ্জনক কারণ প্লেবুক হোস্টগুলির জন্য ডিফল্ট মান হিসাবে খালি গোষ্ঠীটি ব্যবহার করতে পারে না। হোস্ট মানটিতে বিকল্প "--llmit" প্রয়োগ করা হয় তাই এটি খালি দলগুলিতে প্রয়োগ করা হবে এবং খালি ফলাফল সরবরাহ করবে। সুতরাং আপনার "সমস্ত" বা অন্য কিছু খালি হোস্টকে ডিফল্ট মান হিসাবে ব্যবহার করতে হবে। এবং কোনও দিন আপনি "--limit" আর্গুমেন্ট সরবরাহ করতে ভুলে যাবেন এবং প্লেবুক সমস্ত হোস্টের জন্য প্রয়োগ করা হবে।
গ্রেগরি পেটখোভ

4
কলার সরবরাহ করতে ব্যর্থ হয়েছে এমন কেসটি ধরার জন্য এটি @ টিএমট্রনের জবাবের সাথে একত্রিত হওয়া উচিত --limit(অন্যথায় এটি সমস্ত সম্ভাব্য হোস্টকে প্রভাবিত করবে, যা আপনার
পছন্দসই

14

ব্যবহারকারীকে জবাবদিহি সীমা বিকল্পটি নির্দিষ্ট করতে বাধ্য করার জন্য আমরা একটি সাধারণ ব্যর্থ কাজটি ব্যবহার করি , যাতে আমরা সমস্ত হোস্টের উপর ডিফল্ট / দুর্ঘটনা অনুসারে মৃত্যুদণ্ড কার্যকর করি না।

আমার সর্বাধিক সহজ উপায়টি হ'ল:

---
- name: Force limit
  # 'all' is okay here, because the fail task will force the user to specify a limit on the command line, using -l or --limit
  hosts: 'all'

  tasks:
  - name: checking limit arg
    fail:
      msg: "you must use -l or --limit - when you really want to use all hosts, use -l 'all'"
    when: ansible_limit is not defined
    run_once: true

এখন আমরা প্লেবুক চালানোর সময় অবশ্যই -l(= --limitবিকল্প) ব্যবহার করা উচিত eg

ansible-playbook playbook.yml -l www.example.com

সীমা বিকল্প বিকল্প ডক্স :

এক বা একাধিক হোস্টের সীমাবদ্ধতা যখন কোনও হোস্ট গ্রুপের বিরুদ্ধে কোনও প্লেবুক চালাতে চায় তবে এটি কেবলমাত্র সেই গোষ্ঠীর এক বা একাধিক সদস্যের বিরুদ্ধেই প্রয়োজন।

একটি হোস্ট সীমাবদ্ধ

ansible-playbook playbooks/PLAYBOOK_NAME.yml --limit "host1"

একাধিক হোস্টের সীমাবদ্ধ

ansible-playbook playbooks/PLAYBOOK_NAME.yml --limit "host1,host2"

নেতিবাচক সীমা।
দ্রষ্টব্য: একক উদ্ধৃতি অবশ্যই ব্যাশ সংযোগ রোধ করতে ব্যবহার করা উচিত।

ansible-playbook playbooks/PLAYBOOK_NAME.yml --limit 'all:!host1'

হোস্ট গ্রুপের সীমাবদ্ধতা

ansible-playbook playbooks/PLAYBOOK_NAME.yml --limit 'group1'


7

আমি অন্য পদ্ধতির ব্যবহার করছি যা কোনও ইনভেন্টরির প্রয়োজন হয় না এবং এই সাধারণ কমান্ডটির সাথে কাজ করে:

ansible-playbook site.yml -e working_host=myhost

এটি সম্পাদন করতে আপনার দুটি নাটক সহ একটি প্লেবুক প্রয়োজন:

  • প্রথম খেলায় লোকালহোস্টে চালানো হয় এবং ইনমেমরি ইনভেন্টরিতে একটি পরিচিত গ্রুপে একটি হোস্ট (প্রদত্ত ভেরিয়েবল থেকে) যুক্ত করুন
  • দ্বিতীয় নাটকটি এই পরিচিত গ্রুপে চলে

একটি কার্যকারী উদাহরণ (এটি অনুলিপি করুন এবং এটি পূর্ববর্তী কমান্ড দিয়ে চালায়):

- hosts: localhost
  connection: local
  tasks:
  - add_host:
      name: "{{ working_host }}"
      groups: working_group
    changed_when: false

- hosts: working_group
  gather_facts: false
  tasks:
  - debug:
      msg: "I'm on {{ ansible_host }}"

আমি উত্তরবান ২.৪.৩ এবং ২.৩.৩ ব্যবহার করছি


7

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

- হোস্টগুলি: "{{ভেরিয়েবল_ হোস্ট | ডিফল্ট ('খালি_গোষ্ঠী')}}"

তারপরে কার্যগুলিতে চেক যুক্ত করুন:

   কাজ:
   - নাম: স্ক্রিপ্ট ব্যর্থ হলে প্রয়োজনীয় ভেরিয়েবল_হোস্টের প্যারামিটার অনুপস্থিত
     ব্যর্থ:
       #: "আপনাকে --extra-vars = 'ভেরিয়েবল_হোস্ট =' যোগ করতে হবে" "
     কখন: (ভেরিয়েবল_হোস্ট সংজ্ঞায়িত করা হয় না) বা (ভেরিয়েবল_হোস্ট == "")

5

একটি সমাধানের জন্য সবেমাত্র এই গুগল জুড়ে এসেছিল। প্রকৃতপক্ষে, উত্তরযোগ্য 2.5 এ একটি আছে। আপনি নিজের ইনভেন্টরি ফাইলটি এর সাথে নির্দিষ্ট করতে পারেন --inventory:ansible --inventory configs/hosts --list-hosts all


আমি বিশ্বাস করি এটি আমাদের প্রভু ২০১৮ সালের সবচেয়ে সঠিক উত্তর Ans উত্তর থেকে ২.৮.৪-এর উত্তর:-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY specify inventory host path or comma separated host list. --inventory-file is deprecated
পিয়ানশর্প

3

আপনি যদি কোনও হোস্টের সাথে সম্পর্কিত কোনও কাজ চালাতে চান তবে বিভিন্ন হোস্টে আপনার প্রতিনিধি_তে চেষ্টা করা উচিত ।

আপনার ক্ষেত্রে, আপনার লোকালহোস্টে (উত্তরযোগ্য মাস্টার) এবং কলিং ansible-playbookকমান্ডের প্রতিনিধি করা উচিত


2

আমি উত্তরযোগ্য 2.5 (ঠিক 2.5.3) ব্যবহার করছি এবং মনে হচ্ছে হোস্ট প্যারামটি কার্যকর করার আগে ভার্স ফাইলটি লোড হয়েছে। সুতরাং আপনি একটি ভার্স.আইএমএল ফাইলে হোস্ট সেট করতে পারেন এবং কেবল hosts: {{ host_var }}আপনার প্লেবুকে লিখতে পারেন

উদাহরণস্বরূপ, আমার প্লেবুক.আইএমএল এ:

---
- hosts: "{{ host_name }}"
  become: yes
  vars_files:
    - vars/project.yml
  tasks:
    ... 

এবং ভার্স / প্রজেক্ট.আইএমএল এর ভিতরে:

---

# general
host_name: your-fancy-host-name

0

এখানে একটি দুর্দান্ত সমাধান আমি --limitবিকল্পটির মাধ্যমে হোস্টগুলি নিরাপদে নির্দিষ্ট করতে এসেছি । এই উদাহরণে, প্লেবুকটি --limitবিকল্পের মাধ্যমে নির্দিষ্ট কোনও হোস্ট ছাড়াই কার্যকর করা হলে নাটকটি শেষ হবে ।

এটি উত্তরীয় সংস্করণ 2.7.10 এ পরীক্ষা করা হয়েছিল

---
- name: Playbook will fail if hosts not specified via --limit option.
  # Hosts must be set via limit. 
  hosts: "{{ play_hosts }}"
  connection: local
  gather_facts: false
  tasks:
  - set_fact:
      inventory_hosts: []
  - set_fact:
      inventory_hosts: "{{inventory_hosts + [item]}}"
    with_items: "{{hostvars.keys()|list}}"

  - meta: end_play
    when: "(play_hosts|length) == (inventory_hosts|length)"

  - debug:
      msg: "About to execute tasks/roles for {{inventory_hostname}}"

0

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

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

যদি --limitবিকল্পটি বাদ দেওয়া হয়, তবে উত্তরযোগ্য একটি সতর্কতা জারি করে, তবে কোনও হোস্ট মেলে না বলে কিছু করে না।

[WARNING]: Could not match supplied host pattern, ignoring: None

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