मैं एक फ़ाइल के लिए टास्क आउटपुट कैसे लॉग करूँ?


10

मेरे कई कामों में से एक Oracle डेटाबेस का उपयोग करके आयात करता है impdp

यह बहुत सारे आउटपुट को कंसोल में उत्पन्न करता है इसलिए मैंने सेट किया है no_log: True

हालाँकि, जब यह विफल होता है तो मैं लॉग देखना चाहता हूँ!

मैं इस विशेष कार्य को एक फ़ाइल में कैसे बना सकता हूं और कंसोल को नहीं?


आप कमांड मॉड्यूल का उपयोग कर रहे हैं?
जिओनीज चामिओसोव

एक विचार [हैक का अधिक] लॉग्स को किसी बाहरी फ़ाइल में लिखना होगा, और फिर उसके बाद एक कार्य करना होगा जो failed_whenशर्त का उपयोग करता है , और यदि मौजूद है तो लॉग फ़ाइल को हटा दें। कार्य था सफल :)
Dawny33

आप वैसे भी सफल रन के दौरान कंसोल आउटपुट क्यों देख सकते हैं? मैंने एक कॉन्फ़िगरेशन नहीं देखा है, और न ही मैंने सोचा था कि यह संभव था, एक सफल कार्य निष्पादन के दौरान स्टडआउट दिखाना, यह बस आना चाहिए [ठीक है: मेजबान नाम]। हालाँकि जब एक त्रुटि का पता लगाया जाता है तो आउटपुट को नियंत्रण योग्य कंसोल (और किसी भी एन्सेबल लॉग को परिभाषित) में डंप कर दिया जाता है।
हविंडिन

@hvindin वर्बोज़ लॉग प्राप्त -vvvकरने की ansible-playbookआज्ञा के बाद रखो ।
Dawny33

1
एक चर को पंजीकृत करना सबसे अच्छा तार्किक कदम लगता है, मेरी राय के बारे में अपने जवाब के लिए मेरी टिप्पणी को देखें, जो कि चालू ट्रिगर कमांड से आउटपुट के साथ क्या करें।
हविंदिन

जवाबों:


4

[मेरी टिप्पणी को एक उत्तर में बदलना]

ऐसा करने का एक तरीका यह होगा कि आप लॉग्स को किसी बाहरी फ़ाइल में लिखें, और फिर उसके बाद एक कार्य करें, जो विफल_होऊ स्थिति का उपयोग करता है, और यदि पिछला कार्य सफल था, तो लॉग फ़ाइल को हटा दें।

कुछ इस तरह आपकी मदद करनी चाहिए।

 - name: Run Py script
      command: <>.py  > <>.log
      become: yes
      register: PyScript
      ignore_errors: True

    - name: PyScript on success
      command: rm <>.log
      when: PyScript|succeeded

नोट: यह आपकी समस्या को संभालने का सबसे अच्छा तरीका नहीं हो सकता है। लेकिन, यह एक हैक था जिसने मुझे अपनी लॉगिंग और निगरानी करने में मदद की।


2
मैं एक बार और कहता हूँ कि आप अपने कमांड लेखन को stdout / stderr पर रख सकते हैं और फिर असफलता की प्रतिक्रिया के रूप में उन्हें बाहर निकाल सकते हैं। तो, अपने उपरोक्त उदाहरण में एक उदाहरण के रूप में यदि आप एक विफलता की स्थिति में निष्पादन को रोकना चाहते थे, तो एक असफल कार्य का उपयोग करके केवल PyDScript में पंजीकृत stdout और stderr को आउटपुट करना जब rc! = 0 एक अधिक समग्र समाधान प्रतीत होगा। यदि आप ansibles इनबिल्ट मैकेनिज्म का उपयोग करते हैं तो यदि आपके पास एक नियंत्रण सर्वर पर एक उदाहरण के रूप में स्थापित करने योग्य लॉगिंग है, तो वह नियंत्रण सर्वर ansible लॉग में विफलता लॉग करेगा। जो मुझे लगता है कि इसके लिए सही जगह होगी
hvindin

3

मुझे लगता है कि आपको बस इतना करना है कि आपको अपनी जरूरत के हर कमांड का आउटपुट रजिस्टर करना है (इसे वेरिएबल में स्टोर करें) और फिर वेरिएबल को फाइल में डंप करें। इस तरह आप बाद में इसकी समीक्षा कर सकते हैं।

tasks:
  - name: Dump all vars
    action: template src=templates/dumpall.j2 dest=/tmp/ansible.all

फिर डंपल.जे 2 में:

Module Variables ("vars"):
--------------------------------
{{ vars | to_nice_json }} 

Environment Variables ("environment"):
--------------------------------
{{ environment | to_nice_json }} 

GROUP NAMES Variables ("group_names"):
--------------------------------
{{ group_names | to_nice_json }}

GROUPS Variables ("groups"):
--------------------------------
{{ groups | to_nice_json }}

HOST Variables ("hostvars"):
--------------------------------
{{ hostvars | to_nice_json }} 

मैं जिस उदाहरण का उपयोग कर रहा हूँ वह यहाँ से है


3

मैंने इसे जोड़कर हल किया

ignore_errors: true
register: results

to no_log-task। यह कार्य के असफल होने पर भी अगले कार्य को जारी रखता है। फिर अगले कार्य के लिए डिबग कार्य को परिभाषित करें, जो हमेशा पंजीकृत चर को विफल और आउटपुट करता है, लेकिन केवल तब चलता है जब पिछला कार्य विफल हो जाता है:

- name: Error output
  debug:
     var: results
  failed_when: true
  when:
     results is failed

तो यहां तक ​​कि no_log: true के साथ, यह असफल कार्य के आउटपुट को प्रदर्शित करेगा। यह समाधान अनुरोध के अनुसार इसे फ़ाइल में लॉग नहीं कर रहा है, लेकिन 'विफल होने पर लॉग को देखने' की आपकी आवश्यकता को पूरा करता है, और निश्चित रूप से, आप इस फ़ाइल के साथ पूर्ण ansible आउटपुट को आउटपुट करने के लिए टी को पुनर्निर्देशित या उपयोग कर सकते हैं, जो इस समाधान के साथ होगा। इसमें विफल कार्य का लॉग भी है।


2

मैं क्या जब मैं एक आदेश है निष्पादित और केवल विफलता के मामले में लॉग प्राप्त करने के लिए इच्छा के लिए इस प्रकार (एक खोल comamnd लगाया जाता है की तरह है /bin/sh -c '...'मामले में सर्जक एक का उपयोग नहीं करता systemकॉल या खोल के बिना सीधे आदेश पर अमल) :

command 2&>1 > command-log.txt || cat command-log.txt

यह किसी फ़ाइल में त्रुटि और मानक आउटपुट को रीडायरेक्ट करेगा और केवल विफलता की स्थिति में फ़ाइल की सामग्री को प्रदर्शित करेगा। यदि कमांड बहुत क्रियात्मक है और आप लॉग को रखना नहीं चाहते हैं तो ठीक है जब आप साथ जा सकते हैं:

command 2&>1 > command-log.txt && rm command-log.txt || cat command-log.txt

के लिए बोली &&और ||से उपयोग श मैनपेज :

प्रतीक && (||) के कारण सूची का क्रियान्वयन केवल तभी होता है जब पूर्ववर्ती पाइपलाइन एक शून्य (गैर शून्य) मान लौटाती है।

शायद यह सबसे आसान तरीका नहीं है, लेकिन इसे किसी भी विन्यास प्रबंधन प्रणाली के साथ बहुत पोर्टेबल होने का फायदा मिलता है, जो कमांड स्टडआउट प्रदर्शित करने की क्षमता देता है।


0

Ansible को ठीक से मानकर त्रुटियों को stderr में फेंकता है, तो आप किसी भी प्रोग्राम में त्रुटियों के आउटपुट को अप्रत्यक्ष रूप से आउटपुट फ़ाइल का उपयोग करके फ़ाइल में कैप्चर कर सकते हैं:

some command 2> error.log

हालाँकि मुझे नहीं लगता कि यह मामला है।

इसके बजाय आप की संभावना तय करने के लिए जब त्रुटियों हो जाएगा इस गाइड का उल्लेख करना चाहते हैं http://docs.ansible.com/ansible/playbooks_error_handling.html और फिर तार कि एक फाइल करने के लिए outputting से पहले त्रुटि दर्शाता है के लिए अपने उत्पादन grep

अर्थात।

ansible-playbook my-playbook | grep 'error' > error.log


-2

मुझे लगता है कि आप जिस चीज की तलाश कर रहे हैं, वह फ़ाइल के लिए बहुत ही मोटे तौर पर रीडायरेक्ट और स्ट्रीट हो सकती है।

आमतौर पर, कुछ-कमांड और> logfile.log

या कुछ भिन्न ...।


जो केवल एक आंशिक उत्तर है, ओपी त्रुटि के मामले में लॉग देखना चाहता है।
तेनसीबाई

मुझे नहीं लगता कि यह इस सवाल का आंशिक जवाब भी है। यह एक खोल स्क्रिप्ट के लिए ठीक है, लेकिन में कोडिंग के लिए बेकार ansible
चूजों

@ मुझे लगता है कि यह ansible (जो मुझे ज्यादा नहीं पता है) के भीतर एक 'शेल' पद्धति के दृष्टिकोण पर एक मान्य समाधान हो सकता है
Tensibai

-2

टी लॉगिंग के लिए एक बहुत ही सरल उपकरण होगा, आप निम्नलिखित कमांड का उल्लेख कर सकते हैं।

eric@eric-MacBookPro:~$ ansible -m ping all | tee > /tmp/ansible.log
eric@eric-MacBookPro:~$ cat /tmp/ansible.log 
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

2
1. यह केवल एक कार्य को नहीं बल्कि पूरे रन को प्रभावित करता है। 2. टी के माध्यम से पाइपिंग करने का कोई मतलब नहीं है अगर आप किसी फ़ाइल में इसके स्टडआउट को पुनर्निर्देशित करने जा रहे हैं; यह नहीं है कि आप कमांड का उपयोग कैसे करते हैं। 3. यदि आप टी को ठीक से उपयोग कर रहे थे, तो यह अभी भी सभी स्पैम को कंसोल पर आउटपुट करेगा, जो ओपी नहीं चाहता है।
जिओनीज चामिओसोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.