Ansible: 'dict object' tidak memiliki atribut di saat klausul 2.3 RC1

Dibuat pada 17 Mar 2017  ·  2Komentar  ·  Sumber: ansible/ansible

JENIS MASALAH
  • Laporan Bug
NAMA KOMPONEN

inti

VERSI ANSIBLE
ansible 2.3.0.0 (stable-2.3 923c9ef17c) last updated 2017/03/17 09:12:40 (GMT +1000)
  config file = /apps/dev/playbook/jordan/mr-ansible/ansible.cfg
  configured module search path = Default w/o overrides
  python version = 2.7.12 (default, Sep 23 2016, 14:23:49) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]
KONFIGURASI

Standar

OS / LINGKUNGAN

RHEL 6.7

RINGKASAN

Ini mungkin bukan bug tetapi hanya sesuatu yang saya dapatkan pada versi yang lebih lama tetapi dengan Ansible 2.3 RC1 jika saya memeriksa apakah variabel yang didaftarkan oleh modul (dengan klausa when) didefinisikan dan kemudian mendapatkan nilai sub dikt itu akan gagal di 2.3 sementara di 2.2 dan di bawah ini berfungsi dengan baik. Ini secara khusus terjadi ketika modul yang mendaftarkan variabel dilewati karena alasan apa pun dan kemudian tugas berikutnya memeriksa apakah variabel tersebut ditentukan dan kemudian mendapatkan sub kunci.

LANGKAH UNTUK REPRODUKSI

Contoh pedoman

---
- name: test
  hosts: localhost
  connection: local

  tasks:
  - name: module that won't run
    stat:
      path: /apps/tmp
    register: test
    when: False

  - name: debug of var
    debug:
      var: test

  - name: test with conditional
    debug:
      msg: A
    when: test is defined and test.stat.exists
HASIL YANG DIHARAPKAN

Saat menggunakan Ansible 2.2.1.0

ansible 2.2.1.0
  config file = /cygdrive/d/dev/jordan/ansible.cfg
  configured module search path = Default w/o overrides
PLAY [test] ********************************************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [module that won't run] ***************************************************
task path: /cygdrive/d/dev/jordan/2.3tests.yml:7
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true}

TASK [debug of var] ************************************************************
task path: /cygdrive/d/dev/jordan/2.3tests.yml:13
ok: [localhost] => {
    "test": {
        "changed": false,
        "skip_reason": "Conditional check failed",
        "skipped": true
    }
}

TASK [test with conditional] ***************************************************
task path: /cygdrive/d/dev/jordan/2.3tests.yml:17
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0
HASIL NYATA
- Apa yang sebenarnya terjadi? Jika memungkinkan, jalankan dengan verbositas ekstra (-vvvv)

PLAY [test] ************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************
Friday 17 March 2017  15:20:42 +1000 (0:00:00.039)       0:00:00.039 **********
ok: [localhost]
META: ran handlers

TASK [module that won't run] *******************************************************************************************************************************************************
task path: /apps/dev/playbook/jordan/mr-ansible/test.yml:7
Friday 17 March 2017  15:20:44 +1000 (0:00:01.093)       0:00:01.133 **********
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False", "skipped": true}

TASK [debug of var] ****************************************************************************************************************************************************************
task path: /apps/dev/playbook/jordan/mr-ansible/test.yml:13
Friday 17 March 2017  15:20:44 +1000 (0:00:00.012)       0:00:01.145 **********
ok: [localhost] => {
    "changed": false,
    "test": {
        "changed": false,
        "skip_reason": "Conditional result was False",
        "skipped": true
    }
}

TASK [test with conditional] *******************************************************************************************************************************************************
task path: /apps/dev/playbook/jordan/mr-ansible/test.yml:17
Friday 17 March 2017  15:20:44 +1000 (0:00:00.034)       0:00:01.180 **********
fatal: [localhost]: FAILED! => {"failed": true, "msg": "The conditional check 'test is defined and test.stat.exists' failed. The error was: error while evaluating conditional (test is defined and test.stat.exists): 'dict object' has no attribute 'stat'\n\nThe error appears to have been in '/apps/dev/playbook/jordan/mr-ansible/test.yml': line 17, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n  - name: test with conditional\n    ^ here\n"}

PLAY RECAP *************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=1
affects_2.3 bug

Komentar yang paling membantu

Kemungkinan Kesalahpahaman

Hai!

Terima kasih banyak atas kiriman Anda ke Ansible. Ini sangat berarti bagi kami.

Kami yakin tiket yang Anda ajukan agak disalahpahami, karena satu hal berfungsi sedikit berbeda dari yang disebutkan.

Di masa mendatang, ini mungkin topik yang lebih cocok untuk daftar pengguna, yang juga dapat Anda posting di sini jika Anda membutuhkan bantuan lebih lanjut tentang hal di atas.

Karena Anda melewatkan tugas 'stat', Anda masih mendapatkan test sebagai kamus yang ditentukan, tetapi tidak memiliki kunci stat itulah sebabnya Anda mendapatkan pesan kesalahan BENAR. Untuk menghindari masalah seperti ini, Anda perlu:

  when: test is defined and 'stat' in test and test.stat.exists

Terima kasih sekali lagi untuk ini dan minat Anda pada Ansible!

Semua 2 komentar

Kemungkinan Kesalahpahaman

Hai!

Terima kasih banyak atas kiriman Anda ke Ansible. Ini sangat berarti bagi kami.

Kami yakin tiket yang Anda ajukan agak disalahpahami, karena satu hal berfungsi sedikit berbeda dari yang disebutkan.

Di masa mendatang, ini mungkin topik yang lebih cocok untuk daftar pengguna, yang juga dapat Anda posting di sini jika Anda membutuhkan bantuan lebih lanjut tentang hal di atas.

Karena Anda melewatkan tugas 'stat', Anda masih mendapatkan test sebagai kamus yang ditentukan, tetapi tidak memiliki kunci stat itulah sebabnya Anda mendapatkan pesan kesalahan BENAR. Untuk menghindari masalah seperti ini, Anda perlu:

  when: test is defined and 'stat' in test and test.stat.exists

Terima kasih sekali lagi untuk ini dan minat Anda pada Ansible!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat