ansible-playbook 모듈 실행에 대한 로그 / 세부 정보를 얻으려면 어떻게해야합니까?


95

다음을 실행한다고 가정하십시오.

$ 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

$

나는 그것이 성공적 이었음을 확신합니다.

원격 호스트 (MyTestHost)에서 내 스크립트에 의해 "Hello World"가 에코 / 인쇄 된 위치 / 방법은 무엇입니까? 아니면 스크립트의 반환 / 종료 코드?

내 연구에 따르면 모듈 실행 콜백 또는 해당 라인에서 무언가를 가로 채고 로그 파일을 작성하는 플러그인을 작성할 수 있습니다. 나는 그것으로 내 시간을 낭비하지 않는 것을 선호합니다.

예를 들어 아래의 stdout과 같은 것입니다 (나는 ansible-playbook이 아닌 ansible을 실행하고 있음에 유의하십시오) :

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

$

답변:


113

-v명령 줄에서 ansible-playbook에 플래그를 전달하면 실행 된 각 작업에 대한 stdout 및 stderr가 표시됩니다.

$ ansible-playbook -v playbook.yaml

Ansible은 로깅에 대한 기본 지원도 제공합니다. ansible 구성 파일에 다음 줄을 추가 합니다 .

[defaults] 
log_path=/path/to/logfile

Ansible은 여러 위치에서 구성 파일을 찾습니다.

  • ansible.cfg 실행 한 현재 디렉토리 ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg

8
감사. 욕심쟁이 : 플레이 북에서 동적으로 로깅을 시작 / 중지 할 수 있습니까? 같은 set -xset +x쉘 스크립트입니다.
Kashyap 2013 년

@thekashyap 나는 이것이 현재 가능하다고 생각하지 않습니다.
Lorin Hochstein 2013 년

9
no_log: True플래그를 사용하여 명령이나 플레이 북이 로깅되는 것을 방지 할 수 있지만 그것은 제가 생각하는만큼 세밀합니다.
Ade Miller

4
모든 실행이 다른 파일 (파일에 포함 된 명령 / 플레이 북 포함) logrotatelog_path갖도록 어떻게 입력해야하는지 설명해 주 ansible시겠습니까?
스티로폼 플라이

vstdout과 stderr을 얻기 위해 3
rich

24

플레이 북 스크립트 작업은 플레이 북 stdout이 아닌 명령처럼 생성 되며,을 사용하여 변수에 저장하기 만하면됩니다 register. 이 정보를 얻으면 디버그 모듈 이 플레이 북 출력 스트림에 인쇄 할 수 있습니다.

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 }}`."

출력은 다음과 같아야합니다.

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`."
}

하지만 안녕 자신의 작업은 표준 출력을 부여하지 않은
Saurabh 찬드라 파텔에게

이것이 제가 선호하는 방법입니다. 디버그 문에서 등록 된 변수의 값을 잘 사용하면 세상이 당신의 굴입니다.
Joshua K

14

로그 파일을 생성하는 다른 방법도 있습니다.

실행하기 전에 ansible-playbook다음 명령을 실행하여 로깅을 활성화하십시오.

  • 로그 파일의 위치를 ​​지정하십시오.

    ANSIBLE_LOG_PATH = ~ / ansible.log 내보내기

  • 디버그 활성화

    export ANSIBLE_DEBUG = True

  • 생성 된 로그 파일을 확인합니다.

    $ ANSIBLE_LOG_PATH 이하


1
ANSIBLE_DEBUG는 로그 파일을 지정하는 것과는 별개입니다. 장황한 선택과는 별개입니다! 이것은 여전히 ​​호출하기에 매우 좋습니다. 디버그는 절대적으로 극도의 상세 수준에서 개발자 지향 디버그 메시지를 제공합니다. 주변에 있으면 좋습니다.
AlanSE

4

공식 플러그인

출력 콜백 플러그인을 사용할 수 있습니다 . 예를 들어 Ansible 2.4부터 디버그 출력 콜백 플러그인을 사용할 수 있습니다 .

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

(또는 export ANSIBLE_STDOUT_CALLBACK=debug플레이 북을 실행 하기 전에 실행)

중요 : 효과를 보려면 ( ) 옵션을 ansible-playbook사용하여 실행해야합니다 . set을 사용하면 이제 출력이 다음과 같이 표시됩니다.-v--verbosestdout_callback = debug

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

STDOUT:


Hello!



STDERR:

Shared connection to 192.168.1.2 closed.

debug출력 형식을 다르게 지정하려는 경우 모듈 외에 다른 모듈 이 있습니다. 있다 json, yaml, unixy, dense, minimal, 등 ( 전체 목록 ).

예를 들어를 사용 stdout_callback = yaml하면 출력은 다음과 같습니다.

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>

타사 플러그인

공식 플러그인 중 어느 것도 만족스럽지 않은 경우 플러그인을 사용해 볼 수 human_log있습니다. 몇 가지 버전이 있습니다.


3

콜백 플러그인을 사용하면 play : gist : human_log.py를 사용하여 읽을 수있는 형식으로 명령을 출력 할 수 있습니다 .

예제 출력 편집 :

 _____________________________________
< 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

Ansible 명령 줄 도움말 (예 : ansible-playbook --help상세 모드 (-v)을 상세 모드 (-vvv) 또는 연결 디버깅 상세 (-vvvv)로 설정하여 출력 상세도를 높이는 방법). 이렇게하면 stdout에서 원하는 세부 정보 중 일부를 얻을 수 있으며이를 기록 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.