Ich wollte abseits von Puppet und Ansible mal eine andere Automatisierungssprache anreißen. Wieso also nicht mal Chef!
Wie fängt man am einfachsten mit Chef als Automatisierungssprache an?
Chef besteht simpel gesagt aus ruby Skripten welche sequentiell abgearbeitet werden. (Loops gehen schon, würden aber den Blog Artikel sprengen)
Wir fangen mit einem Ruby file an welches wir Notice.rb nennen.
Als praxisnahes Beispiel legen wir eine “Textdatei” in /etc/ an. Dies könnte somit eine prekonfigurierte Konfigdatei eines Programmes sein.
file '/etc/motd' do content 'Next maintenance window is Fri from 10 pm to Sat 3 am' end
Woraus besteht Recipe Codeblock ?
File als erstes gibt den Ressourcen Typ an. dieser kann auch Package sein oder Service sein.
Es gibt noch viele mehr auf der Chef Seite in der dortigen Doku können Sie erforscht werden 🙂
Danach folgt der Pfad inklusive des Dateinamens hier in diesem Fall ‘/etc/motd’ es könnte aber auch z.B. ‘/home/User_xy/.bashrc’ sein.
Gefolgt von dem Loopblock welcher mit do eingeleitet wird und mit end geschlossen.
Dazwischen sind die Anweisungen was abgearbeitet werden soll bzw. welche Attribute geändert oder modifiziert werden sollen.
Da wir in diesen Fall die Datei erstellen haben wir ein content Attribut welches den Inhalt der Datei definiert.
Darin eine simple Benachrichtigung plain Text.
Wie erreichen wir nun mit diesem Ruby file unseren gewünschten Zustand ?
Ähnlich wie bei Ansible oder Puppet benötigen wir einen Agent-Daemon der für uns die Anweisungen umsetzt. Dieser ist chef-apply welches als Kommando duch das Chef DK (Development Kit installiert wird)
Dies findet man unter: https://downloads.chef.io/chefdk/
Da ich doch leider sehr CentOS affin bin nehme ich mir das RHEL Package.
https://packages.chef.io/files/stable/chefdk/3.3.23/el/7/chefdk-3.3.23-1.el7.x86_64.rpm
mit einem simplen & fixen
rpm -ivh chefdk-3.3.23-1.el7.x86_64.rpm
wird das Paket installiert und bietet uns nun die Chef Kommandos an.
Ordentliche Mensche erstellen einen Ordner in dem wir unsere Ruby Recipes unterbringen.
Chef bietet aber auch ein Standard Template an welches wir nutzen können aber zu erst erstellen wir uns einen Ordner.
mkdir ~/cookbooks && cd cookbooks chef generate cookbook motd_notify_downtime
Nun kreiert uns Chef ein Standard cookbook ohne spezifischen Inhalt.
Hier die Baumstruktur eines solchen Ordners.
tree ~/cookbooks/motd_notify_downtime/ motd_notify_downtime/ ├── Berksfile ├── CHANGELOG.md ├── chefignore ├── LICENSE ├── metadata.rb ├── README.md ├── recipes │ └── default.rb ├── spec │ ├── spec_helper.rb │ └── unit │ └── recipes │ └── default_spec.rb └── test └── integration └── default └── default_test.rb
In den unter Ordner namens recipes sollen wir unsere notice.rb bewegen.
mv notice.rb ~/cookbooks/motd_notify_downtime/recipes rm default.rb mv notice.rb default.rb
Ob unser Automatismus auch funktioniert prüfen wir mit einem Aufruf.
Wir haben folgende möglichkeiten:
chef-apply notice.rb
für das einzelne Rezept oder für das ganze cookbook welches wir gerade erstellt haben
cd cookbooks && chef-client --local-mode --runlist 'recipe[motd_notify_downtime]'
Dies sollte von dem folgenden Output begleitet werden
chef-client --local-mode --runlist 'recipe[motd_notify_downtime]' [2018-10-25T16:14:05+00:00] WARN: No config file found or specified on command line, using command line options. Starting Chef Client, version 14.5.33 resolving cookbooks for run list: ["motd_notify_downtime"] Synchronizing Cookbooks: - motd_notify_downtime (0.1.0) Installing Cookbook Gems: Compiling Cookbooks... Converging 1 resources Recipe: motd_notify_downtime::default * file[/etc/motd] action create - create new file /etc/motd - update content in file /etc/motd from none to b564d0 --- /etc/motd 2018-10-25 16:14:08.249701189 +0000 +++ /etc/.chef-motd20181025-9251-18htv9n 2018-10-25 16:14:08.249701189 +0000 @@ -1 +1,2 @@ +To All Users who Login into this Machine next maintenance window is Friday from 10 pm to Saturday 3 am - restore selinux security context Running handlers: Running handlers complete Chef Client finished, 1/1 resources updated in 02 seconds
Mit einem
cat /etc/motd
erhalten wir das folgende Ergebnis
Next maintenance window is Fri from 10 pm to Sat 3 am
Auch ein weiterer Lauf des Chef-clients würde nichts an dem Inhalte ändern. (Idempotent)
chef-client --local-mode --runlist 'recipe[motd_notify_downtime]' [2018-10-25T16:18:28+00:00] WARN: No config file found or specified on command line, using command line options. Starting Chef Client, version 14.5.33 resolving cookbooks for run list: ["motd_notify_downtime"] Synchronizing Cookbooks: - motd_notify_downtime (0.1.0) Installing Cookbook Gems: Compiling Cookbooks... Converging 1 resources Recipe: motd_notify_downtime::default * file[/etc/motd] action create (up to date) Running handlers: Running handlers complete Chef Client finished, 0/1 resources updated in 02 seconds
Ich hoffe ich hab euch am Beispiel Chef etwas über den Tellerrand hinaus schauen lassen und vielleicht hat der ein oder andere Lust bekommen etwas mit Chef zu automatisieren.
Servus !

Trackbacks/Pingbacks