Bagaimana cara menjalankan tugas saat variabel tidak terdefinisi di ansible?

115

Saya mencari cara untuk melakukan tugas ketika variabel yang mungkin tidak terdaftar / tidak ditentukan misalnya

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

Jawaban:

213

Dari dokumen yang memungkinkan : Jika variabel wajib belum disetel, Anda dapat melewati atau gagal menggunakan pengujian yang ditentukan Jinja2. Sebagai contoh:

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

Jadi dalam kasus Anda, when: deployed_revision is not definedharus bekerja

Kyle
sumber
4
terima kasih ini berhasil untuk sayawhen: deployed_revision is not defined or deployed_revision.stdout is not defined or deployed_revision.stdout == ''
sakhunzai
5
Anda juga dapat menggabungkannya dengan kondisi yang berbeda:when: item.sudo is defined and item.sudo == true
czerasz
5
Jangan lakukan apa yang saya lakukan dan beri tanda kurung kurawal di sekitar foo when: foo is defined(misalnya ini tidak berhasil:when: {{ foo }} is defined
David
2
@David Saya menghadapi masalah yang sama seperti Anda. memasang kurung kurawal saat melanggar kondisional. Agar ini berfungsi, Anda perlu menambahkan tanda kurung di sekitar kondisional. misalnya when: ({{ foo }} in undefined)
Tarun
7
Penggunaan kurung kurawal untuk kondisional di Ansible sudah tidak digunakan lagi. Selain itu, tidak ada pernyataan Ansible yang dapat dimulai dengan ekspansi variabel (seperti {{ foo }}). Ini bukan karena Ansible, tapi Yaml akan menafsirkannya sebagai objek. Jika Anda perlu memulai dengan ekspansi variabel, cukup "{{ foo }}"letakkan semuanya dengan tanda kutip ganda (seperti ), untuk memaksa Yaml melihatnya sebagai string dan meneruskannya apa adanya ke Ansible.
Victor Schröder
11

Sesuai dengan Ansible Version 2.5 terbaru, untuk memeriksa apakah suatu variabel telah ditentukan dan bergantung padanya jika Anda ingin menjalankan tugas apa pun, gunakan undefinedkata kunci.

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

Dokumentasi yang Mungkin

Abhijeet Kamble
sumber
5

Dinyatakan dengan tegas, Anda harus memeriksa semua yang berikut: ditentukan, tidak kosong DAN tidak Tidak ada.

Untuk variabel "normal" itu membuat perbedaan jika ditentukan dan ditetapkan atau tidak ditetapkan. Lihat foodan barpada contoh di bawah ini. Keduanya ditentukan tetapi hanya fooditetapkan.

Di sisi lain, variabel terdaftar diatur ke hasil perintah yang sedang berjalan dan bervariasi dari modul ke modul. Mereka kebanyakan adalah struktur json. Anda mungkin harus memeriksa subelemen yang Anda minati. Lihat xyzdan xyz.msgpada contoh di bawah ini:

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