আপডেট: উত্তরযোগ্য 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 দেখুন ।