작업 출력을 파일에 어떻게 기록합니까?


10

가능한 작업 중 하나가을 사용하여 Oracle 데이터베이스를 가져옵니다 impdp.

이것은 콘솔에 많은 출력을 생성 하므로 설정했습니다 no_log: True.

그러나 이것이 실패하면 로그를보고 싶습니다!

이 특정 작업 로그를 콘솔이 아닌 파일에 어떻게 만들 수 있습니까?


명령 모듈을 사용하고 있습니까?
Xiong Chiamiov 2018 년

[해킹의 더 많은] 아이디어 중 하나는 외부 파일에 로그를 기록한 다음 failed_when조건 을 사용하는 작업을 수행 하고 로그 파일을 제거하는 것입니다. 작업이 성공적으로 :)
Dawny33

어쨌든 성공적인 실행 중에 콘솔 출력을 볼 수있는 이유는 무엇입니까? 작업을 성공적으로 실행하는 동안 stdout을 표시 할 수있는 구성을 보거나 구성 할 수 없다고 생각했습니다. [ok : host name]. 그러나 오류가 감지되면 출력을 사용 가능한 제어 콘솔 (및 정의 된 사용 가능한 로그)로 덤프합니다. 정기적으로 성공적으로 실행하는 동안 큰 stdout을 제공하는 구성을 공유 하시겠습니까?
hvindin 2016 년

@hvindin 자세한 로그를 얻기위한 명령 -vvv뒤에 넣습니다 ansible-playbook.
Dawny33

1
변수를 등록하는 것이 가장 논리적으로 움직이는 것처럼 보입니다. 가능한 트리거 명령의 출력으로 수행 할 작업에 대한 의견은 내 의견을 참조하십시오.
hvindin

답변:


4

[댓글을 답변으로 변환]

이를 수행하는 한 가지 방법은 외부 파일에 로그를 기록한 다음 failed_when 조건을 사용하는 작업을 수행하고 이전 작업이 성공한 경우 로그 파일을 제거하는 것입니다.

이와 같은 것이 도움이 될 것입니다.

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

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

참고 : 이것이 문제를 처리하는 가장 좋은 방법은 아닙니다. 그러나 이것은 내 로깅 및 모니터링을 수행하는 데 도움이되는 해킹이었습니다.


2
한 가지 더 나아가서 명령을 stdout / stderr에 작성하고 실패에 대한 응답으로 덤프 할 수 있다고 말합니다. 따라서 위의 예제에서 예로 실패가 발생했을 때 실행을 중단하려면 실패 작업을 사용하여 rc! = 0이 더 전체적인 솔루션으로 보일 때 PyScript에 등록 된 stdout 및 stderr을 출력하십시오. ansibles 내장 메커니즘을 사용하는 경우 예를 들어 제어 서버에 ansible logging이 설정되어 있으면 해당 제어 서버는 ansible log에 실패를 기록합니다. 어느 나는 그것을위한 올바른 장소가 될 것이라고 생각
hvindin

3

필요한 모든 명령의 출력을 등록하고 (변수에 저장) 변수를 파일에 덤프하면됩니다. 그렇게하면 나중에 검토 할 수 있습니다.

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

그런 다음 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 }} 

내가 사용하는 예는 여기에서


3

나는 이것을 추가하여 이것을 해결했다.

ignore_errors: true
register: results

no_log-task에. 이렇게하면 작업이 실패하더라도 다음 작업을 계속 진행할 수 있습니다. 그런 다음 다음 태스크의 경우 디버그 태스크를 정의하십시오. 디버그 태스크는 항상 실패하고 등록 된 변수를 출력하지만 이전 태스크가 실패한 경우에만 실행됩니다.

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

따라서 no_log : true로도 실패한 작업의 출력을 표시 할 수 있습니다. 이 솔루션은 요청에 따라 파일에 파일을 로깅하지 않지만 '실패한 경우 로그를 볼'필요를 fullfils합니다. 물론 티를 리디렉션하거나 사용하여 전체 가능한 출력을 파일로 출력 할 수 있습니다. 실패한 작업의 로그도 포함합니다.


2

실행할 명령이 있고 실패한 경우에만 로그를 얻으려고 할 때 수행하는 작업은 다음과 같습니다 ( /bin/sh -c '...'이니시에이터가 system호출을 사용하지 않거나 쉘없이 직접 명령을 실행 하지 않는 경우 와 같이 쉘 명령으로 접두어 붙음 ) :

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

이렇게하면 오류 및 표준 출력이 파일로 리디렉션되고 오류 발생시에만 파일 내용이 표시됩니다. 명령이 매우 상세하고 로그가 정상일 때 로그를 유지하지 않으려면 다음을 수행하십시오.

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

sh 맨 페이지의 인용 &&||사용법 :

&& (||) 기호는 선행 파이프 라인이 0이 아닌 값을 리턴하는 경우에만 다음리스트가 실행되도록합니다.

그것은 아마도 관용으로 가장 관용적 인 방법은 아니지만 명령 구성을 표시하는 기능을 제공하는 모든 구성 관리 시스템으로 이식성이 뛰어나다는 이점이 있습니다.


0

ansible이 stderr에 오류를 올바르게 던진다 고 가정하면 출력 리디렉션을 사용하여 모든 프로그램의 오류 출력을 파일로 캡처 할 수 있습니다.

some command 2> error.log

그러나 나는 이것이 사실이라고 생각하지 않습니다.

대신이 가이드를 참조하여 오류 발생시기 ( http://docs.ansible.com/ansible/playbooks_error_handling.html) 를 결정한 다음 파일로 출력하기 전에 오류를 나타내는 문자열을 출력하도록 설정하십시오.

즉.

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


-2

나는 당신이 찾고있는 것이 너무 간단하게 stdout과 거리를 파일로 리디렉션 할 수 있다고 생각합니다.

일반적으로 일부 명령 &> logfile.log

또는 일부 변형 ....


부분 답변 인 OP는 오류가 발생하면 로그를보고 싶습니다.
Tensibai 2016 년

나는 이것이이 질문에 대한 부분적인 대답조차 아닙니다. 쉘 스크립트에는 적합하지만 ansible 로 코딩하는 데는 쓸모가 없습니다 .
병아리

@chicks 나는 (내가 많이 모르는) ansible 내에서 '쉘'방식의 접근 방식에 대한 올바른 해결 방법이 될 수 있다고 생각
Tensibai

-2

Tee는 로깅을위한 매우 간단한 도구입니다. 다음 명령을 참조하십시오.

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. 이것은 하나의 작업이 아니라 전체 실행에 영향을줍니다. 2. 표준 출력을 파일로 재 지정할 경우 티를 통한 배관은 중요하지 않습니다. 그것은 당신이 명령을 사용하는 방법이 아닙니다. 3. 티를 올바르게 사용했다면 여전히 모든 스팸을 콘솔에 출력하지만 OP는 원하지 않습니다.
Xiong Chiamiov 2018 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.