2015-07-09 28 views
13

Chcę warunkowo zdefiniować zmienną w poradniku Ansible w następujący sposób: my_var: "{{ 'foo' if my_condition}}". Chciałbym, aby zmienna pozostała niezdefiniowana, jeśli warunek nie zostanie ustawiony na true.Definicja warunkowo zmiennej w Ansible

W przypadku próby uzyskania odpowiedzi na pytanie: " fatal: [foo.local] => {'msg': 'AnsibleUndefinedVariable: One or more undefined variables: the inline if-expression on line 1 evaluated to false and no else section was defined.', 'failed': True}. Dlaczego mimo to jest to błąd?

Kompletny futerał wygląda następująco: {role: foo, my_var: "foo"}. Jeśli zdefiniowano my_var, rola robi coś specjalnego. W niektórych przypadkach nie chcę tego robić. Mógłbym użyć when: condition, ale wtedy musiałbym skopiować cały blok ról. Mogę również użyć dodatkowej zmiennej bool, ale chciałbym rozwiązania bez konieczności zmiany "interfejsu" do roli.

Wszelkie pomysły?

Odpowiedz

15

Ten kod może pomóc w zdefiniowaniu zmiennej z warunkiem.

- hosts: node1 
    gather_facts: yes 
    tasks: 
    - name: Check File 
    shell: ls -ld /etc/postfix/post-install 
    register: result 
    ignore_errors: yes 

    - name: Define Variable 
    set_fact: 
     exists: "{{ result.stdout }}" 
    when: result|success 

    - name: Display Variable 
    debug: msg="{{ exists }}" 
    ignore_errors: yes 

Tak więc tutaj "istnieje" wyświetli się tylko wtedy, gdy warunek jest spełniony.

+10

Zalecam użycie modułu stat do sprawdzenia pliku zamiast użycia polecenia powłoki. –

11

Można użyć czegoś takiego: my_var: "{{ 'foo' if my_condition else '' }}". 'Else' stanie się, jeśli warunek nie będzie zgodny, iw tym przypadku ustawi pustą wartość dla zmiennej. Myślę, że to krótkie, czytelne i eleganckie rozwiązanie.