Làm cách nào để lấy nhật ký / thông tin chi tiết về các lần thực thi mô-đun ansible-playbook?


95

Giả sử tôi thực hiện những điều sau đây.

$ cat test.sh
#!/bin/bash
echo Hello World
exit 0

$ cat Hello.yml
---

- hosts: MyTestHost
  tasks:
  - name: Hello yourself
    script: test.sh


$ ansible-playbook  Hello.yml

PLAY [MyTestHost] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [MyTestHost]

TASK: [Hello yourself] ********************************************************
ok: [MyTestHost]

PLAY RECAP ********************************************************************
MyTestHost                    : ok=2    changed=0    unreachable=0    failed=0

$

Tôi biết chắc rằng nó đã thành công.

Tôi ở đâu / làm cách nào để xem "Hello World" được tập lệnh của tôi dội lại / in trên máy chủ từ xa (MyTestHost)? Hay mã trả về / thoát của script?

Nghiên cứu của tôi cho thấy có thể viết một plugin để chặn các lệnh gọi lại thực thi mô-đun hoặc một cái gì đó trên những dòng đó và viết một tệp nhật ký. Tôi không muốn lãng phí thời gian của mình cho điều đó.

Ví dụ: một cái gì đó giống như stdout bên dưới (lưu ý rằng tôi đang chạy ansible chứ không phải ansible-playbook):

$ ansible plabb54 -i /project/plab/svn/plab-maintenance/ansible/plab_hosts.txt -m script -a ./test.sh
plabb54 | success >> {
    "rc": 0,
    "stderr": "",
    "stdout": "Hello World\n"
}

$

Câu trả lời:


113

Nếu bạn chuyển -vcờ cho ansible-playbook trên dòng lệnh, bạn sẽ thấy stdout và stderr cho mỗi tác vụ được thực thi:

$ ansible-playbook -v playbook.yaml

Ansible cũng được tích hợp hỗ trợ ghi nhật ký. Thêm các dòng sau vào tệp cấu hình có thể nghe được của bạn :

[defaults] 
log_path=/path/to/logfile

Ansible sẽ xem xét một số nơi cho tệp cấu hình:

  • ansible.cfg trong thư mục hiện tại nơi bạn đã chạy ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg

8
Cảm ơn. Chỉ tham lam: Tôi có thể bắt đầu / dừng ghi nhật ký động từ một playbook không? Giống như set -xset +xtrong một tập lệnh shell.
Kashyap

@thekashyap Tôi không nghĩ rằng điều này hiện có thể.
Lorin Hochstein

9
Bạn có thể sử dụng no_log: Truelá cờ để ngăn một lệnh hoặc sổ chơi ghi nhật ký nhưng điều đó rất chi tiết như tôi tin.
Ade Miller

4
Bạn có thể vui lòng mô tả cách tôi đặt logrotateđể log_pathmỗi lần ansiblechạy có một tệp khác nhau (với lệnh / playbook được bao gồm trong tệp)?
bay xốp vào

Tôi cần ba vgiây để có được stdout và stderr
giàu có

24

Tác vụ kịch bản playbook sẽ tạo ra stdoutgiống như lệnh non-playbook, nó chỉ cần được lưu vào một biến bằng cách sử dụng register. Khi chúng tôi đã có điều đó, mô-đun gỡ lỗi có thể in ra luồng đầu ra sách phát.

tasks:
- name: Hello yourself
  script: test.sh
  register: hello

- name: Debug hello
  debug: var=hello

- name: Debug hello.stdout as part of a string
  debug: "msg=The script's stdout was `{{ hello.stdout }}`."

Đầu ra sẽ giống như sau:

TASK: [Hello yourself] ******************************************************** 
changed: [MyTestHost]

TASK: [Debug hello] *********************************************************** 
ok: [MyTestHost] => {
    "hello": {
        "changed": true, 
        "invocation": {
            "module_args": "test.sh", 
            "module_name": "script"
        }, 
        "rc": 0, 
        "stderr": "", 
        "stdout": "Hello World\r\n", 
        "stdout_lines": [
            "Hello World"
        ]
    }
}

TASK: [Debug hello.stdout as part of a string] ******************************** 
ok: [MyTestHost] => {
    "msg": "The script's stdout was `Hello World\r\n`."
}

nhưng Xin chào mình nhiệm vụ đã không đưa ra bất kỳ stdout
Saurabh Chandra Patel

Đây là phương pháp ưa thích của tôi. Sử dụng tốt các giá trị của các biến đã đăng ký trong các câu lệnh gỡ lỗi và thế giới là con sò của bạn.
Joshua K

14

Cũng có một cách khác để tạo tệp nhật ký.

Trước khi chạy, hãy ansible-playbookchạy các lệnh sau để bật ghi nhật ký:

  • Chỉ định vị trí cho tệp nhật ký.

    xuất ANSIBLE_LOG_PATH = ~ / ansible.log

  • Bật gỡ lỗi

    xuất ANSIBLE_DEBUG = True

  • Để kiểm tra tệp nhật ký được tạo.

    ít hơn $ ANSIBLE_LOG_PATH


1
ANSIBLE_DEBUG tách biệt với việc chỉ định tệp nhật ký. Nó thậm chí còn tách biệt với lựa chọn chi tiết! Điều này vẫn rất tốt để gọi ra - gỡ lỗi sẽ cung cấp cho bạn thông báo gỡ lỗi theo định hướng của nhà phát triển, ở mức độ chi tiết hoàn toàn. Tốt để có xung quanh.
AlanSE

4

Các plugin ngoại tuyến

Bạn có thể sử dụng các plugin gọi lại đầu ra . Ví dụ: bắt đầu trong Ansible 2.4, bạn có thể sử dụng plugin gọi lại đầu ra gỡ lỗi :

# In ansible.cfg:
[defaults]
stdout_callback = debug

(Cách khác, chạy export ANSIBLE_STDOUT_CALLBACK=debugtrước khi chạy playbook của bạn)

Quan trọng: bạn phải chạy ansible-playbookvới tùy chọn -v( --verbose) để xem hiệu ứng. Với stdout_callback = debugset, đầu ra bây giờ sẽ giống như sau:

TASK [Say Hello] ********************************
changed: [192.168.1.2] => {
    "changed": true,
    "rc": 0
}

STDOUT:


Hello!



STDERR:

Shared connection to 192.168.1.2 closed.

Có các mô-đun khác ngoài debugmô-đun nếu bạn muốn đầu ra được định dạng khác. Có json, yaml, unixy, dense, minimal, vv ( danh sách đầy đủ ).

Ví dụ, với stdout_callback = yaml, đầu ra sẽ giống như sau:

TASK [Say Hello] **********************************
changed: [192.168.1.2] => changed=true 
  rc: 0
  stderr: |-
    Shared connection to 192.168.1.2 closed.
  stderr_lines:
  - Shared connection to 192.168.1.2 closed.
  stdout: |2-

    Hello!
  stdout_lines: <omitted>

Các plugin của bên thứ ba

Nếu không có plugin chính thức nào đạt yêu cầu, bạn có thể thử human_logplugin. Có một số phiên bản:


3

Bằng cách sử dụng các plugin gọi lại, bạn có thể có các lệnh đầu ra ở dạng có thể đọc được với play: gist: human_log.py

Chỉnh sửa đầu ra ví dụ:

 _____________________________________
< TASK: common | install apt packages >
 -------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [10.76.71.167] => (item=htop,vim-tiny,curl,git,unzip,update-motd,ssh-askpass,gcc,python-dev,libxml2,libxml2-dev,libxslt-dev,python-lxml,python-pip)

stdout:
Reading package lists...
Building dependency tree...
Reading state information...
libxslt1-dev is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 24 not upgraded.


stderr:

start:
2015-03-27 17:12:22.132237

end:
2015-03-27 17:12:22.136859

1

Trợ giúp dòng lệnh rõ ràng, chẳng hạn như ansible-playbook --helpchỉ ra cách tăng độ dài đầu ra bằng cách đặt chế độ tiết (-v) thành độ dài hơn (-vvv) hoặc độ dài gỡ lỗi kết nối (-vvvv). Điều này sẽ cung cấp cho bạn một số chi tiết bạn đang theo dõi trong stdout, sau đó bạn có thể ghi lại.

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.