Ansible: เป็นไปได้หรือไม่ที่จะ "ส่งไฟล์ cat" และส่งออกไปยังหน้าจอขณะที่เล่น playbook และไม่แก้จุดบกพร่องหรือไม่


22

ฉันเขียน playbook ที่ติดตั้งและกำหนดค่า Google Authenticator ต่อผู้ใช้หนึ่งราย

ฉันต้องการขั้นตอนสุดท้ายของ playbook ไปcatยังไฟล์การกำหนดค่า google_authenticator

การใช้โมดูล "debug" ฉันสามารถรับข้อมูลที่จะแสดงบนหน้าจอ แต่เป็นข้อความ debug เท่านั้น:

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

กรอง Jinja อ้างควรจะแก้ปัญหาที่เกิดขึ้นอ้าง ใช้แบบนี้:

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

สำหรับคำถามอื่น ๆ ฉันไม่ทราบว่าโมดูลจะพิมพ์คำสั่งอื่นนอกเหนือจากdebugโมดูล คุณอาจต้องการตรวจสอบว่าบันทึกตัวแปรที่ลงทะเบียนไว้กับไฟล์เป็นตัวเลือกหรือไม่ หากคุณต้องการเก็บตัวแปร Ansible บนโฮสต์คอนโทรลเลอร์คุณสามารถทำสิ่งนี้ได้:

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

แก้ไขฉันต้องแก้ไขตัวเองเล็กน้อย ลองดูที่ข้อผิดพลาดของเซิร์ฟเวอร์นี้ คุณสามารถปรับแต่งเอาต์พุต Ansible โดยใช้callback.displayฟังก์ชั่น ผมขอแนะนำให้อ่านที่เชื่อมโยงบล็อกโพสต์


1

ฉันจะเดิมพันว่าปัญหาคือคำพูดในไฟล์ที่คุณกำลัง cat'ing ไม่ตรงกันและ messing กับคำพูดในผงชูรส อาจลอง:

- debug: msg = "{{details.stdout_lines | regex_escape ()}"

หรือ

- debug: msg = "{{details.stdout_lines | regex_replace ('"', '\ "')}"

สิ่งนี้ควรหลีกเลี่ยงอัญประกาศใน msg เพื่อให้เครื่องหมายคำพูดรอบ msg ตรงกัน

สิ่งนี้ไม่ได้รับการทดสอบ (ตอนนี้ฉันยังไม่สามารถทดสอบได้) แต่คุณสามารถลองใช้จริง ๆ ดูได้อย่างรวดเร็ว


พยายามทั้งสอง ... ไม่ได้ผล
Itai Ganot

อืมฉันเพิ่งวิ่งไปโดยไม่ได้รับคำแนะนำของฉันข้างต้นและได้รับผลลัพธ์เดียวกันกับที่คุณมีในตอนแรก อย่างไรก็ตามมันไม่ปรากฏว่าคุณสามารถรับมันในรูปแบบอื่นที่ไม่ใช่ debug โดยไม่ต้องเขียนโมดูลบันทึกของคุณเองสำหรับ ansible หรือ piping ไปที่ shell หรือ perl script หรืออะไรบางอย่าง ลิงค์นี้มีคำตอบที่ดีstackoverflow.com/questions/28564811/…
lsd

1

ฉันมองลึกเข้าไปในอินเทอร์เน็ตและตรวจสอบกับผู้เชี่ยวชาญ Ansible บางคน

เท่าที่ฉันเข้าใจไม่มีตัวเลือกดังกล่าวใน Ansible 1.8 เพื่อเปลี่ยนทิศทางเอาต์พุตของคำสั่งไปยังหน้าจอเป็นเอาต์พุตปกติแทนที่จะเป็นดีบั๊กเอาต์พุต


2
สำหรับ Ansible 2.2 ยังไม่มีตัวเลือกในการพิมพ์ไปยังหน้าจออื่นนอกเหนือจากการใช้ดีบัก
Itai Ganot

0

ฉันใช้การทดสอบบางอย่างในบล็อกข้อความที่คุณมีด้านบน - วางลงในสถานที่และลบล้างคำพูด json ที่เพิ่มเข้ามาโดยใช้ details.stdout_lines

หากข้อความ 'ไม่ดี' ในไฟล์รับรองความถูกต้องของคุณเป็นผู้นำเสมอสิ่ง\"นี้ (ผ่านการทดสอบ) จะเกิดขึ้นกับการทำงานทำให้เกิดผลลัพธ์มากเหมือนกัน แต่มีเครื่องหมายโคลอนแทนหนึ่งสตริงนี้

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

ตอนนี้นี่เป็นกรณีการใช้งานที่ จำกัด อย่างยิ่ง แต่ถ้าผลลัพธ์ของการรับรองความถูกต้องของ Google มีการกำหนดไว้ที่นี่อย่างเคร่งครัด

อย่างไรก็ตามมันจะยังง่ายกว่าและดีกว่าที่จะใช้var=details.stdout_linesเพื่อรับเนื้อหาที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.