2016-03-03 15 views
5

Utknąłem. Wylogowałem się z internetu i nie mogłem znaleźć odpowiedzi.Jak rozróżnić etapy/produkcję z dynamiczną inwentaryzacją?

Używam Ansible od lat, ale zawsze ze statycznymi zapasami. Aby odróżnić różne środowiska, takie jak inscenizacja i produkcja, użyłem różnych plików statycznych, odpowiednio: staging i production. Kiedy potrzebne do serwerów przepis postoju, zrobiłbym:

ansible-playbook site.yml -i staging 

gdy chciałem zrobić to samo dla produkcji, zrobiłbym:

ansible-playbook site.yml -i production 

Zarówno inscenizacja i produkcja potrzebne zmienne z różnymi wartości, więc mam group_vars/staging i . Wszystko dobrze i zgodnie z najlepszymi praktykami.

Teraz muszę udostępnić instancje EC2 w AWS. Używam this AWS guide. Mam książeczkę z dwoma sztukami. Pierwszy jest uruchamiany przeciwko localhost, tworzy/wyszukuje wymagane instancje EC2 w AWS i zapełnia grupę za pomocą add_host. Druga gra używa tej grupy do działania przeciwko instancjom EC2 odkrytym podczas pierwszej gry. Wszystko zgodnie z tym przewodnikiem.

Wszystko działa świetnie, z wyjątkiem jednej rzeczy. Nie mam pojęcia, jak określić, które środowisko należy dostarczyć, a zatem wymagane zmienne nie są ładowane od group_vars/(staging|production). Zasadniczo to, czego chcę, to coś podobnego do -i (staging|production) Użyłem tych wszystkich lat z statycznymi zapasami, ale wydaje się, że używanie -i nie ma sensu, ponieważ inwentarz jest dynamiczny. Chcę sposobu, aby móc załadować zmienne z group_vars/staging lub group_vars/production na podstawie argumentu I przekazać do ansible-playbook, gdy go uruchomię.

Jak to zrobić? Jaka jest najlepsza praktyka?

+0

Być może mógłbyś zrobić coś z oddzielnymi książkami? Coś jak production.yml i staging.yml. Te skrypty będą zawierać plik site.yml, ale będą również zawierały własne vars. –

Odpowiedz

3

Podczas gdy nie jestem pewien, jak to zrobić z ansible EC2 moduel, ponieważ nie używamy go do budowania pudeł z poziomu ansibli, istnieje prosty sposób, aby uzyskać to, co chcesz z ec2 external inventory script i proste ustawienia w twoim inventories/main. Musisz ustawić ec2.py i ec2.ini wewnątrz swojego inventories, aby był on używany jako źródło instancji. Pamiętaj, aby odkomentować group_by_tag_keys = True wewnątrz ec2.ini.

Kolejnym krokiem jest rozróżnienie, która instancja trafia w miejsce. Chociaż istnieje wiele metod wyboru dostępnych w ec2.py, wolę odpowiednio oznaczyć każdą instancję odpowiednio. Wszystkie moje wystąpienia mają tag o nazwie environment, który jest odpowiednio wypełniony (w twoim przypadku byłby to inscenizacja lub produkcja). Pozostało tylko obsłużenie go wewnątrz twojego inventories/main, a tutaj jest mały przykład jak to zrobić.

Najpierw należy zdefiniować pustą grupę tagów chcesz używać:

[tag_environment_staging] 

[tag_environment_production] 

więc możemy później odwoływać się do nich. Potem pozostaje tylko określić te grupy jako dzieci dla odpowiednich etapów. Tak więc nasz minimalny plik będzie wyglądał następująco:

[tag_environment_staging] 

[tag_environment_production] 

[staging:children] 
tag_environment_staging 

[production:children] 
tag_environment_production 

I gotowe.Od tej pory każde wystąpienie wyciągnięte z EC2 za pośrednictwem dynamicznego skryptu inwentarza, który pochodzi ze znacznikiem środowiska, zostanie dopasowane do odpowiedniej konfiguracji w group_vars. Wszystko, co musisz pamiętać, gdy zajmujesz się dynamicznymi zapasami, chcesz, aby Twój numer -i wskazywał katalog inventories, a nie konkretny plik, aby działał poprawnie.

+0

Sekcje takie jak "[tag_environment_staging]" już przyjmują, że istnieją oznakowane instancje. Co się stanie, jeśli chcę używać Ansible do faktycznego * tworzenia * tych tagów i * tagów * instancji z nimi? Aby to zrobić poprawnie, potrzebuję jakiejś zmiennej 'env' ustawionej na' staging' * przed * Nawet zacznę pobierać fakty z AWS. Przed uruchomieniem mojego playbooka nasze konto AWS jest czyste i nic tam nie ma. –

+0

Samo tagowanie jest łatwe i [starannie ułożone w dokumentacji] (http://docs.ansible.com/ansible/guide_aws.html#provisioning). Oczywiście musisz przekazać do playbooka, jakiego rodzaju wdrażasz scenę, co jest dość prostym użyciem extra_vars lub env. –

+0

Mam zestawy zmiennych - więcej niż tuzin zmiennych - dla każdego środowiska. Czy przekazuję każdą z nich '-e' za każdym razem, gdy muszę dostarczyć/wdrożyć do każdego środowiska? O to właśnie chodzi w tym pytaniu: w jaki sposób zrobić magiczne wyrażenie 'group_vars/(inscenizacja | produkcja)' w sposób, w jaki robią to przy użyciu statycznych inwentaryzacji? –

2

Mam podobny problem z dynamicznymi zapasami, ale w przypadku Openstack. Rozwiązaniem, które do tej pory wymyśliłem, jest użycie zmiennej środowiskowej, aby określić, czy chcę kierować na środowisko pomostowe czy produkcyjne. Powinno to również dotyczyć twojej sprawy. W naszym setupie $OS_PROJECT_NAME jest albo stage lub prod. W ansible.cfg ustawić

inventory = ./inventories/${OS_PROJECT_NAME}/openstack.py 

Następnie mamy konkretnych zmiennych środowiskowych grupowych pod

inventories/(stage|prod)/group_vars/ 

wadą jest to trzeba mieć skrypt zapasów w dwóch miejscach albo mają to dowiązane. Uważaj także, że pliki group_vars znalezione względem katalogu playbook nadal będą nadpisywać inwentarz group_vars.

+1

To jest podejście, które uznałem za najlepsze po wielu dniach spędzonych w Internecie i przeczytaniu książki ... Dziwne jest to, że ten dość ważny aspekt Ansible nie jest dobrze udokumentowany. – DejanLekic

Powiązane problemy