2013-09-02 14 views

Odpowiedz

65

można przekazać listę lub przedmiot tak:

[example] 
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]' 
+11

@ryanyuyu To nie tylko nie jest ten sam kod co w pytaniu, ale także dokładne rozwiązanie, którego szukał OP. Testowałeś to? Ryler zrobił, ja też: I działa. To powinna być zaakceptowana odpowiedź, a nie odrzucona. – udondan

+4

Tak, można również potwierdzić, że to działa. Jest to dobre na przykład do użycia z instrukcją "with_items". Możesz nawet tworzyć podobne do dictów obiekty. Używam tego do definiowania użytkowników uwierzytelniania nginx i haseł w pliku inwentaryzacji: nginx_auth = '[{"user": "user1", "pass": "pass1"}, {"user": "user2", "pass" ":" pass2 "}] ' –

+0

Czy to jest najmodniejsze z możliwych rozwiązań dla plików ini?Co się stanie, jeśli masz ponad 20 obiektów i 5 hostów do skonfigurowania? Byłbym szczęśliwy, ale to działa na razie. – JohnnyQ

20

Przy zmiennych złożonych najlepiej jest zdefiniować je w pliku host_vars, a nie w pliku inwentaryzacji, ponieważ pliki host_vars obsługują składnię YAML.

Spróbuj utworzyć plik host_vars/127.0.0.1 o następującej treści:

timezone: Europe/Amsterdam 
locales: 
    - en_US 
    - nl_NL 
+0

Dziękuję, to jest mój obecny sposób pracy :) Czy twoja odpowiedź implikuje, że nie możesz określić zmiennej listy w pliku inwentaryzacji (i --extra-vars)? – rmuller

+0

@rmuller Nie wiem, czy możliwe jest określenie zmiennych listy w plikach ini lub w wierszu poleceń. Prawdopodobnie uzyskasz szybszą odpowiedź, jeśli zapytasz o listę dyskusyjną ansible. –

+0

@rmuller Polecam także skakanie na kanale #ansible IRC, chłopaki, którzy zwykle pomagają :-) – jabclab

4

można spróbować podzielić

#inventory file 
[example] 
127.0.0.1 timezone="Europe/Amsterdam" locales="en_US","nl_NL" 

#role file 
--- 
- debug: msg="{{ item }}" 
    with_items: locales.split(',') 
4

odpowiedź Ryler jest dobra w tym konkretnym przypadku, ale wpadłem na problemy za pomocą innych odmian Europejska moduł szablonu.

[example] 
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]' 

Jest to jego oryginalny przykład i działa dobrze.

Poniższe odmiany działają z szablonem. Zasadniczo, jeśli jest to ciąg, należy pamiętać o użyciu wewnętrznych podwójnych cudzysłowów lub cała struktura jest analizowana jako pojedynczy ciąg. Jeśli są to tylko liczby lub "prawda" lub "fałsz" (nie "tak"), wszystko jest w porządku. W tej odmianie nie mogłem pracować z szablonem, gdyby miał zewnętrzne cytaty.

Nie przeprowadziłem wyczerpującego sprawdzenia, które wewnętrzne przypadki użycia są wykonywane i nie łamią się poza modułem szablonu.

Używam odpowiedzi 2.2.1.

[example:vars] 
# these work 
myvar1=["foo", "bar"] 
myvar2=[1,2] 
myvar3=[True,False] 

# These fail, they get interpreted as a single string. 
myvar4=[yes, no] 
myvar5=[foo,bar] 
myvar6='["foo", "bar"]' 
+0

Ten dodatkowy fragment informacji pomógł mi rozwiązać irytująco dowolny problem z analizą zmiennych. Dzięki! –

+0

Trochę dodatkowych informacji: Myślę, że różnice występują z powodu różnych tras analizowania. W [grupa: vars] wszystko jest przekazywane bezpośrednio jako INI_PARSER-> YAML_PARSER, w tym podwójne cudzysłowy. Tak więc parser YAML interpretuje go jako ciąg znaków. Po nazwie hosta przechodzi przez podobny parser do argumentów "równych stylów" do modułu: INI_PARSER-> ANSIBLE_ARG_PARSER-> YAML_PARSER. W tym drugim przypadku ANSIBLE_ARG_PARSER interpretuje łańcuch podwójnie cytowany i przekazuje treść (bez cudzysłowów) do parsera YAML. – Sparky

Powiązane problemy