Inventar aufbauen

Ansible arbeitet mit mehreren verwalteten Knoten oder „Hosts“ in Ihrer Infrastruktur gleichzeitig und verwendet eine Liste oder Gruppe von Listen, die als Inventar bekannt sind.
Sobald das Inventar definiert ist, verwendet man Pattern, um die Hosts oder Gruppen auszuwählen, für die Ansible ausgeführt werden soll. Der Standardspeicherort für das Inventar ist eine Datei namens

/etc/ansible/hosts

Sie können in der Befehlszeile mit der Option

-i <path>

eine andere Inventardatei angeben. Man kann auch mehrere Inventardateien gleichzeitig verwenden und / oder Inventar aus dynamischen oder Cloud-Quellen oder unterschiedlichen Formaten (YAML, ini usw.) abrufen. Ansible wurde in Version 2.4 eingeführt und verfügt über Inventar-Plugins , um dies flexibel und anpassbar zu machen.

Die Inventardatei kann in einem von vielen Formaten vorliegen, abhängig von den Inventar-Plugins, die man hat. Die gängigsten Formate sind INI und YAML. Eine einfache INI

/etc/ansible/hosts

könnte so aussehen:

mail.example.com

[webservers]
wilma.example.com
fred.example.com

[dbservers]
diamond.example.com
emerald.example.com
ruby.example.com

Die Überschriften in Klammern sind Gruppennamen, die verwendet werden, um Hosts zu klassifizieren und zu entscheiden, welche Hosts man zu welchen Zeiten und zu welchem ​​Zweck steuert. Gruppennamen sollten denselben Richtlinien folgen wie beim Erstellen gültiger Variablennamen.

Hier ist dieselbe grundlegende Inventardatei im YAML-Format:

all:
  hosts:
    mail.example.com:
  children:
    webservers:
      hosts:
        wilma.example.com:
        fred.example.com:
    dbservers:
      hosts:
        diamond.example.com:
        emerald.example.com:
        ruby.example.com:


Default groups

Es gibt zwei Standardgruppen: all und nicht ungrouped . Die Gruppe all enthält jeden Host. Die nicht ungrouped Gruppe enthält alle Hosts, die außer all keine weitere Gruppe haben . Jeder Host gehört immer zu mindestens 2 Gruppen ( all und nicht ungrouped oder all e und eine andere Gruppe). Obwohl all e und nicht ungrouped immer vorhanden sind, können sie implizit sein und nicht in Gruppenlisten wie group_names erscheinen.

Hosts in mehreren Gruppen

Man kann jeden Host in mehr als eine Gruppe aufnehmen. Zum Beispiel könnte ein Produktions-Webserver in einem Rechenzentrum in Frankfurt in Gruppen mit den Namen [prod] und [frankfurt] und [webservers] enthalten sein. Man kann Gruppen erstellen,die verfolgen:

  • Was -Eine Anwendung,ein Stack oder ein Microservice (z.B.Datenbankserver,Webserver usw.).
  • Wo -Ein Rechenzentrum oder eine Region,um mit dem lokalen DNS,Speicher usw.zu kommunizieren (z.B.Ost,West).
  • Wann -In der Entwicklungsphase,um Tests auf Produktionsressourcen zu vermeiden (z.B.prod,test).

Die Erweiterung des bisherigen YAML-Inventars um die Angaben Was,Wann und Wo würde so aussehen:

 

all:
  hosts:
    mail.example.com:
  children:
    webservers:
      hosts:
        foo.example.com:
        bar.example.com:
    dbservers:
      hosts:
        one.example.com:
        two.example.com:
        three.example.com:
    east:
      hosts:
        foo.example.com:
        one.example.com:
        two.example.com:
    west:
      hosts:
        bar.example.com:
        three.example.com:
    prod:
      hosts:
        foo.example.com:
        one.example.com:
        two.example.com:
    test:
      hosts:
        bar.example.com:
        three.example.com:

Man kann sehen, dass one.example.com in den Gruppen dbservers , east und prod vorhanden ist.
Man kann auch verschachtelte Gruppen verwenden, um prod und test in diesem Inventar zu vereinfachen , um dasselbe Ergebnis zu erzielen:

all:
  hosts:
    mail.example.com:
  children:
    webservers:
      hosts:
        foo.example.com:
        bar.example.com:
    dbservers:
      hosts:
        one.example.com:
        two.example.com:
        three.example.com:
    east:
      hosts:
        foo.example.com:
        one.example.com:
        two.example.com:
    west:
      hosts:
        bar.example.com:
        three.example.com:
    prod:
      children:
        east:
    test:
      children:
        west:

Hinzufügen Host Bereichen

Wenn man viele Hosts mit einem ähnlichen Muster hat, kann man sie als einen Bereich hinzufügen:

INI:
[webservers]
www[01:50].example.com
YAML:
...
  webservers:
    hosts:
      www[01:50].example.com:

Man kann bei der Definition eines numerischen Bereichs von Hosts eine Schrittweite (Inkremente zwischen Sequenznummern)angeben:

INI:
[webservers]
www[01:50:2].example.com
YAML:
...
  webservers:
    hosts:
      www[01:50:2].example.com:

Bei numerischen Mustern können führende Nullen je nach Wunsch hinzugefügt oder entfernt werden.Bereiche sind inklusive.Sie können auch alphabetische Bereiche definieren:

[databases]
db-[a:f].example.com

 

Hinzufügen von Variablen zum Inventar

Man kann Variablenwerte speichern, die sich auf einen bestimmten Host oder eine bestimmte Gruppe im Inventar beziehen. Zunächst kann man Variablen direkt zu den Hosts und Gruppen in Ihrer Hauptinventardatei hinzufügen. Wenn man dem Ansible-Inventar jedoch immer mehr verwaltete Knoten hinzufügen, möchten Sie wahrscheinlich Variablen in separaten Host- und Gruppenvariablendateien speichern.

Zuweisung einer Variablen an eine Maschine:Host-Variablen

Sie können eine Variable ganz einfach einem einzelnen Host zuweisen und sie dann später in Playbooks verwenden.

INI:
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
YAML:
atlanta:
  hosts:
    host1:
      http_port: 80
      maxRequestsPerChild: 808
    host2:
      http_port: 303
      maxRequestsPerChild: 909
Einzigartige Werte wie nicht standardisierte SSH-Ports eignen sich gut als Host-Variablen. Diese können zum Ansible-Inventar hinzufügt werden, indem  die Portnummer nach dem Hostnamen mit einem Doppelpunkt hinzufügt wird:
badwolf.example.com:5309

Verbindungsvariablen funktionieren auch gut als Host-Variablen:

[targets]

localhost              ansible_connection=local
other1.example.com     ansible_connection=ssh        ansible_user=myuser
other2.example.com     ansible_connection=ssh        ansible_user=myotheruser

Inventory aliases

Sie können auch Aliasnamen in Ihrem Inventar definieren:

INI:
jumper ansible_port=5555 ansible_host=192.0.2.50

YAML:
...
  hosts:
    jumper:
      ansible_port: 5555
      ansible_host: 192.0.2.50