Jak określić różnych hostów dla różnych podręczników w jednym skrypcie ansible

9

Jak rozumiem, każdy podręcznik zawiera jeden wpis hosta. Chcę wiedzieć, że jeśli utworzę kontener playbook zawierający inne playbooki, czy mogę sparametryzować hosty dla każdego z nich. Coś w stylu

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

Jestem w stanie umieścić wszystkie różne podręczniki w jednym skrypcie i wywołaniu, ale w ten sposób nie jestem w stanie ponownie użyć jakiegoś zestawu set_fact z jednego podręcznika do drugiego i stąd jest dużo powielania zadań.

Innym następstwem tego pytania jest to, czy mogę uruchomić ec2 na amazonie, który miałby

hosts: localhost

oraz konfiguracja uruchomionych ec2, które w zasadzie konfigurowałyby zasoby reklamowe -i ec2.pyi miały hosty określone jako

hosts: tag_<some_tag>

dzieje się przez ten sam podręcznik lub zestaw dołączonych podręczników (różne role)?

Pankaj Lal
źródło
czy wiesz, że możesz mieć więcej niż jedną hosts:sekcję w swoim yaml i, w gruncie rzeczy, mieć kilka podręczników korzystających z różnych grup gospodarzy w twoim ekwipunku?
Yonsy Solis

Odpowiedzi:

4

W rzeczywistości możesz mieć więcej niż jeden host: sekcja na podręcznik. Wygląda na to, że gospodarze: rozpoczynają nową grę. Zobacz na przykład http://www.tecmint.com/use-ansible-playbooks-to-automate-complex-tasks-on-multiple-linux-servers/ .

Coś takiego działa dla mnie (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'

Więc umieść hosty: na górze każdego dołączonego pliku .yml, a nie po włączeniu :.

Bill Welch
źródło
4

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

... Są inne miejsca, z których mogą pochodzić zmienne, ale są to typy zmiennych, które są wykrywane, a nie ustawiane przez użytkownika.

Fakty to informacje pochodzące z rozmowy ze zdalnymi systemami ...

Fakty pochodzą od zdalnych hostów. Jest to powód, dla którego normalnie możesz udostępniać fakty między różnymi hostami, gdy plik * .yml zawiera kilka podręczników .

Teraz możesz uzyskać dostęp do faktów z innych hostów, jeśli zrobisz coś takiego w innej części poradnika:

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

ale w tym przypadku musisz pamiętać, że musisz poznać fakty przed użyciem tego. Następnie możesz skonfigurować pierwszą część swojego podręcznika, która będzie zawierała wszystkie fakty dla wszystkich gospodarzy lub wykorzysta do tego buforowanie faktów (patrz: http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching )

Teraz, jeśli chcesz udostępnić opcje w swoich podręcznikach, może być lepiej przemyśleć informacje, aby wstawić zmienne, a dzięki temu możesz „udostępnić” swoje zmienne za pomocą tej samej includeinstrukcji, spójrz na to:

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

Yonsy Solis
źródło
2
Moje pytanie było bardzo specyficzne dla hostów, a nie zmiennych ogólnie. Potrzebuję stworzyć masterbooka, który nie ma hosta, ale każdy dołączony playbook albo zawiera hosta, albo może być do niego dostarczony jako parametr. Zawsze mogę uruchomić je jako osobne podręczniki, ale wtedy fakty uzyskane w jednym z nich nie przenoszą się do następnego, a więc jest dużo redundancji
Pankaj Lal
przeczytaj ponownie ponownie: „Teraz możesz uzyskać dostęp do faktów z innych hostów, jeśli zrobisz coś takiego w innej części poradnika: ... ale w tym przypadku musisz pamiętać, że musisz poznać fakty przed użyciem to ”, więc tak, możesz dzielić się swoimi faktami między zawartymi w głównym podręczniku.
Yonsy Solis,