So geben Sie verschiedene Hosts für verschiedene Playbooks in einem ansible Skript an

9

Soweit ich weiß, benötigt jedes Playbook einen Host-Eintrag. Ich möchte wissen, dass ich beim Erstellen eines Container-Playbooks, das andere Playbooks enthält, die Hosts für jedes Playbook-Include parametrisieren kann. Also so etwas wie

---
- include playbook_1.yml
    hosts: tag_postgres
- include: playbook_2.yml
    hosts: tag_rabbitmq

Ich kann alle verschiedenen Playbooks in ein Skript einfügen und aufrufen, aber auf diese Weise kann ich set_fact nicht von einem Playbook in ein anderes wiederverwenden, und daher gibt es viele Aufgabenüberschneidungen.

Eine weitere Folge der Frage ist, kann ich ec2s auf Amazon starten, was hätte

hosts: localhost

und Konfiguration der gestarteten ec2s, die im Grunde genommen das Inventar von konfigurieren -i ec2.pyund deren Hosts als angegeben sind

hosts: tag_<some_tag>

passiert durch dasselbe Spielbuch oder eine Reihe von enthaltenen Spielbüchern (verschiedene Rollen)?

Pankaj Lal
quelle
Wissen Sie, dass Sie mehr als einen hosts:Abschnitt in Ihrem Yaml haben können und im Wesentlichen mehrere Playbooks mit unterschiedlichen Hostgruppen in Ihrem Inventar haben?
Yonsy Solis

Antworten:

4

Tatsächlich können Sie mehr als einen Host haben: Abschnitt pro Spielbuch. Es scheint, dass ein Host: ein neues Spiel startet. Siehe zum Beispiel http://www.tecmint.com/use-ansible-playbooks-to-automate-complex-tasks-on-multiple-linux-servers/ .

So etwas funktioniert bei mir (ansible 2.2):

---
- hosts: localhost 
  connection: local
  roles:
    - { role: ec2,
        tag: 'master',
        instance_type: t2.2xlarge,
        count: 1
      }
  tasks:
  - shell: hostname # reports localhost

- hosts: tag_master
  tasks:
  - shell: hostname # reports instance(s) with tag 'master'

Setzen Sie also Hosts: an die Spitze jeder enthaltenen .yml, nicht nach dem Include:.

Bill Welch
quelle
4

http://docs.ansible.com/ansible/playbooks_variables.html#information-discovered-from-systems-facts

... Es gibt andere Orte, von denen Variablen stammen können, aber dies sind Variablentypen, die erkannt und nicht vom Benutzer festgelegt werden.

Fakten sind Informationen, die aus dem Sprechen mit Ihren Remote-Systemen stammen ...

Die Fakten werden von Ihren Remote-Hosts abgeleitet. Dies ist der Grund, warum Sie normalerweise Fakten zwischen Ihren verschiedenen Hosts austauschen können, wenn Ihre * .yml- Datei mehrere Playbooks enthält .

Jetzt können Sie auf Fakten von anderen Hosts zugreifen, wenn Sie in einem anderen Teil Ihres Spielbuchs so etwas tun:

{{ hostvars['server01.example.com']['ansible_eth0']['ipv4']['address'] }}
...
...
{{ hostvars[groups['servers'][0]]['ansible_eth0']['ipv4']['address'] }}

In diesem Fall müssen Sie sich jedoch daran erinnern, dass Sie die Fakten abrufen müssen, bevor Sie diese verwenden. Anschließend können Sie einen ersten Teil in Ihrem Playbook einrichten, der alle Fakten für alle Hosts abruft, oder das Fact Caching verwenden (siehe: http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching ).

Wenn Sie nun Optionen in Ihren Playbooks freigeben möchten, ist es möglicherweise besser, die Informationen zum Einfügen von Variablen zu überdenken. Auf diese Weise können Sie Ihre Variablen mit derselben includeAnweisung "freigeben". Sehen Sie sich Folgendes an:

http://docs.ansible.com/ansible/playbooks_variables.html#variables-defined-from-included-files-and-roles

Yonsy Solis
quelle
2
Meine Frage war sehr spezifisch für Hosts und nicht für Variablen im Allgemeinen. Ich muss in der Lage sein, ein Master-Playbook zu erstellen, das keinen Host enthält, aber jedes enthaltene Playbook enthält entweder einen Host oder kann als Parameter angegeben werden. Ich kann sie immer als separate Spielbücher ausführen, aber dann werden die in einem erhaltenen Fakten nicht auf das nächste übertragen, und daher gibt es viel Redundanz
Pankaj Lal,
Lesen Sie oben bitte noch einmal: "Jetzt können Sie auf Fakten von anderen Hosts zugreifen, wenn Sie so etwas in einem anderen Teil Ihres Spielbuchs tun: ... aber in diesem Fall müssen Sie sich daran erinnern, dass Sie die Fakten vor der Verwendung abrufen müssen Dies "Also, ja, Sie können Ihre Fakten zwischen den in Ihrem Master-Playbook enthaltenen Playbooks teilen.
Yonsy Solis