2017-01-16 3 views
1

Ich habe eine Rolle, die ich mehrmals ausführen möchte, jede Ausführung mit einer anderen Var. Ich möchte jedoch auch, dass einige dieser Hinrichtungen bedingt sind. HierBedingte Ansible-Rollen schlagen fehl, wenn sie bereits ausgeführt wurden

ist ein main.yml:

- hosts: localhost 
    roles: 
    - { role: test, test_files_group: 'a'} 
    - { role: test, test_files_group: 'b', when: False} 

Hier ist die main.yml aus der 'Test' Rolle (roles/test/tasks/main.yml):

- name: List files 
    command: "find . ! -path . -type f" 
    args: 
    chdir: "{{ role_path }}/files/{{ test_files_group }}" 
    register: files 
- debug: var=files.stdout_lines 

- name: do something with the files 
    shell: "echo {{ item }}" 
    with_items: "{{ files.stdout_lines }}" 

Und hier ist ein Teil des ansible-Textbuch Befehlsausgabe:

TASK [test : List files] 

******************************************************* 
changed: [localhost] 

TASK [test : debug] ************************************************************ 
ok: [localhost] => { 
    "files.stdout_lines": [ 
     "./testfile-a" 
    ] 
} 

TASK [test : do something with the files] ************************************** 
changed: [localhost] => (item=./testfile-a) 

TASK [test : List files] ******************************************************* 
skipping: [localhost] 

TASK [test : debug] ************************************************************ 
skipping: [localhost] 

TASK [test : do something with the files] ************************************** 
fatal: [localhost]: FAILED! => {"failed": true, "msg": "'dict object' has no attribute 'stdout_lines'"} 

Alles funktioniert für 'a' wie erwartet, aber dann die do something with the files ta sk wird für b ausgeführt, obwohl ich when: False gesetzt habe.

Ich fühle mich wie ich etwas vermisse - was ich will ist für alles in roles/test/tasks/main.yml ausgeführt werden mit der test_files_group var entsprechend eingestellt, oder gar nicht. Was mache ich falsch? :)

Antwort

1

Möglicherweise möchten Sie lesen, wie when Arbeiten mit umfasst und Rollen.

In Ihrem Fall ist when: false im zweiten Lauf zu jeder Aufgabe angebracht, so Sie haben:

- name: List files 
    command: "find . ! -path . -type f" 
    args: 
    chdir: "{{ role_path }}/files/{{ test_files_group }}" 
    register: files 
    when: false 

- debug: var=files.stdout_lines 
    when: false 

- name: do something with the files 
    shell: "echo {{ item }}" 
    with_items: "{{ files.stdout_lines }}" 
    when: false 

1. und 2. Aufgaben übersprungenen sind (die Ausgabe sehen), und in der die Erklärung der 3. Aufgabe when wird auf jede Iteration angewendet, aber ... zuerst versucht Ansible, with_items: "{{ files.stdout_lines }}" auszuwerten, und tut dies nicht, weil List-Dateien Aufgabe übersprungen wird, so gibt es keine files.stdout_lines.

Wenn Sie dieses Problem beheben möchten, verwenden Sie die Standard für Loop-Argument, z.B .:

with_items: "{{ files.stdout_lines | default([]) }}" 

Aber ich würde empfehlen, Ihren Code zu Refactoring und verwenden Sie nicht „conditionals“ mit Rollen.

+0

brilliant, danke! – Mark

Verwandte Themen