2016-02-09 22 views
5

Sto provando a filtrare una lista in Jinya2 non disponibile quando gli elementi contengono una stringa, ma la documentazione di Jinja non mi sembra abbastanza chiara per capirlo.La lista dei filtri Jinja2 usando la stringa contiene test

Questo è quello che ho finora:

- name: run script 
    command: /usr/tmp/run_script.py 
    register: script_results 

- name: display run info 
    debug: 
    var: "{{script_results.stdout_lines | select(\"'running script' in script_results.stdout_lines\") }}" 

Ma tutto quello che ottiene è l'errore:

"<generator object _select_or_reject at 0x13851e0>": "VARIABLE IS NOT DEFINED!" 

Così, per esempio, se stdout_lines contiene ["apples","running script one","oranges","running script two"], voglio stampare

running script one 
running script two 

Hanno documentation for select e documentation for built-in-tests, ma non mostrano il test "in" e non so come funzionano nel contesto di questa variabile ansible.

Ho provato a risolvere in questo modo:

- name: display run info 
    debug: 
    var: item 
    with_items: "{{script_results.stdout_lines}}" 
    when: "'running script' in item" 

Ma che visualizza "saltare" per ogni linea che non superano il test ... un pò sconfiggendo lo scopo!

risposta

4

Capisco che potrebbe esserci più di un modo per farlo. Funzionerà per te?

- debug: var={{item}} 
    when: item.find('running script') > -1 
    with_items: script_results.stdout_lines 
+0

Questa stampa una riga per ogni saltati voce, che sconfigge purtroppo lo scopo. – CorayThan

10

Il filtro select richiede un altro filtro. Come nei documenti odd, che restituiranno solo gli elementi dispari della lista. Il filtro che desideri combinare select con è equalto.

Ora ecco la cosa. Ansible racchiude una versione molto vecchia di Jinja2, che semplicemente non contiene il filtro equalto. Sì, questo lo rende inutile a meno che tu non voglia filtrare elementi dispari. (Quale mai nessuno nella storia voleva ...)

Inoltre, non ero ancora in grado di far funzionare i plug-in dei filtri personalizzati in Ansible 2. Quindi sei praticamente obbligato a creare qualcosa di brutto insieme.

ciaoV ha già mostrato un'opzione. Ecco un'altra idea:

- name: run script 
    shell: /usr/tmp/run_script.py | grep "running script" 
    register: script_results 

Aggiornamento:

recente ho scoperto è possibile utilizzare match (non un filtro Jinja2 standard, ma Inserito da Ansible) insieme select. Quello è un buon sostituto per il filtro eualto più puoi usare le espressioni regolari. Questo dovrebbe funzionare:

{{ script_results.stdout_lines | select("match", ".*running script.*") }} 
+0

Avrei usato questa soluzione, ma in realtà uso l'intero output dello script in qualsiasi altro momento del mio gioco. Suppongo che avrei potuto passare lo script_results a grep e registrare una seconda variabile in quel modo, ma ho deciso di andare invece alla rotta python diretta. – CorayThan

+0

@CorayThan Ho aggiornato la mia risposta. Ora ho trovato un buon sostituto per il filtro 'equalto'. – udondan

+0

Grazie a @ubondan era esattamente quello che stavo cercando. Qualcosa è cambiato per caso con le nuove versioni di Ansible? –

0

ho finito per scrivere uno script Python per farlo, perché non ho potuto ottenere ansible o antica-Jinja2 per fare il taglio.

compiti ansible:

- name: gather run info 
    command: "{{role_path}}/files/print_results.py {{script_results.stdout_lines}}" 
    register: script_print_results 
    delegate_to: 127.0.0.1 
    run_once: true 

- name: display run info 
    debug: 
    var: script_print_results.stdout_lines 
    delegate_to: 127.0.0.1 
    run_once: true 

script Python:

for result_line in sys.argv[1:]: 
    if "running script:" in result_line: 
     print result_line[1:-1] 
Problemi correlati