
Beispielsweise habe ich über "ansible-galaxy init" zwei Rollen erstellt: deploy_back und deploy_front
Außerdem habe ich eine playbook.yml-Datei geschrieben.
- name: Create cluster
become: yes
hosts: all
roles:
- deploy_front
- deploy_back
Wenn ich es über „ansible-playbook playbook.yml“ starte, werden auf beiden Servern zwei Rollen bereitgestellt. Wie kann ich in einem Playbook unterschiedliche Rollen auf unterschiedlichen Servern bereitstellen?
Wenn ich playbook.yml schreibe
- name: Create cluster
become: yes
hosts: front
roles:
- deploy_front
hosts: db
roles:
- deploy_db
dann sieht die Ausgabe wie folgt aus:...einen doppelten Diktierschlüssel (Hosts) gefunden... einen doppelten Diktierschlüssel (Rollen) gefunden.... Nur den zuletzt definierten Wert verwenden."
Antwort1
Sie müssen Ihre hosts:
und andere Deklarationen in verschiedene Spiele aufteilen. Der Code sollte ungefähr so aussehen:
- name: Create front cluster
become: yes
hosts: front
roles:
- deploy_front
- name: Create db cluster
become: yes
remote_user: different-db-user
hosts: db
roles:
- deploy_db
Antwort2
Der Grund, warum Sie die Meldung „Schlüssel doppelt vorhanden“ erhalten, liegt an der Struktur des YAML.
Ein Playbook ist eine Sammlung von Plays in Form einer geordneten Liste. Jedes Play wird durch eine Reihe von Schlüsselwort/Wert-Paaren spezifiziert.spielenSchlüsselwörter sind: name
, hosts
, become
, und roles
, um nur einige zu nennen.
Um in YAML verschiedene Elemente in einer Liste anzugeben, verwenden Sie das Bindestrichzeichen ( -
). In beiden Ihrer Beispiel- playbook.xml
Playbooks haben Sie nur ein Bindestrichzeichen ganz links. Das bedeutet, dass Sie nur eine Liste mit einem Element für ein Playbook oder ein Playbook mit einem Spiel haben.
hosts
Wenn Sie in Ihrem zweiten Beispiel vor Ihrer zweiten Deklaration ein Bindestrichzeichen hinzufügen playbook.yml
, erhalten Sie ein gültiges Playbook, das nun zwei Plays enthält:
- name: Create cluster
become: yes
hosts: front
roles:
- deploy_front
- hosts: db
roles:
- deploy_db
In Ihrem ursprünglichen zweiten Beispiel ist nur ein einziges Spiel definiert. Darüber hinaus sind sowohl das hosts
als auch das roles
Schlüsselwort in diesem einen Spiel zweimal definiert. YAML beschwert sich, dass Sie zwei unterschiedliche Definitionen für das hosts
und roles
das Schlüsselwort haben.