सवाल जवाब में पैकेज स्थापना कार्यों को एकजुट कैसे करें?


मैं साथ शुरू कर रहा हूँ ansible और कई लिनक्स distros पर संकुल स्थापित करने के लिए, दूसरों के बीच, इसका उपयोग करेंगे।

मैं दस्तावेज़ों में देखता हूं कि 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"

मैं समझता हूं कि दो पैकेज प्रबंधक अलग हैं, लेकिन उनके पास अभी भी सामान्य बुनियादी उपयोगों का एक सेट है। अन्य ऑर्केस्टेटर (उदाहरण के लिए नमक) एक एकल स्थापित कमांड है।


61
2018-04-09 11:45


मूल


आपके पास तीन व्यंजन हो सकते हैं: एक जो एक सामान्य सूची में पुनरावृत्त होता है और फिर प्रत्येक एक ओएस-विशिष्ट सूचियों के लिए। मैं अभी यह पता लगाने की कोशिश कर रहा हूं कि एक सामान्य कॉन्फ़िगरेशन आइटम सेट होने के बाद ओएस-विशिष्ट सेवा नाम वाले हैंडलर को कैसे सूचित किया जाए। सौभाग्य! - dannyman
के संभावित डुप्लिकेट तथ्यों के आधार पर पैरामैट्रिक उत्तरदायी आदेश, इसे कैसे करें? - xddsg


जवाब:


अद्यतन: उत्तर 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



संपादित करें:  चूंकि माइकल देहान (Ansible के निर्माता) पैकेज प्रबंधक मॉड्यूल को सारणीबद्ध नहीं करना चुना है पसंद महाराज कर देता है, 

यदि आप अभी भी Ansible (Ansible <2.0) का पुराना संस्करण उपयोग कर रहे हैंदुर्भाग्यवश आपको इसे करने में संभाल करने की आवश्यकता होगी सब आपकी playbooks और भूमिकाओं के। IMHO यह प्लेबुक और भूमिका लेखकों पर बहुत अनावश्यक दोहराव वाले काम को धक्का देता है ... लेकिन यह वही तरीका है जो वर्तमान में है। ध्यान दें कि मैं यह नहीं कह रहा हूं कि हमें अपने सभी विशिष्ट विकल्पों और आदेशों का समर्थन करने की कोशिश करते समय अमूर्त पैकेज प्रबंधकों को दूर करने की कोशिश करनी चाहिए, लेकिन पैकेज प्रबंधक अज्ञेयवादी पैकेज को स्थापित करने का एक आसान तरीका है। मैं यह भी नहीं कह रहा हूं कि हमें सभी को कूदना चाहिए स्मार्ट पैकेज प्रबंधक बैंडवैगन, लेकिन आपके कॉन्फ़िगरेशन प्रबंधन टूल में कुछ प्रकार की पैकेज स्थापना अबास्ट्रक्शन लेयर क्रॉस-प्लेटफ़ॉर्म प्लेबुक / कुकबुक को सरल बनाने के लिए बहुत उपयोगी है। स्मार्ट प्रोजेक्ट दिलचस्प लग रहा है, लेकिन यह अभी तक बहुत अधिक गोद लेने के बिना distros और प्लेटफार्मों में पैकेज प्रबंधन को एकीकृत करने के लिए काफी महत्वाकांक्षी है ... यह देखना दिलचस्प होगा कि यह सफल है या नहीं। असली मुद्दा यह है कि कभी-कभी पैकेज नाम डिस्ट्रोज़ में भिन्न होते हैं, इसलिए हमें अभी भी केस स्टेटमेंट करना पड़ता है या नहीं 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

ध्यान दें कि यह बहुत बार दोहराया गया है और नहीं D.R.Y., और हालांकि कुछ चीजें पराक्रम विभिन्न प्लेटफार्मों पर अलग रहें और उन्हें संभालना होगा, आम तौर पर मुझे लगता है कि शेफ की तुलना में यह वर्बोज़ और अनावश्यक है:

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

और हाँ, तर्क है कि कुछ पैकेज नाम distros भर में अलग हैं। और यद्यपि वर्तमान में एक है आसानी से सुलभ डेटा की कमी, मैं अनुमान लगाने के लिए उद्यम करना होगा अधिकांश लोकप्रिय पैकेज नाम distros भर में आम हैं और एक सारणी पैकेज प्रबंधक मॉड्यूल के माध्यम से स्थापित किया जा सकता है। विशेष मामलों को किसी भी तरह से संभालने की आवश्यकता होगी, और पहले से ही अतिरिक्त काम करने की चीजों की आवश्यकता होगी डीआरआरवाई। यदि संदेह में है, तो जांचें pkgs.org


60
2017-12-05 03:14



उत्तर 2 के साथ आप संकुल मॉड्यूल का उपयोग इस सार के लिए कर सकते हैं docs.ansible.com/ansible/package_module.html - Guido
@ GuidoGarcía: बहुत अच्छा! Ansible 2.0 के लिए इसके बारे में एक नोट जोड़ना - TrinitronX


आप तथ्यों के माध्यम से पैकेज प्रबंधकों को अमूर्त कर सकते हैं

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

आपको बस कुछ तर्क चाहिए जो सेट करता है ansible_pkg_mgr सेवा मेरे apt या yum आदि।

Ansible भविष्य के मॉड्यूल में जो भी आप चाहते हैं उसे करने पर भी काम कर रहे हैं


13
2018-06-09 18:08



उत्तर सेट ansible_pkg_mgr खुद को किसी भी पैकेजर के बारे में जानता है। आपके लिए कुछ भी करना जरूरी नहीं है। मैं हर जगह इस विशेष निर्माण का उपयोग करता हूं। - Michael Hampton♦
सिंटैक्स अभी भी उन लोगों के लिए काफी उपयोगी है जो अपनी प्लेबुक के रन को अनुकूलित करना चाहते हैं। जेनेरिक पैकेज मॉड्यूल अभी तक with_items के लिए अनुकूलन प्रदान नहीं करता है इसलिए यह बहुत धीमी है जब इसे एक साथ कई पैकेज स्थापित करने के लिए उपयोग किया जाता है। - Daniel V.
@DanielV। ध्यान दें कि जिथब मुद्दा इसके लिए एक समाधान प्रदान करता है। - Michael Hampton♦


Ansible 2.0 से नया है Package-modul।

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

फिर आप इसे अपने प्रस्ताव की तरह उपयोग कर सकते हैं:

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

आपको अभी भी नाम अंतर पर विचार करना होगा।


6
2017-11-15 11:52





उत्तरदायी दस्तावेज देखें सशर्त आयात

यह सुनिश्चित करने के लिए एक कार्य है कि अपाचे चल रहा है भले ही सेवा नाम प्रत्येक ओएस में अलग हो।

---
- 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

3
2018-03-17 16:19





आप ऐसा नहीं करना चाहते हैं क्योंकि कुछ पैकेज नाम distros के बीच भिन्न होते हैं। उदाहरण के लिए आरएचईएल से संबंधित डिस्ट्रोज़ पर लोकप्रिय वेब सर्वर पैकेज का नाम दिया गया है httpd, जहां डेबियन से संबंधित डिस्ट्रोज़ पर इसका नाम दिया गया है apache2। इसी प्रकार अन्य प्रणाली और सहायक पुस्तकालयों की एक विशाल सूची के साथ।

सामान्य बुनियादी मानकों का एक सेट हो सकता है, लेकिन फिर पैकेज प्रबंधक के बीच अलग-अलग उन्नत पैरामीटर भी हैं। और आप एक अस्पष्ट स्थिति में नहीं रहना चाहते हैं जहां कुछ आदेशों के लिए आप एक वाक्यविन्यास का उपयोग करते हैं और अन्य आदेशों के लिए आप एक और वाक्यविन्यास का उपयोग करते हैं।


2
2018-04-10 12:00



यह अपेक्षाकृत कम या कम है (दुर्भाग्य से :)) तो मुझे आश्चर्य है कि कैसे salt दोनों पैकेज प्रबंधकों को एकजुट करने के लिए प्रबंधन करता है। वैसे भी, मैं फिर एक डबल विन्यास का सहारा लेगा। - WoJ
या एक distro चिड़ियाघर का प्रबंधन नहीं करते ;-) एक एकल-distro बुनियादी ढांचे में स्थानांतरित करें और एक खुशहाल जीवन जीते हैं। - Mxx
चिड़ियाघर सौभाग्य से केवल दो जानवर बड़े हैं, लेकिन यह सबसे कम संख्या है जिसे मैं जा सकता हूं :) - WoJ
@Mxx जो sysadmin के लिए ठीक तर्क है लेकिन एक सॉफ़्टवेयर विक्रेता या परामर्शदाता के बारे में क्या है जो एकाधिक प्लेटफ़ॉर्म का समर्थन करता है? - David H. Bennett
@ डेविड, फिर उन्हें डिस्ट्रो विक्रेताओं के साथ ले जाने की आवश्यकता है, उनके लिए एकीकृत पैकेज नाम और उपकरण इंस्टॉल करना है। यथार्थवादी रूप से कोई तरीका नहीं है कि Ansible के सभी संस्करणों के सभी समर्थित distros से सभी संकुलों का एक एकीकृत मैपिंग हो सकता है। - Mxx