Làm thế nào để xem stdout của các lệnh ansible?


165

Làm cách nào để tôi thấy thiết bị xuất chuẩn cho các lệnh ansible-playbook? -v chỉ hiển thị đầu ra ansible, không hiển thị các lệnh riêng lẻ. Sẽ thật tuyệt nếu tôi có thể tìm ra cách để làm điều này ngay lập tức, vì vậy nếu có gì đó không thành công hoặc bị treo tôi có thể hiểu tại sao.

ví dụ

- name: print to stdout
  action: command echo "hello"

sẽ in

TASK: [print variable] ******************************************************** 

hello


Câu trả lời:


165

Tôi nghĩ bạn có thể đăng ký kết quả cho một biến, sau đó in bằng gỡ lỗi.

- name: print to stdout
  command: echo "hello"
  register: hello

- debug: msg="{{ hello.stdout }}"

- debug: msg="{{ hello.stderr }}"

26
Ngoài ra, bạn có thể gỡ lỗi một biến trực tiếp với - debug: var=hello. Đôi khi điều này hữu ích hơn cho đầu ra đa dòng hoặc đầu ra mô-đun Ansible (chứ không phải command/ shellđầu ra).
ge Muffguy

4
Tôi gặp khó khăn khi nhận đầu ra Java bằng cách sử dụng này. Cách khắc phục là chuyển hướng tất cả đầu ra của Java sang thiết bị xuất chuẩn:shell: java -version 2>&1
Matthias Braun

20
không có gì tốt hơn nhiều, nhưng bạn chỉ nhận được thông báo xuất sắc sau khi lệnh hoàn thành thành công. Tôi đã có một vấn đề trong đó ansible sẽ xuất hiện để treo. Lý do là tôi đã sử dụng sai tên người dùng cho một lệnh rsync, điều này đã làm hỏng yêu cầu mật khẩu tương tác, mà chỉ bị treo. Rất khó để gỡ lỗi - nhưng nếu tôi có thể thấy thiết bị xuất chuẩn trong thời gian thực, tôi sẽ ngay lập tức nhận ra mình đã làm gì sai. Tôi sẽ yêu chức năng này, nếu có thể.
Michael B

10
trong khi điều này hoạt động, nó có nghĩa là ansible làm cho việc gỡ lỗi thực sự khó khăn. Hãy tưởng tượng nhiệm vụ đầu tiên không bao giờ chấm dứt (có lẽ thật ngu ngốc khi chờ người dùng nhập liệu) ... người dùng sẽ không bao giờ biết! Hơn nữa, registermô-đun hoặc bất cứ thứ gì nó không tạo ra các đối tượng có tập hợp stdouthoặc stderrbiến .... vì vậy thật tệ khi chúng ta không nhận được đầu ra theo mặc định: |
vlad-ardelean 10/07/2015

96

Thay vì thiết bị xuất chuẩn, tôi sẽ đề nghị sử dụng stdout_lines . Đối với đầu ra đa dòng, điều này đẹp hơn nhiều, vd

- hosts: all
  tasks:
    - name: Run ls.sh and output "ls /"
      script: ls.sh
      register: out

    - debug: var=out.stdout_lines

cho

TASK: [debug var=out.stdout_lines] ******************************************** 
ok: [local] => {
    "var": {
        "out.stdout_lines": [
            "total 61", 
            "lrwxrwxrwx   1 root root     7 Feb 15  2015 bin -> usr/bin", 
            "drwxr-xr-x   6 root root  1024 Aug 24 22:08 boot", 
            "drwxr-xr-x  22 root root  3580 Sep  8 18:41 dev",  
            [...] 
            "drwxr-xr-x   9 root root  4096 Aug 25 19:14 usr", 
            "drwxr-xr-x  13 root root  4096 Feb 25  2015 var"
        ]
    }
}

Về đầu ra thời gian thực cho mục đích gỡ lỗi, có một báo cáo lỗi đã đóng https://github.com/ansible/ansible/issues/3887#issuecomment-54672569 thảo luận về lý do tại sao điều này là không thể và sẽ không được thực hiện.


16
+1 để liên kết lỗi "đầu ra thời gian thực".
ntc2

Nếu tôi muốn gửi ra.stdout_lines (dưới dạng nội dung của tác vụ thư Ansible), làm thế nào tôi có thể gửi nó để nó không giống như thế này khi nhận được email? [u'total 61 ', u'lrwxrwxrwx 1 root root 7 Feb 15 2015 bin -> usr / bin', u'drwxr-xr-x 6 root root 1024 Aug 24 22:08 boot ', u' .... . '] Tôi muốn nó trông như thế này, như đã thấy trên thiết bị đầu cuối
Chris F

gây tử vong: [127.0.0.1]: KHÔNG CÓ! => {"reason": "Lỗi cú pháp trong khi tải YAML. \ n không tìm thấy dự kiến ​​<bắt đầu tài liệu> \ n \ n Lỗi xuất hiện trong ... vấn đề cú pháp. \ n \ n Dòng vi phạm dường như là: \ n \ n \ n- name: Chạy ls.sh và đầu ra \ "ls / \" \ n ^ tại đây \ n "}
Nate

20

Tôi đã tìm thấy bằng cách sử dụng tối thiểu stdout_callback với ansible-playbook cho kết quả tương tự như sử dụng ad-hoc ansible.

Trong ansible.cfg của bạn (Lưu ý rằng tôi đang dùng OS X nên sửa đổi callback_pluginsđường dẫn cho phù hợp với cài đặt của bạn)

stdout_callback     = minimal
callback_plugins    = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ansible/plugins/callback

Vì vậy, một nhiệm vụ như thế này

---
- hosts: example
  tasks:
   - name: Say hi
     command: echo "hi ..."

Cung cấp đầu ra như thế này, giống như một lệnh ad-hoc sẽ

example | SUCCESS | rc=0 >>
hi ...

Tôi đang sử dụng ansible-playbook 2.2.1.0


Plugin gọi lại đẹp, xử lý hậu kỳ đơn giản chỉ có thể trích xuất đầu ra tiêu chuẩn.
RichVel
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.