Güncelleme: Ansible 2.0'dan itibaren artık genel ve soyutlanmış bir package
modül var.
Kullanım Örnekleri:
Şimdi, paket adı farklı işletim sistemi aileleri arasında aynı olduğunda, bu kadar basit:
---
- name: Install foo
package: name=foo state=latest
Paket adı işletim sistemi aileleri arasında farklılık gösterdiğinde, dağıtım veya işletim sistemi ailesine özgü değişken dosyalarıyla kullanabilirsiniz:
---
# 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
Ardından, farklı işlem yapmanız gereken her işletim sistemi için bir vars dosyası oluşturun:
---
# 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
DÜZENLEME: Michael DeHaan (yanıtlayıcı 'yaratıcısı) yana paket yöneticisi modüllerinin dışarı değil soyut seçmiştir gibi şef yapar
Hala daha eski bir Ansible sürümü kullanıyorsanız (Ansible <2.0) , ne yazık ki bunu tüm oyun defterleriniz ve rollerinizlehalletmeniz gerekecek. IMHO bu, oyun kitabını ve rol yazarlarını çok fazla gereksiz tekrarlayan çalışmaya itiyor ... ama şu anda olduğu gibi. Tüm özel seçeneklerini ve komutlarını desteklemeye devam ederken paket yöneticilerini uzağa soyutlamaya çalışmamız gerektiğini söylemiyorum, ancak paket yöneticisine agnostik olan bir paketi kurmak için kolay bir yol var. Ayrıca Akıllı Paket Yöneticisine atlamamız gerektiğini söylemiyorum.Ancak bu seçenek, yapılandırma yönetim aracınızdaki bir çeşit paket yükleme soyutlama katmanının platformlar arası oyun kitaplarını / yemek kitaplarını basitleştirmek için çok yararlı olduğunu gösteriyor. Akıllı proje ilginç görünüyor, ancak paket yönetimini dağıtım ve platformlar arasında çok fazla kabul edilmeden birleştirmek oldukça iddialı. Başarılı olup olmadığını görmek ilginç olacak. Asıl mesele, sadece paket isimlerinin dağıtımlar arasında farklı olma eğiliminde olmasıdır, bu yüzden when:
farklılıkları ele almak için yine de durum ifadeleri veya ifadeler yapmalıyız .
Bununla ilgilendiğim yöntem, bu tasks
dizin yapısını bir oyun kitabında veya rolünde takip etmektir :
roles/foo
└── tasks
├── apt_package.yml
├── foo.yml
├── homebrew_package.yml
├── main.yml
└── yum_package.yml
Ve sonra benim de bu var main.yml
:
---
# foo: entry point for tasks
# Generally only include other file(s) and add tags here.
- include: foo.yml tags=foo
Bu içinde foo.yml
('foo' paketi için):
---
# 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'
Ardından farklı paket yöneticileri için:
Uygun:
---
# 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
Yum:
---
# 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
Bunun son derece tekrarlayıcı olduğunu ve DRY olmadığını ve farklı platformlarda bazı şeylerin farklı olabileceği ve ele alınması gerekebileceğini unutmayın, genel olarak bunun Chef'inkine kıyasla ayrıntılı ve hantal olduğunu düşünüyorum:
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
Ve evet, bazı paket adlarının dağıtımlar arasında farklı olduğu iddiası var . Şu anda kolay erişilebilir veri eksikliği olmasına rağmen , en popüler paket adlarının dağıtımlar arasında yaygın olduğunu ve soyut bir paket yöneticisi modülü aracılığıyla kurulabileceğini tahmin etmeye teşebbüs ediyorum . Özel davaların yine de ele alınması gerekecekti ve zaten işleri daha az yapmak için fazladan çalışmaya ihtiyaç duyuyordu .