Ansible: لا يوجد سمة "للكائن" عند الفقرة 2.3 RC1

تم إنشاؤها على ١٧ مارس ٢٠١٧  ·  2تعليقات  ·  مصدر: ansible/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)]
ترتيب

اساسي

نظام التشغيل / البيئة

RHEL 6.7.1

ملخص

قد لا يكون هذا خطأ ولكن مجرد شيء أفلت منه في الإصدارات الأقدم ولكن مع Ansible 2.3 RC1 إذا كنت أتحقق مما إذا كان متغير مسجل بواسطة وحدة نمطية (مع عبارة when) قد تم تعريفه ومن ثم الحصول على قيمة ديكت فرعية ، فشل في 2.3 بينما في 2.2 وأدناه يعمل بشكل جيد. يحدث هذا على وجه التحديد عندما يتم تخطي الوحدة النمطية التي تسجل المتغير لأي سبب ثم تتحقق مهمة لاحقة مما إذا كان المتغير محددًا ثم تحصل على المفتاح الفرعي.

خطوات التكاثر

مثال كتاب اللعب

---
- 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
نتائج متوقعة

عند استخدام 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
النتائج الفعلية
- ماذا حدث بالتحديد؟ إذا أمكن تشغيل مع الإسهاب الإضافي (-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

التعليق الأكثر فائدة

سوء فهم محتمل

مرحبا!

شكرا جزيلا على تقديمك إلى Ansible. إنه يعني بصدق الكثير بالنسبة لنا.

نعتقد أن التذكرة التي قدمتها قد أسيء فهمها إلى حد ما ، حيث يعمل شيء واحد بشكل مختلف قليلاً عما هو مذكور.

في المستقبل ، قد يكون هذا موضوعًا أكثر ملاءمة لقائمة المستخدمين ، والتي يمكنك أيضًا نشرها هنا إذا كنت ترغب في مزيد من المساعدة فيما سبق.

نظرًا لأنك تتخطى مهمة "stat" ، فلا يزال بإمكانك الحصول على test كقاموس محدد ، ولكن لا يحتوي على مفتاح stat وهذا هو سبب ظهور رسالة الخطأ CORRECT. لتجنب مثل هذه المشكلات ، تحتاج إلى:

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

شكرًا لك مرة أخرى على هذا واهتمامك بـ Ansible!

ال 2 كومينتر

سوء فهم محتمل

مرحبا!

شكرا جزيلا على تقديمك إلى Ansible. إنه يعني بصدق الكثير بالنسبة لنا.

نعتقد أن التذكرة التي قدمتها قد أسيء فهمها إلى حد ما ، حيث يعمل شيء واحد بشكل مختلف قليلاً عما هو مذكور.

في المستقبل ، قد يكون هذا موضوعًا أكثر ملاءمة لقائمة المستخدمين ، والتي يمكنك أيضًا نشرها هنا إذا كنت ترغب في مزيد من المساعدة فيما سبق.

نظرًا لأنك تتخطى مهمة "stat" ، فلا يزال بإمكانك الحصول على test كقاموس محدد ، ولكن لا يحتوي على مفتاح stat وهذا هو سبب ظهور رسالة الخطأ CORRECT. لتجنب مثل هذه المشكلات ، تحتاج إلى:

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

شكرًا لك مرة أخرى على هذا واهتمامك بـ Ansible!

الالتزام المنقسم الذي غيّر هذا السلوك https://github.com/ansible/ansible/commit/81aa12eb1b5a2b50ac9234ca0b05c015af88a845
قضية ذات صلة https://github.com/ansible/ansible/issues/18514

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات