2016-12-16 3 views
18

मेरे पास कुछ उत्तरदायी कार्य हैं जो दुर्भाग्यवश लंबे परिचालन करते हैं - एक S3 फ़ोल्डर के साथ सिंक्रनाइज़ेशन ऑपरेशन चलाने जैसी चीजें। अगर वे प्रगति कर रहे हैं, या बस अटक गए हैं (या एसएसएच कनेक्शन की मृत्यु हो गई है) तो यह हमेशा स्पष्ट नहीं होता है, इसलिए कुछ प्रकार के प्रगति आउटपुट प्रदर्शित होना अच्छा लगेगा। यदि कमांड का stdout/stderr सीधे प्रदर्शित किया गया था, तो मैं उसे देखता हूं, लेकिन उत्तरदायी आउटपुट को कैप्चर करता है।मैं लंबे समय तक चलने वाले उत्तर कार्य के लिए प्रगति कैसे दिखा सकता हूं?

आउटपुट को is a difficult problem for Ansible to solve in its current form पर पिपिंग आउटपुट। लेकिन क्या कोई ऐसी उत्तरदायी चाल है जिसका उपयोग मैं कुछ प्रकार के संकेत प्रदान करने के लिए कर सकता हूं कि चीजें अभी भी चल रही हैं?

वर्तमान टिकट https://github.com/ansible/ansible/issues/4870

उत्तर

8

कुछ चीजें आप कर सकते हैं की एक जोड़ी है, लेकिन जैसा कि आप ठीक ही बताया है, अपने मौजूदा रूप में Ansible वास्तव में एक अच्छा समाधान की पेशकश नहीं करता है।

सरकारी-ish समाधान:

एक विचार async के रूप में कार्य को चिह्नित और यह सर्वेक्षण करना है। जाहिर है यह केवल तभी उपयुक्त है जब यह आपकी प्लेबुक में कहीं और विफलता के बिना इस तरह से चलने में सक्षम है। async डॉक्स here हैं और यहाँ एक उदाहरण उन लोगों से उठा लिया है:

- hosts: all 
    remote_user: root 
    tasks: 
    - name: simulate long running op (15 sec), wait for up to 45 sec, poll every 5 sec 
    command: /bin/sleep 15 
    async: 45 
    poll: 5 

यह कम से कम आप को पता है कि काम फांसी नहीं है एक 'पिंग' दे सकते हैं।

एकमात्र अन्य आधिकारिक रूप से अनुमोदित विधि Ansible Tower होगा, जिसमें कार्यों के लिए प्रगति बार है लेकिन यह मुफ़्त नहीं है।

Hacky-ish समाधान:

ऊपर के अलावा, आप काफी अपने खुद के रोल करने के लिए जा रहे हैं। एस 3 बाल्टी को सिंक करने का आपका विशिष्ट उदाहरण एक स्क्रिप्ट के साथ समय-समय पर एडब्ल्यूएस सीएलआई को बुलाकर और बाल्टी में वस्तुओं की संख्या की गिनती के साथ आसानी से निगरानी की जा सकती है, लेकिन यह शायद ही कभी अच्छा, सामान्य समाधान है।

एकमात्र चीज जिसे मैं कल्पना कर सकता हूं कुछ हद तक प्रभावी होने से आपके नोड्स में आने वाले एसएसएच सत्र को देखना होगा।

ऐसा करने के लिए आप उस मशीन पर उत्तरदायी उपयोगकर्ता को स्क्रीन के माध्यम से कनेक्ट करने और सक्रिय रूप से इसे देखने के लिए कॉन्फ़िगर कर सकते हैं। वैकल्पिक रूप से शायद उस उपयोगकर्ता के लिए sudoers प्रविष्टि में log_output विकल्प का उपयोग करके, आपको फ़ाइल को पूंछ करने की अनुमति देता है। Log_output का विवरण sudoers man page

10

पर आज मैं इस समस्या को ओएसएक्स पर मिला, जहां मैं एक डॉकर शेल कमांड चला रहा था, जिसने निर्माण के लिए काफी समय लगाया और इसके निर्माण के दौरान कोई आउटपुट नहीं था। यह समझने में बहुत निराशाजनक थी कि आदेश लटका हुआ था या धीरे-धीरे बढ़ रहा था।

मैंने एक बंदरगाह को खोल कमांड के आउटपुट (और त्रुटि) को पाइप करने का निर्णय लिया, जिसे बाद में एक अलग टर्मिनल में नेटकैट के माध्यम से सुना जा सकता था।

myplaybook.yml 

- name: run some long-running task and pipe to a port 
    shell: myLongRunningApp > /dev/tcp/localhost/4000 2>&1 

और एक अलग टर्मिनल विंडो में:

$ nc -lk 4000 
Output from my 
long 
running 
app will appear here 

ध्यान दें कि मैं पाइप ही बंदरगाह के लिए त्रुटि आउटपुट; मैं एक अलग बंदरगाह के लिए आसानी से पाइप कर सकता था।

इसके अलावा, मैंने nc_port नामक चर को सेट करना समाप्त कर दिया है जो बंदरगाह के उपयोग में बंदरगाह को बदलने की अनुमति देगा। ansible कार्य तो लगता है कि:

shell: myLongRunningApp > /dev/tcp/localhost/{{nc_port}} 2>&1 

ध्यान दें कि आदेश myLongRunningApp स्थानीय होस्ट पर निष्पादित किया जा रहा है, जिसके कारण मैं nc साथ स्थानीय होस्ट करने के लिए सुनो (मेजबान सूची में सेट है अर्थात कि)।

संबंधित मुद्दे