2014-07-08 9 views
16

Tak wygląda ta funkcja została zaniechana, ja naprawdę nie rozumiem dlaczego, ansibl CTO mówi, że powinniśmy używać zamiast with_nested ale szczerze mówiąc nie mam pojęcia jak to zrobić,ansibl 1.6 obejmują with_items przestarzałe

Oto moja playboook:

- hosts: all 
    user: root 
    vars: 
    - sites: 
    - site: site1.com 
     repo: ssh://[email protected]/orgname/reponame 
     nginx_ssl: true; 
     copy_init: 
     - path1/file1.txt 
     - path2/file2.php 
     - path2/file3.php 

    - site: site2.net 
     repo: ssh://[email protected]/orgname/reposite2 

    - site: site4.com 
     repo: ssh://[email protected]/orgname/reposite3 
     copy_init: 
     - path2/file2.php 

    tasks: 
    - name: Bootstrap Sites 
     include: bootstrap_site.yml site={{item}} 

a komunikat o błędzie podczas próby wykonania tego w ansibl 1.6.6:

ERROR: [DEPRECATED]: include + with_items is a removed deprecated feature. Please update your playbooks.

jaki sposób można przekonwertować ten playbook do czegoś, działa z tą wersją ansibli?

+8

Brakuje mi czegoś. Gdzie jest 'with_items'. Skąd pochodzi "przedmiot"? – Batandwa

Odpowiedz

20

Niestety nie ma wymiany drop-in. Kilka rzeczy, które możesz zrobić:

  • Przekaż listę do dołączonego pliku i tam wykonaj iterację. W swojej Playbook:

    vars: 
        sites: 
         - site1 
         - site2 
    tasks: 
        - include: bootstrap_site.yml sites={{sites}} 
    

    aw bootstrap_site.yml:

    - some_Task: ... 
        with_items: sites 
    
    - another_task: ... 
        with_items: sites 
    
    ... 
    
  • Rewrite bootstrap_site jako module (w python, bash, cokolwiek), umieścić go w library reż obok Playbook. Następnie można zrobić:

    - bootstrap_site: site={{item}} 
        with_items: sites 
    

Aktualizacja: ansibl V2 jest obecnie i przywraca include + with_items combo loop!

+0

Dzięki, właściwie już wypróbowywałam pierwsze rozwiązanie, które wypróbowałeś, ale jest zbyt nieporęczny, ponieważ istnieją zadania, które już przechodzą przez podrzędne elementy, a uzyskanie zagnieżdżonych pętli jest zbyt skomplikowane, chciałbym jednak, abyśmy poszli na drugie rozwiązanie! wygląda świetnie, ale ... czy nie mogę tego zrobić w samym ansiblu? i .. btw, jakikolwiek wgląd dlaczego to się stało przestarzałe? – jmserra

+1

Został przestarzały, ponieważ ludzie (podobno) (https://github.com/ansible/ansible/issues/3512#issuecomment-20873812) używali go głównie ze zmiennymi zapasów, a ze względów implementacyjnych nie mogą być używane w ten sposób. Aby uniknąć zamieszania (dlaczego niektóre zmienne działają, a inne nie), po prostu usunęli tę funkcję. Czy korzystanie z with_nested jest niepraktyczne w twoim przypadku? Jeśli chodzi o pisanie modułów w YAML, nie mogę tego zrobić, obawiam się. – hkariti

+0

ok dzięki, jest to dość frustrujące, ponieważ wydaje się być bardzo prostą cechą, biorąc pod uwagę ilość rzeczy, które można zrobić z ansiblami, wygląda to na trywialne, ale myślę, że to dlatego, że nie rozumiem w pełni, co dzieje się pod maską . with_nested jest o wiele bardziej skomplikowany w użyciu dla subarrayów 3 lub 4 poziomu, więc w końcu poszedłem z innym rozwiązaniem, robienie 1 obejmuje zadanie na każdy element tablicy, nie jest najczystszy, ale działa ... – jmserra

1

Znalazłem odpowiedź, aby ominąć wiadomość odrzuconą przez blahblah ... tak, jak pytano w oryginalnym wpisie.

Dodałem plik vars/filenames.yml:

filenames: 
    - file1 
    - file2 
    - file3 

Następny czytam te nazwy na początku poradnika:

- name: read filenames 
    include_vars: vars/filenames.yml 

Następnie można użyć ich później:

- name: Copy files 1 
    copy: src=/filesrc1/{{ item }} dest=/filedest1/{{ item }} owner=me group=we 
    with_items: filenames 

i tak dalej ....

Pozdrowienia, Tom