अद्यतन: 2.0 के रूप में, अब एक सामान्य और अमूर्त package
मॉड्यूल है
उपयोग के उदाहरण:
अब जब पैकेज का नाम विभिन्न OS परिवारों में समान है, तो यह उतना ही सरल है:
---
- name: Install foo
package: name=foo state=latest
जब पैकेज का नाम OS परिवारों में भिन्न होता है, तो आप इसे वितरण या OS परिवार विशिष्ट vars फ़ाइलों के साथ संभाल सकते हैं:
---
# 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
फिर, प्रत्येक OS के लिए जिसे आपको अलग-अलग संभालना होगा ... एक var फ़ाइल बनाएं:
---
# 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
EDIT: चूंकि माइकल डेहान (Ansible के निर्माता) ने पैकेज मैनेजर मॉड्यूल को अमूर्त करने के लिए नहीं चुना है, जैसे शेफ करता है,
यदि आप अभी भी Ansible (Ansible <2.0) के पुराने संस्करण का उपयोग कर रहे हैं , तो दुर्भाग्य से आपको अपनी सभी प्लेलिस्ट और भूमिकाओंमें ऐसा करने की आवश्यकता होगी। IMHO यह प्लेबुक और रोल लेखकों पर बहुत सारे अनावश्यक दोहराए जाने वाले काम को आगे बढ़ाता है ... लेकिन यह वर्तमान में ऐसा ही है। ध्यान दें कि मैं यह नहीं कह रहा हूं कि हमें अपने सभी विशिष्ट विकल्पों और आदेशों का समर्थन करने की कोशिश करते हुए पैकेज प्रबंधकों को दूर रखने की कोशिश करनी चाहिए, लेकिन पैकेज मैनेजर एग्नॉस्टिक पैकेज को स्थापित करने का एक आसान तरीका है। मैं यह भी नहीं कह रहा हूं कि हम सभी को स्मार्ट पैकेज मैनेजर पर कूदना चाहिएबैंडवागन, लेकिन यह कि आपके कॉन्फ़िगरेशन प्रबंधन टूल में पैकेज इंस्टॉलेशन एब्स्ट्रक्शन लेयर के कुछ प्रकार क्रॉस-प्लेटफॉर्म प्लेबुक / कुकबुक को सरल बनाने के लिए बहुत उपयोगी हैं। स्मार्ट परियोजना दिलचस्प लग रही है, लेकिन यह अभी भी बहुत ही गोद लेने के बिना विकृत और प्लेटफार्मों पर पैकेज प्रबंधन को एकजुट करने के लिए काफी महत्वाकांक्षी है ... यह देखना दिलचस्प होगा कि क्या यह सफल है। असली मुद्दा सिर्फ इतना है कि पैकेज के नाम कभी-कभी डिस्ट्रोस में भिन्न होते हैं, इसलिए हमें अभी भी 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: 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
होमब्रू:
---
- 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
और हाँ, यह तर्क है कि कुछ पैकेज के नाम डिस्ट्रोस में भिन्न हैं। और यद्यपि वर्तमान में आसानी से सुलभ डेटा की कमी है , मैं यह अनुमान लगाने के लिए उद्यम करूंगा कि सबसे लोकप्रिय पैकेज के नाम डिस्ट्रोस में आम हैं और एक अमूर्त पैकेज प्रबंधक मॉड्यूल के माध्यम से स्थापित किया जा सकता है। विशेष मामलों को वैसे भी संभालने की आवश्यकता होगी, और पहले से ही अतिरिक्त काम करने की आवश्यकता होगी, जिससे चीजें कम हो जाती हैं DRY यदि संदेह है, तो pkgs.org की जांच करें ।