Ansible sich wiederholende Rollen

7

Ich verwende Ansible, um einige Web- und Datenbankserver zu verwalten, auf denen Websites für mehrere vhosts ausgeführt werden. Für jede Website muss ich der dbservers-Gruppe eine Datenbankrolle und der webservers-Gruppe eine Website-Rolle zuweisen. Mein Spielbuch sieht also ungefähr so ​​aus:

- hosts: dbservers
  roles: 
      - { role: database, vhost: 'host1.com', db: 'customdb' }
      - { role: database, vhost: 'other.com' }

- hosts: webservers
  roles: 
      - { role: website, vhost: 'host1.com', db: 'customdb' }
      - { role: website, vhost: 'other.com' }

Das funktioniert gut, ist aber hässlich, da ich alles zweimal wiederholen muss. Dies ist besonders fehleranfällig, wenn einige Parameter von den Standardwerten geändert werden (wie z. B. db auf vhost host1.com in diesem Beispiel).

Gibt es eine Möglichkeit, dies zu schreiben, damit ich eine einzelne Liste von vhosts mit allen erforderlichen Parametern haben und die verschiedenen Rollen für jeden vhost-Eintrag automatisch zu den verschiedenen Hostgruppen hinzufügen kann?

Sven
quelle
Könnten Sie with_itemsvielleicht verwenden?
Ceejayoz
Ich könnte mich irren, aber wenn ich es richtig verstehe, ist with_items für Rollen nicht verfügbar.
Sven

Antworten:

8

Die naheliegendste Antwort: Verwenden Sie komplexe Variablen (Wörterbücher), um Ihre Werte zu speichern, und übergeben Sie dann die gesamte Variable:

- layouts:
  - layout1:
      vhost: host1.com
      db: customdb
  - layout2:
      vhost: other.com

Verwenden Sie diese dann, um auf Rollen überzugehen:

- hosts: dbservers
  roles:
  - { role: database, layout: layouts.layout1 }
  - { role: database, layout: layouts.layout2 }

- hosts: webservers
  roles:
  - { role: webserver, layout: layouts.layout1 }
  - { role: webserver, layout: layouts.layout2 }

Ich habe das in der Vergangenheit erfolgreich gemacht. Zum Auffüllen von Layouts können Sie verschiedene Techniken verwenden: Kombinieren von "group_vars / all" mit "vars_files" mit "host_vars" usw.

Droopy4096
quelle
Dies hilft sicherzustellen, dass ich den Webservern und den Datenbankservern nicht versehentlich unterschiedliche Parameter gebe. Aber es gibt immer noch viele Wiederholungen. Gibt es eine Möglichkeit, das loszuwerden?
Sven
5

Ich erstelle Rollen apache, die Apache installieren und einige Konfigurationen für alle vhosts durchführen apache-vhost, die einen vhost installieren host1-com, und other-com. Dann wäre das Spielbuch so:

- hosts: host1-com-servers
  roles:
    - apache
    - host1-com

- hosts: other-com-servers
  roles:
    - apache
    - other-com

Nun host1-comwird dies haben:

- meta:
  - dependencies:
    - role: apache-vhost
      server_name: host1.com
      server_aliases:
        - www.host1.com
      extras: |
        Alias /static /var/local/myapp/static
        <Location /static>
          Require all granted
        </Location>
        # Whatever else you want
      whatever_other_variables_apache-vhost_needs: XXX

(Dies ist ein Implementierungsdetail, aber die apache-vhostRolle bereitet einige wichtige vhost-Konfigurationen basierend auf den an sie übergebenen Variablen vor und fügt die extrasVariable auch so hinzu , wie sie sich in der vhost-Konfiguration befindet.)

Ebenso können Sie für die Datenbanken eine postgresqlRolle, eine postgresql-databaseRolle usw. haben.

Antonis Christofides
quelle
4

Anstatt Ihre Hosts nach Funktionen zu gruppieren, können Sie sie nach Rollen gruppieren und Ansible nur dann eine bestimmte Rolle auf einem Host ausführen lassen, wenn dieser Host in der für diese Rolle festgelegten Gruppe gefunden wird.

[role_db_customdb]
other.com

[role_db_otherdb]
host1.com

[role_website]
host1.com
other.com

Sie können sogar Parameter an eine Rolle übergeben, wie anhand des dbParameters im folgenden Playbook dargestellt.

---
- hosts: all

  roles:
    - { role: database, db: 'customdb', when: inventory_hostname in groups.role_db_customdb }
    - { role: database, db: 'otherdb', when: inventory_hostname in groups.role_db_otherdb }
    - { role: website, when: inventory_hostname in groups.role_webservers }
Brian Showalter
quelle
Ich sehe, wo dies sinnvoll wäre, aber das hilft bei meinem Problem nicht. Jede Website (vhost) muss auf jedem Webserver und eine Datenbank auf jedem Datenbankserver konfiguriert werden. "Host1.com" ist also auf web1, web2 und web3 konfiguriert und erhält eine Datenbank mit dem Namen "customdb" auf den Datenbankservern db1 und db2.
Sven