Ansible: Có thể để tập tin con mèo con voi và xuất ra màn hình trong khi chơi một cuốn sách và không phải là gỡ lỗi?


22

Tôi đã viết một cuốn sách để cài đặt và định cấu hình Google Authenticator cho mỗi người dùng.

Tôi muốn bước cuối cùng của playbook vào cattệp cấu hình google_authenticator.

Sử dụng mô-đun "gỡ lỗi" tôi có thể nhận được dữ liệu được hiển thị trên màn hình nhưng chỉ dưới dạng thông báo gỡ lỗi:

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"
    ]
}

Tôi đọc trên mạng rằng tôi có thể làm một cái gì đó như thế:

  - 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 }}"

Nhưng tôi gặp lỗi khi chạy nó:

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 ********************************************************************

Lỗi nói: "Không có trích dẫn đóng" mặc dù nó được trích dẫn. Cũng đã thử:

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

Bất kỳ ý tưởng những gì có thể là vấn đề?

Câu trả lời:


3

Bộ lọc Jinja trích dẫn nên giải quyết vấn đề trích dẫn. Sử dụng nó như thế này:

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

Đối với câu hỏi khác, tôi không biết về một mô-đun để in các câu lệnh khác với debugmô-đun. Bạn có thể muốn kiểm tra xem Lưu biến đã đăng ký thành tệp có phải là một tùy chọn không. Nếu bạn muốn lưu trữ các biến Ansible trên máy chủ bộ điều khiển, có thể thực hiện một số thứ như thế này:

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

EDIT Tôi cần phải sửa mình một chút. Hãy xem câu hỏi về serverfault này . Bạn có thể điều chỉnh đầu ra Ansible bằng cách sử dụng callback.displaychức năng. Tôi khuyên bạn nên đọc bài viết trên blog được liên kết .


1

Tôi cá rằng vấn đề là các trích dẫn trong tệp bạn đang gửi không khớp và gây rối với các trích dẫn trong thông điệp. Có thể thử:

- gỡ lỗi: dir = "{{chi tiết.stdout_lines | regex_escape ()}"

hoặc là

- gỡ lỗi: dir = "{{chi tiết.stdout_lines | regex numplace ('"', '\ "')}"

Điều này sẽ thoát các dấu ngoặc kép trong thông điệp để các trích dẫn xung quanh thông điệp sẽ khớp với nhau.

Điều này chưa được thử nghiệm (tôi không ở vị trí để kiểm tra nó ngay bây giờ), nhưng bạn có thể thử nó thật nhanh và xem.


Đã thử cả hai ... không hoạt động.
Itai Ganot

Hmm, tôi chỉ chạy nó mà không có đề xuất của tôi ở trên, và có cùng sản lượng bạn có lúc đầu. Tuy nhiên, có vẻ như bạn không thể có được nó ở một định dạng khác ngoài gỡ lỗi, mà không cần viết mô-đun nhật ký của riêng bạn cho khả năng hiển thị, hoặc chuyển sang tập lệnh shell hoặc perl hoặc một cái gì đó. Liên kết này đã có một câu trả lời tốt stackoverflow.com/questions/28564811/ từ
lsd

1

Tôi đã xem sâu qua internet và kiểm tra với một số chuyên gia Ansible.

Theo tôi hiểu, không có tùy chọn nào như vậy trong Ansible 1.8 để chuyển hướng đầu ra của lệnh sang màn hình như đầu ra bình thường thay vì đầu ra gỡ lỗi.


2
Đối với Ansible 2.2 vẫn không có tùy chọn để in ra màn hình ngoài việc sử dụng gỡ lỗi.
Itai Ganot

0

Tôi đã thực hiện một số thử nghiệm trên khối văn bản mà bạn có ở trên đã bỏ nó vào vị trí và xóa sạch các trích dẫn json được thêm vào bằng cách sử dụng chi tiết.stdout_lines.

Nếu văn bản 'xấu' trong tệp xác thực của bạn luôn dẫn đầu \", thì điều này (đã được kiểm tra) chỉ xảy ra để hoạt động, tạo ra nhiều đầu ra giống nhau nhưng có dấu hai chấm thay cho một chuỗi này.

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

Bây giờ đây là trường hợp sử dụng cực kỳ hạn chế, nhưng nếu đầu ra google auth được xác định nghiêm ngặt ở đây (và hoàn toàn có thể là trường hợp đó), thì điều này sẽ làm những gì bạn muốn.

Tuy nhiên, nó vẫn sẽ dễ dàng hơn và tốt hơn là sử dụng var=details.stdout_linesđể chỉ lấy nội dung ở đây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.