사용 가능한 명령의 stdout을 보는 방법은 무엇입니까?


165

사용 가능한 플레이 북 명령에 대한 stdout을 어떻게 볼 수 있습니까? -v는 개별 명령이 아닌 출력 만 표시합니다. 이 작업을 즉시 수행하는 방법을 알아낼 수 있다면 좋을 것이므로 무언가가 실패하거나 중단되면 이유를 알 수 있습니다.

예 :

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

인쇄 할 것이다

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

hello


답변:


165

결과를 변수에 등록 한 다음 디버그로 인쇄 할 수 있다고 생각합니다.

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

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

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

26
또한을 사용하여 변수를 직접 디버깅 할 수 있습니다 - debug: var=hello. 때때로 이것은 다중 라인 출력 또는 Ansible 모듈 출력 ( command/ shell출력이 아닌)에 더 유용합니다 .
geerlingguy

4
이것을 사용하여 Java 출력을 얻는 데 문제가있었습니다. 수정 사항은 모든 Java 출력을 표준 출력으로 리디렉션하는 것입니다.shell: java -version 2>&1
Matthias Braun

20
그것은 훨씬 더 좋지 않지만 명령이 성공적으로 완료된 후에 만 stdout 메시지를받습니다 . ansible이 멈추는 것처럼 보이는 문제가있었습니다. 그 이유는 rsync 명령에 잘못된 사용자 이름을 사용했기 때문에 대화 형 암호 요청을 스풀링하여 방금 중단했습니다. 디버깅하기가 매우 어려웠지만 stdout을 실시간으로 볼 수 있다면 내가 잘못한 것을 즉시 깨달았을 것입니다. 가능하면이 기능을 좋아합니다.
Michael B

10
이것이 작동하는 동안 디버깅이 정말로 어려워집니다. 첫 번째 작업이 끝나지 않는다고 상상해보십시오 (어쩌면 사용자 입력을 어리석게 기다리고 있습니다) ... 사용자는 알지 못할 것입니다! 또한 register모듈 또는 모듈이 무엇이든 변수 stdout또는 stderr변수가 설정된 객체를 생성하지 않습니다 . 따라서 기본적으로 출력을 얻지 못하는 것은 정말 나쁩니다.
vlad-ardelean

96

stdout 대신 stdout_lines 사용하는 것이 좋습니다 . 여러 줄 출력의 경우 훨씬 낫습니다. 예 :

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

    - debug: var=out.stdout_lines

준다

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

디버깅 목적의 실시간 출력과 관련하여 이것이 불가능하고 구현되지 않는 이유를 논의 하는 비공개 버그 보고서 https://github.com/ansible/ansible/issues/3887#issuecomment-54672569 가 있습니다.


16
"실시간 출력"버그 연결을위한 +1
ntc2

out.stdout_lines (Ansible 메일 작업의 본문으로)를 보내려면 이메일을받을 때 이와 같이 보이지 않도록 어떻게 보낼 수 있습니까? [u'total 61 ', u'lrwxrwxrwx 1 루트 루트 2015 년 2 월 15 일 bin-> usr / bin', u'drwxr-xr-x 6 루트 루트 1024 8 월 24 일 22:08 부팅 ', u'.... . '] 터미널에서 볼 수 있듯이 이렇게 보이기를 원합니다
Chris F

치명적 : [127.0.0.1] : 실패했습니다! => { "reason": "YAML을로드하는 동안 구문 오류가 발생했습니다. \ n <document start>을 (를) 찾을 수 없습니다. \ n \ n 오류가있는 것 같습니다 ... 구문 문제입니다. \ n \ n 가장 나쁜 행은 다음과 같습니다. \ n \ n \ n- 이름 : ls.sh를 실행하고 \ "ls / \"\ n ^ here \ n "} 출력
Nate

20

나는 사용하여 발견 최소한의를 stdout_callback 임시 ansible를 사용하여 유사한 출력을 준 ansible - 각본으로.

ansible.cfg에서 (OS X에 있으므로 callback_plugins설치에 맞게 경로를 수정하십시오 )

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

이와 같은 작업은

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

ad-hoc 명령처럼 다음과 같은 출력을 제공합니다.

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

ansible-playbook 2.2.1.0을 사용하고 있습니다.


멋진 콜백 플러그인, 간단한 후 처리는 표준 출력 만 추출 할 수 있습니다.
RichVel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.