Wer mit Konfigurations-Management-Software, wie Puppet, Chef oder Ansible in heterogenen Linux-Umgebungen arbeitet, kennt das Problem:
Will man eine bestimmte Software installieren, so unterscheiden sich oft die Paketnamen - und auch die Anzahl der Pakete.
Im Beispiel wollen wir den ftpclient "ncftp" installieren, der auf SLES aber nicht verfügbar ist, weswegen wir hier auf "lftp" ausweichen.
Dieser Artikel zeigt ein kleines Playbook für Ansible, mit denen sich die Paketauswahl distributions- und versionsspezifisch festlegen lässt. Voraussetzung ist lediglich die kostenfreie Version von Ansible.
Folgendes Listing zeigt das Playbook "install-ftpclient.yml"
---
- hosts: all
remote_user: root
tasks:
- name: Variablen einlesen
include_vars: '{{ item }}'
with_first_found:
- files:
# "ansible_distribution" kann sein: "Debian", "SLES", "Ubuntu", "CentOS"
# "ansible_distribution_version" kann sein: "9.0", "12.2", "16.04", "7.3.1611"
# "ansible_distribution_major_version" kann sein: "9", "12", 16.04"
# "ansible_os_family" kann sein: "Debian", "RedHat", "Suse"
# groß/klein-Schreibung ist wichtig
- "{{ ansible_distribution }}.{{ ansible_distribution_version }}.packagenames.yml"
# ergibt: "SLES.12.2", "Ubuntu.16.04", "CentOS.7.3.1611", "Debian.8.7"
- "{{ ansible_distribution }}.{{ ansible_distribution_major_version }}.packagenames.yml"
# ergibt: "SLES.12", "Ubuntu.16", "CentOS.7", "Debian.9"
- "{{ ansible_distribution }}.packagenames.yml"
# ergibt: "Debian", "SLES", "Ubuntu", "CentOS"
- "{{ ansible_os_family }}.packagenames.yml"
# ergibt: "Debian", "Suse, "RedHat"
- "default.packagenames.yml"
paths: "./vars/"
- name: install ftpclient
package: name={{ ftpclient_package_name }} state=installed
Im Ordner "./vars" legt man dann einfach Dateien nach Wahl an. Diese werden in der oben dargestellten Reihenfolge gesucht - der erste Treffer wird geladen.
Auf diese Art und Weise kann man beispielsweise für Distributionen, bei denen sogenannte Servicepacks teils gravierende Änderungen in der Paketauswahl mitbringen, je nach Servicepack verschiedene Dateien und damit Variablen benutzen. Ein Beispiel wäre hier: SLES12SP1 und SLES12SP2.
So sieht die Dateiablage aus:
./install-ftpclient.yml
./vars/SLES.12.packagenames.yml
./vars/Debian.packagenames.yml
./vars/SLES.12.2.packagenames.yml
./vars/default.packagenames.yml
./vars/SLES.packagenames.yml
./vars/CentOS.packagenames.yml
Inhalt der Debian.packagenames.yml:
ftpclient_package_name: ncftp
Inhalt der SLES.packagenames.yml:
ftpclient_package_name: lftp
Mehrere Pakete in einer Variable:
Benötigt man mehrere Pakete, so kann man diese einfach per Komma nacheinander angeben, ähnlich einem Array.
Es dürfen keine Leerstellen enthalten sein. Die Anzahl der Pakete darf dabei für jedes Betriebssystem verschieden sein.
vim_package_name: vim,vim-icinga2,vim-syntastic
Testlauf:
user1@ansiblemaster2:/opt/projects/ansible-install-ftpclient
728# ansible-playbook install-packages.yml
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [debian8testvm1.local]
ok: [debiantestvm1.local]
ok: [sles12sp2-1.local]
ok: [ubuntu1604testvm1.local]
ok: [centos7-1.local]
TASK [Variablen einlesen] ******************************************************
ok: [debiantestvm1.local] => (item=/opt/projects/ansible-install-ftpclient/./vars/Debian.packagenames.yml)
ok: [centos7-1.local] => (item=/opt/projects/ansible-install-ftpclient/./vars/CentOS.packagenames.yml)
ok: [sles12sp2-1.local] => (item=/opt/projects/ansible-install-ftpclient/./vars/SLES.12.2.packagenames.yml)
ok: [ubuntu1604testvm1.local] => (item=/opt/projects/ansible-install-ftpclient/./vars/Debian.packagenames.yml)
ok: [debian8testvm1.local] => (item=/opt/projects/ansible-install-ftpclient/./vars/Debian.packagenames.yml)
TASK [install ftpclient] *******************************************************
ok: [centos7-1.local]
ok: [debian8testvm1.local]
ok: [ubuntu1604testvm1.local]
changed: [debiantestvm1.local]
changed: [sles12sp2-1.local]
PLAY RECAP *********************************************************************
centos7-1.local : ok=3 changed=0 unreachable=0 failed=0
debian8testvm1.local : ok=3 changed=0 unreachable=0 failed=0
debiantestvm1.local : ok=3 changed=1 unreachable=0 failed=0
sles12sp2-1.local : ok=3 changed=1 unreachable=0 failed=0
ubuntu1604testvm1.local : ok=3 changed=0 unreachable=0 failed=0
Sie möchten das Playbook ausprobieren?
Clonen Sie sich einfach mein Beispiel-Repository "ansible_install...." auf Github.