سؤال كيف ترى stdout من الأوامر ansible؟


كيف أرى stdout لأوامر playbook ansible؟ -v يظهر فقط إخراج ansible ، وليس الأوامر الفردية. سيكون أمرا رائعا إذا تمكنت من معرفة كيفية القيام بذلك على الفور ، لذلك إذا فشل شيء ما أو توقف أستطيع أن أرى لماذا.

مثلا

- name: print to stdout
  action: command echo "hello"

سوف تطبع

TASK: [print variable] ******************************************************** 

hello

124
2017-09-06 21:01


الأصل


ذات صلة: serverfault.com/questions/667252/... - Capi Etheriel
stackoverflow.com/questions/20563639/... - JonnyJD


الأجوبة:


أعتقد أنه يمكنك تسجيل النتيجة إلى متغير ، ثم الطباعة باستخدام التصحيح.

- name: print to stdout
  command: echo "hello"
  register: hello

- debug: msg="{{ hello.stdout }}"

- debug: msg="{{ hello.stderr }}"

126
2017-09-14 13:01



بالإضافة إلى ذلك ، يمكنك تصحيح متغير مباشرة مع - debug: var=hello. في بعض الأحيان هذا هو أكثر فائدة للإخراج متعدد الأسطر أو إخراج الوحدة النمطية Ansible (بدلاً من command/shell انتاج). - geerlingguy
واجهت صعوبة في الحصول على إخراج جافا باستخدام هذا. الإصلاح هو إعادة توجيه كافة مخرجات Java إلى stdout: shell: java -version 2>&1 - Matthias Braun
هذا شيء أفضل بكثير ، لكنك فقط تحصل على رسالة stdout بعد اكتمل الأمر بنجاح. كنت أواجه مشكلة حيث يبدو أن تعليقها. كان السبب في ذلك أنني كنت أستخدم اسم مستخدم خاطئ لأمر rsync ، والذي قام بتخزين طلب كلمة المرور التفاعلي ، والذي قام بإعدامه فقط. كان من الصعب جدًا تصحيح الأخطاء - ولكن إذا تمكنت من رؤية العوائق في الوقت الفعلي ، فقد أدركت على الفور ما فعلته خطأ. أود أن أحب هذه الوظيفة ، إذا أمكن ذلك. - Michael B
في حين أن هذا يعمل ، فهذا يعني أن ansible يجعل من الصعب حقا التصحيح. دعونا نتخيل أن المهمة الأولى لا تنتهي أبداً (ربما يكون من الحماقة في انتظار إدخال المستخدم) ... المستخدم لن يعرف أبدًا! وعلاوة على ذلك، فإن register الوحدة النمطية ، أو أيا كان أنها لا تنتج الأشياء التي لديها stdout أو stderr مجموعة متغيرة .... لذلك من السوء حقًا أننا لا نحصل على المخرجات افتراضيًا: | - vlad-ardelean


بدلا من المعياري أود أن أقترح استخدام stdout_lines. بالنسبة إلى المخرجات متعددة الأسطر ، يكون هذا الأمر أجمل ، على سبيل المثال ،

- hosts: all
  tasks:
    - name: Run ls.sh and output "ls /"
      script: ls.sh
      register: out

    - debug: var=out.stdout_lines

يعطي

TASK: [debug var=out.stdout_lines] ******************************************** 
ok: [local] => {
    "var": {
        "out.stdout_lines": [
            "total 61", 
            "lrwxrwxrwx   1 root root     7 Feb 15  2015 bin -> usr/bin", 
            "drwxr-xr-x   6 root root  1024 Aug 24 22:08 boot", 
            "drwxr-xr-x  22 root root  3580 Sep  8 18:41 dev",  
            [...] 
            "drwxr-xr-x   9 root root  4096 Aug 25 19:14 usr", 
            "drwxr-xr-x  13 root root  4096 Feb 25  2015 var"
        ]
    }
}

فيما يتعلق الإخراج الوقت الحقيقي لأغراض التصحيح هناك تقرير bug مغلق https://github.com/ansible/ansible/issues/3887#issuecomment-54672569 مناقشة الأسباب التي تجعل هذا غير ممكن ولن يتم تنفيذه.


76
2017-09-08 18:12



+1 لربط الخطأ "إخراج الوقت الفعلي". - ntc2
إذا أردت إرسال out.stdout_lines (كجسم مهمة بريد Ansible) ، فكيف يمكنني إرسالها بحيث لا تبدو هكذا عند تلقي البريد الإلكتروني؟ [u'total 61 '، u'lrwxrwxrwx 1 root root 7 Feb 15 2015 bin -> usr / bin'، u'drwxr-xr-x 6 root root 1024 Aug 24 22:08 boot '، u' .... "] أريد أن تبدو مثل هذا ، كما رأينا في المحطة - Chris F


لقد وجدت استخدام أدنى  stdout_callback مع ansible-playbook أعطت مخرجات مشابهة لاستخدام ad-hoc ansible.

في حسابك ansible.cfg (لاحظ أنني على OS X لذا قم بتعديل callback_plugins مسار لتناسب التثبيت الخاص بك)

stdout_callback     = minimal
callback_plugins    = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ansible/plugins/callback

بحيث مهمة مثل هذا

---
- hosts: example
  tasks:
   - name: Say hi
     command: echo "hi ..."

يعطي الإخراج مثل هذا ، مثل أمر مخصص

example | SUCCESS | rc=0 >>
hi ...

أنا أستخدم ansible-playbook 2.2.1.0


13
2018-04-06 08:12



يمكن للمكون الإضافي لطيف ، بسيطة بعد المعالجة استخراج الإخراج القياسي فقط. - RichVel