उत्तर देने योग्य: क्या यह संभव है कि "कैट फाइल" और प्लेबुक खेलते हुए स्क्रीन पर आउटपुट हो और डिबग के रूप में नहीं?


22

मैंने एक प्लेबुक लिखी जो प्रति उपयोगकर्ता Google प्रमाणक को स्थापित और कॉन्फ़िगर करता है।

मैं catgoogle_authenticator कॉन्फ़िगरेशन फ़ाइल के लिए playbook का अंतिम चरण चाहता हूं ।

"डीबग" मॉड्यूल का उपयोग कर मैं स्क्रीन पर प्रदर्शित होने वाले डेटा को प्राप्त करने में सक्षम हूं, लेकिन केवल डिबग संदेश के रूप में:

TASK: [debug var=details.stdout_lines] ****************************************
ok: [localhost] => {
    "details.stdout_lines": [
        "ZKMFTE2ADYA2OYCH",
        "\"RATE_LIMIT 3 30",
        "\" DISALLOW_REUSE",
        "\" TOTP_AUTH",
        "12920994",
        "88224784",
        "69464205",
        "38144121",
        "45634120"
    ]
}

मैंने ऑनलाइन पढ़ा कि मैं ऐसा कुछ कर सकता हूं:

  - name: Print to screen google authenticator details
    command: /bin/cat {{ google_authenticator_secret_file_location }}
    register: details
    tags: google_2fa_user

  - debug: msg="{{ details.stdout_lines }}"

जब मैं इसे चलाता हूं तो मुझे एक त्रुटि मिलती है:

TASK: [Print to screen google authenticator details] **************************
changed: [localhost]

TASK: [debug msg="{{details.stdout_lines}}"] **********************************
fatal: [localhost] => Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 532, in _executor
    exec_rc = self._executor_internal(host, new_stdin)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 629, in _executor_internal
    return self._executor_internal_inner(host, self.module_name, self.module_args, inject, port, complex_args=complex_args)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 815, in _executor_internal_inner
    result = handler.run(conn, tmp, module_name, module_args, inject, complex_args)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/action_plugins/debug.py", line 41, in run
    kv = utils.parse_kv(module_args)
  File "/usr/lib/python2.7/dist-packages/ansible/utils/__init__.py", line 526, in parse_kv
    vargs = [x.decode('utf-8') for x in shlex.split(args, posix=True)]
  File "/usr/lib/python2.7/shlex.py", line 279, in split
    return list(lex)
  File "/usr/lib/python2.7/shlex.py", line 269, in next
    token = self.get_token()
  File "/usr/lib/python2.7/shlex.py", line 96, in get_token
    raw = self.read_token()
  File "/usr/lib/python2.7/shlex.py", line 172, in read_token
    raise ValueError, "No closing quotation"
ValueError: No closing quotation


FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************

त्रुटि कहती है: "कोई समापन उद्धरण नहीं" हालांकि यह उद्धृत है। यह भी आज़माया:

 - debug: msg= "{{ details.stdout_lines }}"

किसी भी विचार क्या समस्या हो सकती है?

जवाबों:


3

बोली जिंजा फिल्टर के हवाले से समस्या का समाधान करना चाहिए। इसे इस तरह उपयोग करें:

  - debug: msg="{{ details.stdout_lines | quote }}"

अन्य प्रश्न के लिए, मुझे मॉड्यूल के अलावा किसी अन्य स्टेटमेंट को प्रिंट करने के लिए मॉड्यूल के बारे में पता नहीं है debug। यदि आप पंजीकृत चर को फ़ाइल में सहेजना एक विकल्प है, तो आप जांचना चाहते हैं । यदि आप कंट्रोलर होस्ट पर Ansible वेरिएबल्स को स्टोर करना चाहते हैं तो ऐसा कुछ करना संभव है:

- local_action: copy content={{ details.stdout_lines }} dest=/path/to/destination/file

EDIT मुझे अपने आप को थोड़ा सही करने की आवश्यकता है। इस सर्वरफ़ॉल्ट प्रश्न पर एक नज़र डालें । आप callback.displayफ़ंक्शन का उपयोग करके Ansible आउटपुट को ट्विक कर सकते हैं । मैं लिंक किए गए ब्लॉग पोस्ट को पढ़ने की सलाह देता हूं ।


1

मैं शर्त लगाता हूं कि समस्या उस फ़ाइल में उद्धरण है जो आप कैट कर रहे हैं और बेमेल हैं और संदेश के उद्धरण में गड़बड़ कर रहे हैं। शायद कोशिश करें:

- डिबग: संदेश = "{{details.stdout_lines | regex_escape ()}"

या

- डिबग: संदेश = "{{details.stdout_lines | regex_replace (" "", '\ "')}"

यह संदेश में उद्धरण से बचना चाहिए ताकि संदेश के आसपास के उद्धरण एक दूसरे से मेल खाएंगे।

इसका परीक्षण नहीं किया गया है (मैं अभी इसका परीक्षण करने की स्थिति में नहीं हूं), लेकिन आप इसे वास्तविक रूप से आज़मा सकते हैं और देख सकते हैं।


दोनों की कोशिश की ... काम नहीं किया।
इटई गनोत

हम्म, मैंने इसे अपने सुझावों के बिना ही चलाया, और शुरुआत में आपको वही आउटपुट मिला। हालाँकि ऐसा नहीं लगता है कि आप इसे डिबग के अलावा किसी अन्य प्रारूप में प्राप्त कर सकते हैं, बिना अपने स्वयं के लॉग मॉड्यूल को लिखने के बिना, या किसी शेल या पर्ल स्क्रिप्ट या किसी चीज़ पर पाइप करने के लिए। इस लिंक पर एक अच्छा उत्तर था stackoverflow.com/questions/28564811/…
lsd

1

मैंने इंटरनेट के माध्यम से गहराई से देखा है और कुछ अस्थिर पेशेवरों के साथ जांच की है।

जहाँ तक मैं समझता हूँ, Ansible 1.8 में इस तरह का कोई विकल्प नहीं है कि कमांड के आउटपुट को स्क्रीन पर सामान्य आउटपुट के बजाय सामान्य आउटपुट पर पुनर्निर्देशित करें।


2
डिसएबल 2.2 के रूप में डिबग का उपयोग करने के अलावा स्क्रीन पर प्रिंट करने का कोई विकल्प नहीं है।
इटई गनोट

0

मैंने आपके द्वारा पाठ के ब्लॉक पर कुछ परीक्षण चलाए थे- इसे जगह में गिरा दिया था और विवरणों.स्टीडीआउट_लाइंस का उपयोग करके जोड़े गए जसन उद्धरण को साफ कर दिया था।

यदि आपकी ऑर्टिकल फ़ाइल में 'खराब' टेक्स्ट हमेशा अग्रणी होता है \", तो यह (परीक्षण किया गया) सिर्फ काम करने के लिए होता है, एक ही आउटपुट का उत्पादन करता है लेकिन इस एक स्ट्रिंग के स्थान पर एक कोलन के साथ।

- debug: msg="{{ details.stdout.replace('\\"',':').split('\n') }}"

अब यह एक अत्यंत सीमित उपयोग का मामला है, लेकिन यदि Google ऑर्कुट आउटपुट का सख्ती से यहां परिभाषित किया गया है (और यह पूरी तरह से संभव है कि मामला हो), तो यह वही करना चाहिए जो आप चाहते हैं।

हालाँकि, यह अभी भी आसान है, और var=details.stdout_linesयहाँ सामग्री प्राप्त करने के लिए उपयोग करने के लिए बेहतर होगा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.