Değişken yanıtlanabilirde tanımsız iken bir görev nasıl çalıştırılır?


116

Bir sıfırlanabilir değişken kayıtlar / tanımsız olmadığında bir görevi gerçekleştirmenin bir yolunu arıyorum örn.

-- 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

Yanıtlar:


215

Gönderen yanıtlayıcı 'docs : gerekli bir değişken seti olmamıştır varsa, atlamak veya jinja2 en tanımlanmış testi kullanılarak başarısız olabilir. Örneğin:

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

Yani senin durumunda when: deployed_revision is not definedçalışmalı


4
teşekkürler bu benim için çalıştıwhen: deployed_revision is not defined or deployed_revision.stdout is not defined or deployed_revision.stdout == ''
sakhunzai

5
Bunu farklı koşullarla da birleştirebilirsiniz:when: item.sudo is defined and item.sudo == true
czerasz

5
Yaptığım şeyi yapmayın ve foo'nun etrafına küme parantezleri koyun when: foo is defined(örneğin bu işe yaramaz:when: {{ foo }} is defined
David

2
@David seninle aynı sorunla karşılaştım. koşulu bozduğunda kaşlı ayraç koymak. Bunun işe yaraması için koşul ifadesinin etrafına parantez eklemeniz gerekir. örneğin when: ({{ foo }} in undefined)
Tarun

7
Ansible'da koşul ifadeleri için küme parantezlerinin kullanımı artık kullanılmamaktadır. Ayrıca, hiçbir Ansible ifadesi değişken genişletmeyle (gibi {{ foo }}) başlayamaz . Bu Ansible yüzünden değildir, ancak Yaml bunu bir nesne olarak yorumlayacaktır. Değişken bir genişletmeyle başlamanız gerekiyorsa "{{ foo }}", Yaml'ı onu bir dizge olarak görmeye ve Ansible'a olduğu gibi iletmeye zorlamak için , her şeyi çift tırnak (gibi ) içine alın.
Victor Schröder

12

En son Ansible Sürüm 2.5'e göre, bir değişkenin tanımlanıp tanımlanmadığını kontrol etmek için ve buna bağlı olarak herhangi bir görevi çalıştırmak istiyorsanız undefinedanahtar kelimeyi kullanın .

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

Ansible Belgeleri


5

Kesinlikle aşağıdakilerin tümünü kontrol etmeniz gerekir: tanımlı, boş değil VE Hiçbiri.

"Normal" değişkenler için, tanımlanmış ve ayarlanmış olması fark yaratır. Bkz foove baraşağıdaki örnekte. Her ikisi de tanımlanmıştır ancak yalnızca fooayarlanmıştır.

Diğer tarafta kayıtlı değişkenler, çalıştırma komutunun sonucuna ayarlanır ve modülden modüle değişir. Çoğunlukla json yapılarıdır. . Muhtemelen See ilgilendiğiniz cihazmda kontrol etmeli xyzve xyz.msgörnek aşağıda:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.