Ich beginne mit ansible und werde es unter anderem verwenden, um Pakete auf mehreren Linux-Distributionen zu installieren.
Ich sehe in den Dokumenten, dass die Befehle yum
und apt
getrennt sind - was wäre der einfachste Weg, sie zu vereinheitlichen und so etwas zu benutzen:
- name: install the latest version of Apache
unified_install: name=httpd state=latest
Anstatt von
- 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"
Ich verstehe, dass die beiden Paketmanager unterschiedlich sind, aber immer noch eine Reihe gemeinsamer grundlegender Verwendungen haben. Andere Orchestatoren ( z. B. Salt ) verfügen über einen einzigen Installationsbefehl.
Antworten:
Update: Ab Ansible 2.0 gibt es jetzt ein generisches & abstrahiertes
package
ModulAnwendungsbeispiele:
Wenn der Paketname für verschiedene Betriebssystemfamilien gleich ist, ist dies so einfach wie folgt:
Wenn sich der Paketname in den Betriebssystemfamilien unterscheidet, können Sie ihn mit verteilungs- oder betriebssystemfamilienspezifischen vars-Dateien verarbeiten:
Erstellen Sie dann für jedes Betriebssystem, mit dem Sie anders umgehen müssen, eine vars-Datei:
BEARBEITEN:
Da Michael DeHaan (der Schöpfer von Ansible) sich dafür entschieden hat, die Module des Paketmanagers nicht zu abstrahieren, wie es Chef tut,Wenn Sie noch eine ältere Version von Ansible (Ansible <2.0) verwenden , müssen Sie dies leider in all Ihren Playbooks und Rollenerledigen. IMHO, dies bringt eine Menge unnötiger sich wiederholender Arbeit auf die Autoren von Spielbüchern und Rollen ... aber es ist so, wie es derzeit ist. Beachten Sie, dass wir nicht versuchen sollten, Paketmanager zu abstrahieren, während wir weiterhin versuchen, alle ihre spezifischen Optionen und Befehle zu unterstützen, sondern nur einen einfachen Weg haben, ein Paket zu installieren, das paketmanager-unabhängig ist. Ich sage auch nicht, dass wir alle auf den Smart Package Manager umsteigen solltenDiese Art von Paketinstallations-Abstraktionsschicht in Ihrem Konfigurationsmanagement-Tool ist jedoch sehr nützlich, um plattformübergreifende Playbooks / Kochbücher zu vereinfachen. Das Smart-Projekt sieht interessant aus, aber es ist ziemlich ehrgeizig, das Paketmanagement über Distributionen und Plattformen hinweg zu vereinheitlichen, ohne dass es viel Akzeptanz findet. Es wird interessant sein zu sehen, ob es erfolgreich ist. Das eigentliche Problem ist nur, dass die Paketnamen manchmal in verschiedenen Distributionen unterschiedlich sind. Wir müssen also noch case-Anweisungen oder
when:
Anweisungen ausführen, um die Unterschiede zu behandeln.Die Art und Weise, wie ich damit umgegangen bin, besteht darin, dieser
tasks
Verzeichnisstruktur in einem Playbook oder einer Rolle zu folgen :Und dann haben Sie dies in meinem
main.yml
:Dies in
foo.yml
(für Paket 'foo'):Dann für die verschiedenen Paketmanager:
Geeignet:
Lecker
Homebrew:
Beachten Sie, dass diese schrecklich repetitive und nicht DRY , und obwohl einige Dinge vielleicht anders auf den verschiedenen Plattformen und werden gehandhabt werden müssen, in der Regel denke ich , das ausführlich und unhandlich ist , wenn zu Koch verglichen:
Und ja, es gibt das Argument, dass einige Paketnamen in Distributionen unterschiedlich sind. Und obwohl es derzeit an leicht zugänglichen Daten mangelt , würde ich vermuten, dass die beliebtesten Paketnamen in Distributionen häufig vorkommen und über ein abstrahiertes Paketmanagermodul installiert werden könnten. Sonderfälle müssten ohnehin behandelt werden und würden bereits zusätzliche Arbeit erfordern, um die Dinge weniger trocken zu machen .
quelle
Sie können Paketmanager über Fakten abstrahieren
Alles, was Sie brauchen, ist eine Logik, die
ansible_pkg_mgr
aufapt
oderyum
usw. setzt .Ansible arbeitet auch daran, in einem zukünftigen Modul das zu tun, was Sie wollen .
quelle
ansible_pkg_mgr
sich an jeden bekannten Packager. Sie müssen nichts tun. Ich benutze dieses spezielle Konstrukt überall.Ab Ansible 2.0 gibt es das neue
Package
-modul.http://docs.ansible.com/ansible/package_module.html
Sie können es dann wie Ihren Vorschlag verwenden:
Sie müssen noch Namensunterschiede berücksichtigen.
quelle
Lesen Sie die Ansible-Dokumentation zu bedingten Importen .
Eine Aufgabe, um sicherzustellen, dass Apache auch dann ausgeführt wird, wenn die Dienstnamen in den einzelnen Betriebssystemen unterschiedlich sind.
quelle
Sie möchten dies nicht tun, da sich bestimmte Paketnamen zwischen Distributionen unterscheiden. Zum Beispiel wird auf RHEL-bezogenen Distributionen das beliebte Webserver-Paket genannt
httpd
, während es auf Debian-bezogenen Distributionen heißtapache2
. Ähnlich verhält es sich mit einer riesigen Liste anderer System- und Unterstützungsbibliotheken.Möglicherweise gibt es eine Reihe gemeinsamer Basisparameter, aber es gibt auch eine Reihe erweiterter Parameter, die sich zwischen den Paketmanagern unterscheiden. Und Sie möchten nicht in einer mehrdeutigen Situation sein, in der Sie für einige Befehle eine und für andere Befehle eine andere Syntax verwenden.
quelle
salt
gelingt, beide Paketmanager zu vereinen. Jedenfalls werde ich dann auf eine doppelte Konfiguration zurückgreifen.