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_software_packages_on_different_linuxes" auf Github.