Làm thế nào để tôi đăng nhập đầu ra tác vụ vào một tập tin?


9

Một trong những nhiệm vụ vô hình của tôi nhập cơ sở dữ liệu Oracle bằng cách sử dụng impdp.

Điều này tạo ra rất nhiều đầu ra cho giao diện điều khiển vì vậy tôi đã thiết lập no_log: True.

Tuy nhiên, khi điều này không thành công tôi muốn xem nhật ký!

Làm thế nào tôi có thể thực hiện tác vụ cụ thể này đăng nhập vào một tệp và không vào bảng điều khiển?


Bạn đang sử dụng mô-đun lệnh?
Tẩy chay SE cho Monica Cellio

Một ý tưởng [thêm về hack] sẽ là ghi nhật ký vào một số tệp bên ngoài, và sau đó có một nhiệm vụ sau khi sử dụng failed_whenđiều kiện và xóa tệp nhật ký, nếu trước đó. nhiệm vụ đã thành công :)
Dawny33

Tại sao bạn có thể thấy đầu ra giao diện điều khiển trong khi chạy thành công? Tôi chưa thấy cấu hình, tôi cũng không nghĩ là có thể, hiển thị thiết bị xuất chuẩn trong khi thực thi tác vụ thành công, nó sẽ xuất hiện [ok: tên máy chủ]. Tuy nhiên, khi phát hiện ra lỗi, đầu ra sẽ bị chuyển sang bảng điều khiển ansible (và bất kỳ nhật ký khả thi nào được xác định) bạn có muốn chia sẻ cấu hình mang lại cho bạn thiết bị xuất chuẩn lớn trong quá trình chạy thành công thường xuyên không?
hvindin

@hvindin Nhập vào -vvvsau ansible-playbooklệnh để nhận nhật ký chi tiết.
Dawny33

1
Đăng ký một biến có vẻ là động thái hợp lý nhất, hãy xem nhận xét của tôi về câu trả lời của bạn để biết ý kiến ​​của tôi về những việc cần làm với đầu ra từ các lệnh được kích hoạt ansible.
hvindin

Câu trả lời:


4

[Chuyển đổi nhận xét của tôi thành câu trả lời]

Một cách để làm điều đó là ghi nhật ký vào một số tệp bên ngoài và sau đó có một tác vụ sau đó sử dụng điều kiện fail_when và xóa tệp nhật ký, nếu tác vụ trước đó thành công.

Một cái gì đó như thế này sẽ giúp bạn.

 - name: Run Py script
      command: <>.py  > <>.log
      become: yes
      register: PyScript
      ignore_errors: True

    - name: PyScript on success
      command: rm <>.log
      when: PyScript|succeeded

Lưu ý: Đây có thể không phải là cách tốt nhất để xử lý vấn đề của bạn. Nhưng, đây là một bản hack giúp tôi thực hiện đăng nhập và theo dõi.


2
Tôi sẽ đi xa hơn và nói rằng bạn có thể giữ lệnh viết của mình thành stdout / stderr sau đó chỉ cần loại bỏ chúng như một phản ứng với một thất bại. Vì vậy, như một ví dụ trong ví dụ trên của bạn nếu bạn muốn tạm dừng thực thi trong trường hợp thất bại thì sử dụng tác vụ thất bại để chỉ xuất ra thiết bị xuất chuẩn và thiết bị xuất chuẩn được đăng ký trong PyScript khi RC! = 0 có vẻ là một giải pháp tổng thể hơn. Nếu bạn sử dụng các cơ chế sẵn có của ansibles thì nếu bạn có ghi nhật ký ansible được thiết lập trên máy chủ điều khiển, thì máy chủ điều khiển đó sẽ ghi lại lỗi trong nhật ký ansible. Mà tôi nghĩ sẽ là nơi chính xác cho nó
hvindin

3

Tôi nghĩ rằng tất cả những gì bạn cần làm là đăng ký đầu ra của mỗi lệnh bạn cần (lưu trữ nó trong một biến) và sau đó chỉ cần kết xuất biến trong một tệp. Bằng cách đó bạn có thể xem lại nó sau.

tasks:
  - name: Dump all vars
    action: template src=templates/dumpall.j2 dest=/tmp/ansible.all

Sau đó, trong dumpall.j2:

Module Variables ("vars"):
--------------------------------
{{ vars | to_nice_json }} 

Environment Variables ("environment"):
--------------------------------
{{ environment | to_nice_json }} 

GROUP NAMES Variables ("group_names"):
--------------------------------
{{ group_names | to_nice_json }}

GROUPS Variables ("groups"):
--------------------------------
{{ groups | to_nice_json }}

HOST Variables ("hostvars"):
--------------------------------
{{ hostvars | to_nice_json }} 

Ví dụ tôi đang sử dụng là từ đây


3

Tôi đã giải quyết điều này bằng cách thêm

ignore_errors: true
register: results

đến nhiệm vụ no_log. Điều này làm cho ansible tiếp tục nhiệm vụ tiếp theo, ngay cả khi nhiệm vụ thất bại. Sau đó, đối với tác vụ tiếp theo, hãy xác định một tác vụ gỡ lỗi, luôn luôn thất bại và xuất ra biến đã đăng ký, nhưng chỉ chạy khi tác vụ trước không thành công:

- name: Error output
  debug:
     var: results
  failed_when: true
  when:
     results is failed

Vì vậy, ngay cả với no_log: true, điều này sẽ giúp hiển thị đầu ra của tác vụ thất bại. Giải pháp này không ghi nhật ký vào tệp theo yêu cầu nhưng đáp ứng đầy đủ nhu cầu của bạn để 'xem nhật ký khi thất bại', và tất nhiên, bạn có thể chuyển hướng hoặc sử dụng tee để xuất toàn bộ đầu ra ansable thành một tệp, với giải pháp này cũng chứa nhật ký của nhiệm vụ thất bại.


2

Tôi sẽ làm gì khi tôi có lệnh thực thi và chỉ muốn nhận nhật ký trong trường hợp không thành công như sau (tiền tố của shell comamnd như /bin/sh -c '...'trong trường hợp bộ khởi tạo không sử dụng systemlệnh gọi hoặc thực thi lệnh trực tiếp mà không có shell) :

command 2&>1 > command-log.txt || cat command-log.txt

Điều này sẽ chuyển hướng lỗi và đầu ra tiêu chuẩn sang một tệp và chỉ hiển thị nội dung của tệp trong trường hợp không thành công. Nếu lệnh rất dài dòng và bạn không muốn giữ nhật ký khi nó ổn, bạn có thể đi với:

command 2&>1 > command-log.txt && rm command-log.txt || cat command-log.txt

Trích dẫn &&||sử dụng từ sh manpage :

Biểu tượng && (||) làm cho danh sách sau chỉ được thực thi nếu đường ống trước trả về giá trị 0 (khác không).

Đó có lẽ không phải là cách thành ngữ nhất để làm điều đó với ansible nhưng có ưu điểm là rất dễ mang theo với bất kỳ hệ thống quản lý cấu hình nào cho khả năng hiển thị stdout lệnh.


0

Giả sử ansible đúng cách ném lỗi vào thiết bị lỗi chuẩn, bạn có thể nắm bắt đầu ra lỗi trong bất kỳ chương trình nào vào một tệp bằng cách sử dụng chuyển hướng đầu ra:

some command 2> error.log

Tuy nhiên tôi không nghĩ đây là trường hợp.

Thay vào đó, bạn có thể muốn tham khảo hướng dẫn này để quyết định khi nào lỗi sẽ xảy ra http://docs.ansible.com/ansible/playbooks_error_handling.html và sau đó grep đầu ra của bạn cho các chuỗi chỉ ra lỗi trước khi xuất ra tệp

I E.

ansible-playbook my-playbook | grep 'error' > error.log


-2

Tôi nghĩ rằng những gì bạn đang tìm kiếm có thể quá đơn giản là chuyển hướng thiết bị xuất chuẩn và đường phố để tập tin.

Thông thường, một số lệnh &> logfile.log

hoặc một số biến thể ....


Đó chỉ là một câu trả lời một phần, OP muốn xem nhật ký trong trường hợp nếu có lỗi.
Tensibai

Tôi không đây thậm chí là một câu trả lời một phần cho câu hỏi này. Nó là tốt cho một kịch bản shell, nhưng vô dụng để mã hóa trong ansible .
gà con

@chicks Tôi nghĩ rằng nó có thể là một cách giải quyết hợp lệ đối với phương pháp tiếp cận 'vỏ' trong phạm vi khả thi (mà tôi không biết nhiều)
Tensibai

-2

Tee sẽ là một công cụ rất đơn giản để đăng nhập, bạn có thể tham khảo lệnh sau.

eric@eric-MacBookPro:~$ ansible -m ping all | tee > /tmp/ansible.log
eric@eric-MacBookPro:~$ cat /tmp/ansible.log 
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

2
1. Điều này ảnh hưởng đến toàn bộ hoạt động, không chỉ một nhiệm vụ. 2. Không có điểm nào để chuyển qua tee nếu bạn sẽ chuyển hướng thiết bị xuất chuẩn của nó sang một tệp; đó không phải là cách bạn sử dụng lệnh. 3. Nếu bạn đang sử dụng tee đúng cách, nó vẫn sẽ xuất tất cả thư rác đến bảng điều khiển mà OP không muốn.
Tẩy chay SE cho Monica Cellio
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.