Antworten:
Ich habe Ansible nie benutzt, aber seit ein paar Wochen versuche ich herauszufinden, wie gut Ansible im Vergleich zu Shell-Scripten sein kann - was zumindest in meinem Fall beweist, dass die eindringlichen Werbekampagnen, die sie durchführen, effektiv sind! Nach vielen erfolglosen Versuchen, die beweisen, dass ihre Dokumentation eine der offensichtlichsten Fragen nicht beantworten kann, glaube ich, dass ich es endlich verstanden habe:
Schauen wir uns nun das Einführungsvideo an und gehen wir als potenzieller neuer Benutzer das Einführungsmaterial zu Ansible durch und vergleichen es mit dem, was ein erfahrener Shell-Programmierer von Anfang an produzieren kann.
Meine Schlussfolgerung ist, dass Ansible im Vergleich zu Shell-Skripten im Wesentlichen Folgendes bietet: 1. Die Möglichkeit, zu überprüfen, ob ein System mit einem gewünschten Status übereinstimmt. 2. Die Fähigkeit, sich in Ansible Tower zu integrieren. In einigen wichtigen Fällen, wie bei der Implementierung des Musters für unveränderliche Server, ist der Punkt 1 wahrscheinlich nicht sehr nützlich, daher ist die Liste eher dünn.
Mein Fazit ist, dass die Vorteile von Ansible gegenüber Shell-Scripting, wie sie in der Dokumentation dargestellt werden, in einigen wenigen optimistischen Fällen sinnvoll sein könnten, die von den verfügbaren Modulen gut abgedeckt werden, aber im Allgemeinen klein oder sogar hypothetisch sind. Für einen erfahrenen Shell-Programmierer werden diese Vorteile höchstwahrscheinlich durch andere Aspekte des Kompromisses ausgeglichen.
Aber das beweist vielleicht nur, wie schlecht das Einführungsmaterial ist!
Es gibt ein Schnellstartvideo . Es beginnt mit einer Seite, die behauptet, dass ... nun, das sind keine wirklichen Behauptungen, das sind Aufzählungslisten, ein Artefakt, das häufig verwendet wird, um die kritische Beurteilung in Präsentationen auszusetzen (da die Logik nicht gezeigt wird, kann es nicht kritisiert werden!).
1.1 Vom Menschen lesbare Automatisierung - Spezifikationen sind technische Dokumente, wie könnte
name: upgrade all packages
yum:
name: '*'
state: latest
einfacher zu lesen als der entsprechende yum- Aufruf in einem Shell-Skript? Darüber hinaus stirbt jeder, der Kontakt zu AppleScript hatte, lachend, wenn er „lesbare Automatisierung“ liest.
1.2 Keine besonderen Codierungskenntnisse erforderlich - Was ist Codierung, wenn keine formalen Spezifikationen geschrieben werden? Sie haben Bedingungen, Variablen, also, wie codiert es nicht? Und warum brauche ich etwas, das ich nicht programmieren kann, das von nun an unflexibel ist? Die Aussage ist zum Glück ungenau!
1.3 Aufgaben, die in der richtigen Reihenfolge ausgeführt werden - Nun, vielleicht kennen einige Codegolf-Liebhaber Sprachen, die Aufgaben in einer falschen Reihenfolge ausführen, aber die Ausführung von Aufgaben in der richtigen Reihenfolge sieht kaum außergewöhnlich aus.
1.4 Schnell produktiv werden - Erfahrene Shell-Programmierer sind jetzt produktiv. Dieses Gegenargument ist genauso ernst wie das ursprüngliche Argument.
Ein beliebter Trick für Verkäufer, um Artefakte zu verkaufen, besteht darin, die Menschen zu täuschen, sie würden die "Macht" dieser Artefakte erlangen. Die Geschichte der Werbung für Autos oder isotonische Getränke sollte eine überzeugende Liste von Beispielen liefern.
Hier kann Ansible "App-Bereitstellung" durchführen - Shell-Skripte jedoch sicherlich, "Konfigurationsverwaltung", aber dies ist lediglich eine Aussage über den Zweck des Tools, keine Funktion, und "Workflow-Orchestrierung", die ein bisschen anspruchsvoll aussieht, aber kein Beispiel dafür enthält jenseits dessen, was GNU Parallel kann.
Um die Spalte zu füllen, haben sie auf drei verschiedene Arten geschrieben, dass dies nur ssh benötigt , was, wie jeder weiß, ein Daemon ist und nichts mit diesen Agenten zu tun hat, die das weltweite Konfigurationsmanagement durchdringen!
Der Rest des Videos enthält eine Einführung in die Bestandsliste, bei der es sich um eine statische Liste von Ressourcen (z. B. Servern) handelt, und zeigt, wie Apache auf drei Servern gleichzeitig bereitgestellt wird. Dies passt nicht zu meiner Arbeitsweise, bei der Ressourcen hochdynamisch sind und mithilfe der Befehlszeilentools, die von meinem Cloud-Anbieter bereitgestellt und von meinen Shell-Funktionen mithilfe des Pipe- |
Operators verwendet werden, aufgelistet werden können. Außerdem stelle ich Apache nicht gleichzeitig auf drei Servern bereit, sondern erstelle ein Master-Instanz-Image, mit dem ich dann drei Instanzen starte, die exakte Replikate einer der anderen sind. Der „orchestrierende“ Teil der Argumentation sieht also nicht sehr relevant aus.
EC2 ist der Computerdienst von Amazon. Die Interaktion mit diesem Dienst wird von einigen Ansible-Modulen unterstützt . (Andere beliebte Cloud-Computing-Anbieter sind ebenfalls verfügbar):
# demo_setup.yml
- hosts: localhost
connection: local
gather_facts: False
tasks:
- name: Provision a set of instances
ec2:
key_name: my_key
group: test
instance_type: t2.micro
image: "{{ ami_id }}"
wait: true
exact_count: 5
count_tag:
Name: Demo
instance_tags:
Name: Demo
register: ec2
Das entsprechende Shell-Skript wäre im Wesentlichen identisch mit YAML, ersetzt durch JSON:
provision_a_set_of_instances()
{
aws --output=text ec2 run-instances --image-id …
}
oder die JSON-Version
provision_a_set_of_instances()
{
aws --output=text ec2 run-instances --cli-input-json "$(provision_a_set_of_instances__json)"
}
provision_a_set_of_instances__json()
{
cat <<EOF
{
"ImageId": …
}
EOF
}
Beide Versionen sind im Wesentlichen identisch, der Hauptteil der Nutzlast besteht aus der Aufzählung der Initialisierungswerte in einer YAML- oder JSON-Struktur.
Der größte Teil dieses Handbuchs enthält keine wirklich interessanten Funktionen: Es werden Variablen eingeführt (IIRC, Shell-Skripte haben auch Variablen) und ein Ansible-Modul behandelt MySQL mit Privilegien auf XY “und enden mit so etwas wie
# Create Application DB User
mysql --host "${mysql_host}" --user "${mysql_user}" --password "${mysql_password}" "${mysql_table}" <<EOF
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
EOF
Sie suchen nach "Wie erstelle ich einen MySQL-Benutzer mit Rechten auf XY in Ansible " und am Ende mit
- name: Create Application DB User
mysql_user: name={{ dbuser }} password={{ upassword }}
priv=*.*:ALL host='%' state=present
Der Unterschied ist wahrscheinlich immer noch nicht sehr bedeutsam. Auf dieser Seite entdecken wir auch, dass Ansible eine Template-Meta-Programmiersprache hat
{% for host in groups['monitoring'] %}
-A INPUT -p tcp -s {{ hostvars[host].ansible_default_ipv4.address }} --dport 5666 -j ACCEPT
{% endfor %}
Wenn ich das sehe, bin ich wirklich in meiner Komfortzone. Diese Art der einfachen Metaprogrammierung für deklarative Sprachen ist genau das gleiche theoretische Paradigma wie BSD-Makefiles! Was ich zufällig ausgiebig programmiert habe Dieser Auszug zeigt uns, dass das Versprechen, mit YAML-Dateien zu arbeiten, gebrochen ist (daher kann ich meine Playbooks nicht über einen YAML-Parser ausführen, z . B. ). Es zeigt uns auch, dass Ansible die subtile Kunst der Bewertungsreihenfolge diskutieren muss: Wir müssen entscheiden, ob Variablen im „deklarativen Teil“ der Sprache oder im „imperativen“ Metateil der Sprache erweitert werden. Hier ist die Shell-Programmierung einfacher, es gibt keine Metaprogrammierung, abgesehen von explizitem eval
oder externem Script-Sourcing. Der hypothetische äquivalente Shell-Auszug wäre
enumerate_group 'monitoring' | {
while read host; do
…
done
}
deren Komplexität im Vergleich zur Ansible-Variante wahrscheinlich erträglich ist: Es werden nur die einfachen, regelmäßigen, langweiligen Konstrukte aus der Sprache verwendet.
Zuletzt treffen wir auf das, was sich als das erste wirklich interessante Merkmal von Ansible herausstellt : „Ansible-Ressourcen sind Modelle des gewünschten Zustands. Aus diesem Grund sollte es nicht erforderlich sein, zu testen, ob Dienste gestartet, Pakete installiert oder dergleichen sind. Ansible ist das System, das sicherstellt, dass diese Dinge deklarativ wahr sind. Behaupten Sie diese Dinge stattdessen in Ihren Spielbüchern. “Jetzt wird es ein bisschen interessant, aber:
Abgesehen von einigen Standardsituationen, die von verfügbaren Modulen leicht implementiert werden können, muss ich die Bits, die den Test implementieren, selbst eingeben, was sehr wahrscheinlich einige Shell-Befehle beinhalten wird.
Die Überprüfung der Konformität von Installationen ist in dem Kontext, in dem das unveränderliche Servermuster implementiert ist, möglicherweise nicht sehr relevant: In der Regel werden alle ausgeführten Systeme von einem Master-Image (z. B. Instanz-Image oder Docker-Image) erstellt und nie aktualisiert. Sie werden durch ersetzt stattdessen neu.
Das Einführungsmaterial von Ansible ignoriert die Frage der Wartbarkeit. Shell-Scripting ist so wartungsfreundlich wie JavaScript, Lisp oder Python. Umfangreiche Umgestaltungen können nur mit Hilfe einer umfangreichen automatisierten Testsuite erfolgreich durchgeführt werden - oder zumindest mit Designs, die ein einfaches interaktives Testen ermöglichen. Dass die genannten, während die Shell - Skripten sind Verkehrssprache von Systemkonfiguration und Wartung, fast jeder Programmiersprache eine Schnittstelle zu der Schale hat. Es ist daher durchaus machbar, den Vorteil der Wartbarkeit erweiterter Sprachen zu nutzen, indem sie zum Zusammenkleben der verschiedenen Bits der Shell-Konfigurationsbits verwendet werden. Für OCaml habe ich Rashell geschrieben Dies bietet im Wesentlichen eine Reihe von gängigen Interaktionsmustern für Unterprozesse, was die Übersetzung von Konfigurationsskripten in OCaml im Wesentlichen trivial macht.
Abgesehen von Ansible machen die sehr schwache Struktur der Playbooks und das Vorhandensein eines Meta-Programmierfeatures die Situation im Wesentlichen so schlecht wie für Shell-Skripte, mit den Minuspunkten, dass es nicht offensichtlich ist, wie Unit-Tests für Ansible geschrieben werden sollen und das Argument der Einführung einer Ad-hoc-Sprache auf höherer Ebene kann nicht nachgeahmt werden.
Die Dokumentation von Ansible macht darauf aufmerksam, dass idempotente Konfigurationsschritte geschrieben werden müssen. Genauer gesagt, geschrieben werden Konfigurationsschritte so sollte , dass die Schrittfolge aba kann vereinfacht werden , ab , dh wir zu wiederholen Konfigurationsschritt nicht brauchen. Dies ist eine stärkere Bedingung als die Idempotenz. Da Ansible es Playbooks ermöglicht, beliebige Shell-Befehle zu verwenden, kann Ansible selbst nicht garantieren, dass diese stärkere Bedingung eingehalten wird. Dies hängt nur von der Disziplin des Programmierers ab.
Wenn Sie es so ausdrücken, müssen die Vorteile der Verwendung vertrauter Tools (in diesem Fall Shell-Scripting) überwiegen, auch wenn Ansible einige inhärente Vorteile aufweist. Ich glaube nicht, dass es eine eindeutige Antwort darauf gibt.
Wenn das Team die Dinge, die Ansible bietet, mit Shell erreichen kann:
dann könnten sie sich wahrscheinlich an das halten, was sie wissen.
Schließlich können Sie "Wachen" in BASH implementieren. Dort finden Sie eine Vielzahl vorhandener BASH-Aufgaben zur Lösung einer Vielzahl von Serverkonfigurationsaufgaben (im Grunde genommen handelt es sich bei jeder Docker-Datei um 90% Bash-Installationscode). Sie können dem, was Ansible / Salt / Chef-Zero Ihnen bietet, ziemlich nahe kommen, ohne Ihre gesamte vorhandene Lösung auf diese Tools portieren zu müssen.
Es ist ein Balanceakt zwischen NIH-Tendenzen (hier nicht erfunden) und der Herausgabe bewährter Skripte zugunsten einer stabileren Lösung.
Eine letzte Überlegung, die Sie berücksichtigen sollten: Wie sieht es mit Ihrem Technologiestapel aus, wenn Sie versuchen, mehr Mitarbeiter für das Team zu gewinnen? Das Auffinden von Personen mit Ansible-Erfahrung ist viel einfacher als das Auffinden von Personen mit Erfahrung in Ihrem speziellen selbst entwickelten CM-Tool für Skripterstellung. Dies ist keine rein technische, sondern eher eine kulturelle Überlegung. Möchten Sie die seltsame Organisation sein, die ihren eigenen Ansible erfindet, oder möchten Sie die vernünftige Organisation sein, die das richtige Werkzeug für den Job findet? Diese Entscheidung wirkt sich auf Ihre Fähigkeit aus, Talente zu gewinnen.
Die obige Antwort deckt einen Teil davon ab, übersieht jedoch eines der wichtigen Elemente: konvergierendes Design. Ich habe vor einiger Zeit einige Worte darüber im Kontext von Chef unter https://coderanger.net/thinking/ geschrieben, aber die Kurzversion besagt, dass ein Bash-Skript eine Reihe von Anweisungen ist, während ein Ansible-Spielbuch (oder Kochrezept, Salt state, etc) ist eine Beschreibung des gewünschten Zustands. Indem Sie den gewünschten Status dokumentieren und nicht die Schritte, die Sie unternehmen möchten, um dorthin zu gelangen, können Sie mit viel mehr Startstatus fertig werden. Dies war das Herzstück der Promise-Theorie, wie es in CFEngine vor langer Zeit beschrieben wurde, und ein Design, das wir (die Konfigurationsverwaltungstools) seitdem alle kopiert haben.
Ansible-Code sagt, was Sie wollen, bash-Code sagt, wie man etwas macht.
Beachten Sie, dass Sie weniger Probleme haben werden, wenn Sie Ihre anonymen Wiedergabelisten auch auf Remote-Hosts ausführen. Da ist es der Hauptgrund für ansible Laufen. Wenn Sie Shell-Skripte verwenden, müssen Sie immer noch eine Möglichkeit haben, die Skripte für den Remote-Host zu erstellen.
Wir schreiben das Jahr 2019 und ich habe gerade ein paar Tage mit einer Lernkurve verbracht, und hier ist die absolute Wahrheit: Ansible ist die Mühe nicht wert.
Es ist noch nicht fertig, läuft nicht unter Windows und die Kombination aus YAML-Konfiguration und irreführenden Fehlermeldungen lässt Ihre Augen bluten. Es scheint fast absichtlich schrecklich und das meine ich ernst. Es ist eindeutig das Produkt eines frustrierten Projekts auf Entwicklerseite. Wahrscheinlich ein Hipster.
Wenn Sie über die Bereitstellung hinaus keine seiner Funktionen benötigen und immer nur auf einem bestimmten Betriebssystem bereitstellen. Aus Mitleid schreiben Sie ein anständiges shell.script.
Ab sofort erinnert mich das ganze Projekt an frühe Linux-Foren, in denen RTFM keine Ahnung hatte, warum jemand keine GUI zum Konfigurieren der Grafikeinstellungen schreiben konnte. Sie verstehen es einfach nicht, oder? Du solltest bei den Fenstern bleiben ... vielleicht werde ich mich paaren ... glücklich VI-ing.
Verwenden Sie Docker. Vor allem. Docker ist unglaublich einfach und leistungsstark.
Aber was ist, wenn Sie unbedingt auf vorhandene Dose zurückgreifen müssen? Was sind die wirklichen Alternativen?
Nun ... es gibt noch keine. Aber ich werde dir das versprechen, wenn es nicht besser wird, wird es bald soweit sein. Denn egal wie stark die Fanboys drängen und verzeihen, dass es versagt ... es ist eine 5 von 10 für Mühe.
Erstellen Sie ein Bash-Skript, und sparen Sie sich die Mühe.