Come eseguire un'attività quando la variabile non è definita in ansible?


115

Sto cercando un modo per eseguire un'attività quando la variabile ansible non è registra / non definita ad es

-- name: some task
   command:  sed -n '5p' "{{app.dirs.includes}}/BUILD.info" | awk '{print  $2}'
   when: (! deployed_revision) AND ( !deployed_revision.stdout )
   register: deployed_revision

Risposte:


213

Dai documenti ansible : Se una variabile richiesta non è stata impostata, puoi saltare o fallire usando il test definito di Jinja2. Per esempio:

tasks:

- shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
  when: foo is defined

- fail: msg="Bailing out. this play requires 'bar'"
  when: bar is not defined

Quindi nel tuo caso, when: deployed_revision is not defineddovrebbe funzionare


4
grazie questo ha funzionato per mewhen: deployed_revision is not defined or deployed_revision.stdout is not defined or deployed_revision.stdout == ''
sakhunzai

5
Puoi anche combinarlo con condizioni diverse:when: item.sudo is defined and item.sudo == true
czerasz

5
Non fare quello che ho fatto e metti parentesi graffe intorno al pippo when: foo is defined(ad esempio, questo non funziona:when: {{ foo }} is defined
David

2
@David ho affrontato lo stesso problema come te. mettere le parentesi graffe quando rompe il condizionale. Per farlo funzionare è necessario aggiungere parentesi attorno al condizionale. ad esempio when: ({{ foo }} in undefined)
Tarun

7
L'utilizzo delle parentesi graffe per i condizionali in Ansible è deprecato. Inoltre, nessuna istruzione Ansible può iniziare con un'espansione variabile (come {{ foo }}). Questo non è a causa di Ansible, ma Yaml lo interpreta come un oggetto. Se devi iniziare con un'espansione variabile, racchiudi semplicemente il tutto con virgolette doppie (come "{{ foo }}"), per forzare Yaml a vederlo come una stringa e passarlo così com'è ad Ansible.
Victor Schröder

11

Secondo l'ultima versione di Ansible 2.5, per verificare se una variabile è definita e, a seconda di ciò, se si desidera eseguire qualsiasi attività, utilizzare la undefinedparola chiave.

tasks:
    - shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
      when: foo is defined

    - fail: msg="Bailing out. this play requires 'bar'"
      when: bar is undefined

Documentazione Ansible


5

Rigorosamente dichiarato, è necessario controllare tutti i seguenti: definito, non vuoto E non Nessuno.

Per le variabili "normali" fa differenza se definite e impostate o non impostate. Vedi fooe barnell'esempio sotto. Entrambi sono definiti ma solo fooè impostato.

Dall'altro lato, le variabili registrate vengono impostate sul risultato del comando in esecuzione e variano da modulo a modulo. Sono principalmente strutture JSON. Probabilmente devi controllare il sottoelemento che ti interessa. Vedi xyze xyz.msgnell'esempio seguente:

cat > test.yml <<EOF
- hosts: 127.0.0.1

  vars:
    foo: ""          # foo is defined and foo == '' and foo != None
    bar:             # bar is defined and bar != '' and bar == None

  tasks:

  - debug:
      msg : ""
    register: xyz    # xyz is defined and xyz != '' and xyz != None
                     # xyz.msg is defined and xyz.msg == '' and xyz.msg != None

  - debug:
      msg: "foo is defined and foo == '' and foo != None"
    when: foo is defined and foo == '' and foo != None

  - debug:
      msg: "bar is defined and bar != '' and bar == None"
    when: bar is defined and bar != '' and bar == None

  - debug:
      msg: "xyz is defined and xyz != '' and xyz != None"
    when: xyz is defined and xyz != '' and xyz != None
  - debug:
      msg: "{{ xyz }}"

  - debug:
      msg: "xyz.msg is defined and xyz.msg == '' and xyz.msg != None"
    when: xyz.msg is defined and xyz.msg == '' and xyz.msg != None
  - debug:
      msg: "{{ xyz.msg }}"
EOF
ansible-playbook -v test.yml
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.