জবাবদিহিতভাবে প্যাকেজ ইনস্টলেশন কার্যগুলি কীভাবে একীভূত করা যায়?


68

আমি জবাবদিহি দিয়ে শুরু করছি এবং এটি অন্যদের মধ্যে বেশ কয়েকটি লিনাক্স ডিস্ট্রোজে প্যাকেজ ইনস্টল করতে ব্যবহার করব।

আমি ডক্সগুলিতে দেখতে পাচ্ছি যে yumএবং aptকমান্ডগুলি পৃথক করা হয়েছে - এগুলি একীকরণ করার এবং এরকম কিছু ব্যবহার করার সবচেয়ে সহজ উপায় কী হবে:

- name: install the latest version of Apache
  unified_install: name=httpd state=latest

পরিবর্তে

- name: install the latest version of Apache on CentOS
  yum: name=httpd state=latest
  when: ansible_os_family == "RedHat"

- name: install the latest version of Apache on Debian
  apt: pkg=httpd state=latest 
  when: ansible_os_family == "Debian"

আমি বুঝতে পারি যে দুটি প্যাকেজ পরিচালক আলাদা, তবে তাদের এখনও সাধারণ বেসিক ব্যবহারের একটি সেট রয়েছে। অন্যান্য অর্কেস্টেটর ( উদাহরণস্বরূপ লবণ ) এর একটি একক ইনস্টল আদেশ রয়েছে।


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

উত্তর:


66

আপডেট: উত্তরযোগ্য 2.0 হিসাবে, এখন একটি জেনেরিক এবং বিমূর্ত packageমডিউল রয়েছে

ব্যবহারের উদাহরণ:

এখন যখন বিভিন্ন ওএস পরিবারে প্যাকেজের নাম একই হয়, তখন এটি এতটা সহজ:

---
- name: Install foo
  package: name=foo state=latest

যখন প্যাকেজের নাম ওএস পরিবারগুলির মধ্যে পৃথক হয়, আপনি এটিকে বিতরণ বা ওএস পরিবারের নির্দিষ্ট ভার্স ফাইলগুলি দিয়ে পরিচালনা করতে পারেন:

---
# roles/apache/apache.yml: Tasks entry point for 'apache' role. Called by main.yml
# Load a variable file based on the OS type, or a default if not found.
- include_vars: "{{ item }}"
  with_first_found:
    - "../vars/{{ ansible_distribution }}-{{ ansible_distribution_major_version | int}}.yml"
    - "../vars/{{ ansible_distribution }}.yml"
    - "../vars/{{ ansible_os_family }}.yml"
    - "../vars/default.yml"
  when: apache_package_name is not defined or apache_service_name is not defined

- name: Install Apache
  package: >
    name={{ apache_package_name }}
    state=latest

- name: Enable apache service
  service: >
    name={{ apache_service_name }}
    state=started
    enabled=yes
  tags: packages

তারপরে, প্রতিটি ওএসের জন্য আপনাকে অবশ্যই আলাদাভাবে পরিচালনা করতে হবে ... একটি ভার্স ফাইল তৈরি করুন:

---
# roles/apache/vars/default.yml
apache_package_name: apache2
apache_service_name: apache2

---
# roles/apache/vars/RedHat.yml
apache_package_name: httpd
apache_service_name: httpd

---
# roles/apache/vars/SLES.yml
apache_package_name: apache2
apache_service_name: apache2

---
# roles/apache/vars/Debian.yml
apache_package_name: apache2
apache_service_name: apache2

---
# roles/apache/vars/Archlinux.yml
apache_package_name: apache
apache_service_name: httpd



সম্পাদনা: মাইকেল ডিহান (উত্তরীয় স্রষ্টা) যেহেতু শেফের মতো প্যাকেজ ম্যানেজার মডিউলগুলি বিমূর্ত না করা বেছে নিয়েছেন ,

আপনি যদি এখনও উত্তরীয় (উত্তরযোগ্য ২.০) এর পুরানো সংস্করণ ব্যবহার করেন তবে দুর্ভাগ্যক্রমে আপনার সমস্ত প্লেবুক এবং ভূমিকাতে এটি পরিচালনা করতে হবে। আইএমএইচও এটি প্লেবুক এবং ভূমিকা লেখকদের উপর প্রচুর অপ্রয়োজনীয় পুনরাবৃত্তিমূলক কাজকে ঠেলে দেয় ... তবে এটি বর্তমানে এটির মতো। মনে রাখবেন যে আমি বলছি না যে প্যাকেজ পরিচালকদের তাদের নির্দিষ্ট বিকল্প এবং কমান্ডগুলির সমস্ত সমর্থন করার চেষ্টা করার পরেও আমাদের বিমূর্ত করার চেষ্টা করা উচিত, তবে প্যাকেজ ম্যানেজার অগ্নিস্টিক এমন একটি প্যাকেজ ইনস্টল করার সহজ উপায় আছে। আমি এটাও বলছি না যে আমাদের সকলকে স্মার্ট প্যাকেজ ম্যানেজারে ঝাঁপ দেওয়া উচিতব্যান্ডউইগন, তবে আপনার কনফিগারেশন পরিচালন সরঞ্জামে কিছু ধরণের প্যাকেজ ইনস্টলেশন বিমূর্ততা স্তর ক্রস-প্ল্যাটফর্মের প্লেবুক / কুকবুকগুলি সহজ করার জন্য খুব দরকারী। স্মার্ট প্রকল্পটি আকর্ষণীয় দেখায়, তবে এখনও কিছু গ্রহণ না করেই ডিস্ট্রোজ এবং প্ল্যাটফর্ম জুড়ে প্যাকেজ পরিচালনা একীভূত করা বেশ উচ্চাকাঙ্ক্ষী ... এটি সফল কিনা তা দেখার জন্য আকর্ষণীয় হবে। আসল সমস্যাটি হ'ল প্যাকেজের নামগুলি মাঝে মাঝে ডিস্ট্রো জুড়ে আলাদা থাকে, তাই আমাদের পার্থক্যগুলি পরিচালনা করতে এখনও কেস স্টেটমেন্ট বা when:বিবৃতি করতে হবে।

আমি এটির সাথে যেভাবে আচরণ করছি তা tasksকোনও প্লেবুক বা ভূমিকাতে এই ডিরেক্টরি কাঠামোটি অনুসরণ করা :

roles/foo
└── tasks
    ├── apt_package.yml
    ├── foo.yml
    ├── homebrew_package.yml
    ├── main.yml
    └── yum_package.yml

এবং তারপরে এটি আমার মধ্যে রাখুন main.yml:

---
# foo: entry point for tasks
#                 Generally only include other file(s) and add tags here.

- include: foo.yml tags=foo

এটি foo.yml(প্যাকেজ 'foo' এর জন্য):

---
# foo: Tasks entry point. Called by main.yml
- include: apt_package.yml
  when: ansible_pkg_mgr == 'apt'
- include: yum_package.yml
  when: ansible_pkg_mgr == 'yum'
- include: homebrew_package.yml
  when: ansible_os_family == 'Darwin'

- name: Enable foo service
  service: >
    name=foo
    state=started
    enabled=yes
  tags: packages
  when: ansible_os_family != 'Darwin'

তারপরে বিভিন্ন প্যাকেজ পরিচালকদের জন্য:

কার্যক্ষম:

---
# tasks file for installing foo on apt based distros

- name: Install foo package via apt
  apt: >
    name=foo{% if foo_version is defined %}={{ foo_version }}{% endif %}
    state={% if foo_install_latest is defined and foo_version is not defined %}latest{% else %}present{% endif %}
  tags: packages

ইয়াম:

---
# tasks file for installing foo on yum based distros
- name: Install EPEL 6.8 repos (...because it's RedHat and foo is in EPEL for example purposes...)
  yum: >
    name={{ docker_yum_repo_url }}
    state=present
  tags: packages
  when: ansible_os_family == "RedHat" and ansible_distribution_major_version|int == 6

- name: Install foo package via yum
  yum: >
    name=foo{% if foo_version is defined %}-{{ foo_version }}{% endif %}
    state={% if foo_install_latest is defined and foo_version is not defined %}latest{% else %}present{% endif %}
  tags: packages

- name: Install RedHat/yum-based distro specific stuff...
  yum: >
    name=some-other-custom-dependency-on-redhat
    state=latest
  when: ansible_os_family == "RedHat"
  tags: packages

Homebrew:

---
- name: Tap homebrew foobar/foo
  homebrew_tap: >
    name=foobar/foo
    state=present

- homebrew: >
    name=foo
    state=latest

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

package 'foo' do
  version node['foo']['version']
end

case node["platform"]
when "debian", "ubuntu"
  # do debian/ubuntu things
when "redhat", "centos", "fedora"
  # do redhat/centos/fedora things
end

এবং হ্যাঁ, কিছু প্যাকেজের নামগুলি ডিস্ট্রো জুড়ে আলাদা are এমন যুক্তি রয়েছে। যদিও বর্তমানে সহজেই অ্যাক্সেসযোগ্য ডেটার অভাব রয়েছে , আমি অনুমান করার উদ্যোগ নিয়েছিলাম যে সর্বাধিক জনপ্রিয় প্যাকেজ নামগুলি ডিস্ট্রোজ জুড়ে প্রচলিত এবং একটি বিমূর্ত প্যাকেজ ম্যানেজার মডিউলটির মাধ্যমে ইনস্টল করা যেতে পারে। বিশেষ কেসগুলি যেভাবেই হ্যান্ডল করা দরকার, এবং ইতিমধ্যে অতিরিক্ত কাজ করা দরকার যাতে কম জিনিস তৈরি হয় DRY যদি সন্দেহ হয়, pkgs.org দেখুন


Ansible 2 আপনি এই সব বিমূর্ত প্যাকেজ মডিউল ব্যবহার করতে পারেন docs.ansible.com/ansible/package_module.html
গাইডো

@ গুডো গ্র্যাকিয়া: খুব সুন্দর! উত্তরযোগ্য ২.০ এর জন্য এই সম্পর্কে একটি নোট যুক্ত করা হচ্ছে
ত্রিনিট্রনএক্স

সম্ভবত এটি উল্লেখযোগ্য যে আপনি কমা দ্বারা পৃথক তালিকা বা প্যাকেজগুলির কেবল একটি তালিকা নির্দিষ্ট করতে পারেন।
ওয়েজ টার্নার

13

আপনি সত্যের মাধ্যমে প্যাকেজ পরিচালকদের বিমূর্ত করতে পারেন

- name: Install packages
  with_items: package_list
  action: "{{ ansible_pkg_mgr }} state=installed name={{ item }}"

আপনার যা দরকার তা হ'ল কিছু যুক্তি যা সেট ansible_pkg_mgrকরতে পারে aptবা yumইত্যাদি sets

উত্তরীয়রা ভবিষ্যতের মডিউলটিতে আপনি যা চান তা করার বিষয়েও কাজ করছে


1
জবাবদিহি যে ansible_pkg_mgrকোনও প্যাকেজারের জন্য এটি জানে তার জন্য নিজেকে সেট করে। আপনার কিছু করার দরকার নেই। আমি এই বিশেষ নির্মাণটি সর্বত্র ব্যবহার করি।
মাইকেল হ্যাম্পটন

যারা তাদের প্লেবুকের রানটি অপ্টিমাইজ করতে চান তাদের জন্য সিনট্যাক্সটি এখনও বেশ কার্যকর। জেনেরিক প্যাকেজ মডিউলটি উইট -াইটেমগুলির জন্য এখনও অপ্টিমাইজেশন সরবরাহ করে না তাই এটি একবারে একাধিক প্যাকেজ ইনস্টল করতে ব্যবহৃত হলে এটি অনেক ধীর হয়।
ড্যানিলা ভারশিনিন

@DanielV। দ্রষ্টব্য যে গিথুব ইস্যু তার জন্য একটি কার্যকর প্রস্তাব দেয়।
মাইকেল হ্যাম্পটন

6

Packageউত্তরীয় 2.0 থেকে নতুন- মডুল রয়েছে।

http://docs.ansible.com/ansible/package_module.html

তারপরে আপনি এটি আপনার প্রস্তাবের মতো ব্যবহার করতে পারেন:

- name: install the latest version of Apache
  package: name=httpd state=latest

আপনি এখনও নামের পার্থক্য বিবেচনা করতে হবে।


3

শর্তাধীন আমদানি সম্পর্কিত উত্তরীয়দের ডকুমেন্টেশন দেখুন ।

প্রতিটি ওএস জুড়ে পরিষেবার নাম পৃথক হলেও অ্যাপাচি চলমান তা নিশ্চিত করার একটি কাজ।

---
- hosts: all
  remote_user: root
  vars_files:
    - "vars/common.yml"
    - [ "vars/{{ ansible_os_family }}.yml", "vars/os_defaults.yml" ]
  tasks:
  - name: make sure apache is running
    service: name={{ apache }} state=running

2

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

প্রচলিত বেসিক প্যারামিটারগুলির একটি সেট থাকতে পারে, তবে এরপরে প্যাকেজ পরিচালকদের মধ্যে পৃথক পৃথক আরও অনেকগুলি উন্নত পরামিতি রয়েছে। এবং আপনি একটি দ্ব্যর্থক পরিস্থিতিতে থাকতে চান না যেখানে কিছু কমান্ডের জন্য আপনি একটি বাক্য গঠন ব্যবহার করেন এবং অন্যান্য কমান্ডের জন্য আপনি অন্য বাক্য গঠন ব্যবহার করেন।


এটি আমি কম-বেশি যা প্রত্যাশা করছিলাম তা হ'ল (দুর্ভাগ্যক্রমে :)) তাই আমি ভাবছি কীভাবে saltউভয় প্যাকেজ পরিচালককে একত্রিত করতে পরিচালিত হয়। যাইহোক, আমি তখন একটি ডাবল কনফিগারেশন অবলম্বন করব।
ওউজে

বা কোনও ডিস্ট্রো চিড়িয়াখানা পরিচালনা করবেন না ;-) একটি একক-ডিস্ট্রো অবকাঠামোতে স্থানান্তরিত করুন এবং সুখী জীবন যাপন করুন।
এমএক্সএক্স

চিড়িয়াখানাটি সৌভাগ্যক্রমে মাত্র দুটি প্রাণী বড় তবে
এটিতে

1
@ এমএক্সএক্স যে সিসাদমিনের পক্ষে সূক্ষ্ম যুক্তিযুক্ত তবে একাধিক প্ল্যাটফর্ম সমর্থন করে এমন একটি সফ্টওয়্যার বিক্রেতা বা পরামর্শক সম্পর্কে কী?
ডেভিড এইচ। বেনেট

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