2014-09-18 1 views
14

모듈이 실행되는 동안 정보를 인쇄하는 방법이 있는지 알고 싶습니다. 주로 프로세스가 작동하고 중단되지 않았 음을 입증하는 수단으로 사용합니다. 특히 cloudfrom 모듈을 실행하는 동안 피드백을 얻으려고합니다. 나는 다음과 같은 포함하도록 (파이썬) 소스 코드를 수정 시도 :가능 - 모듈 실행 중 정보를 인쇄 할 수 있습니까?

def debug(msg): 
    print json.dumps({ 
     "DEBUG" : msg 
    }) 

... 

debug("The stack operation is still working...") 

것은이 무슨 짓을 물론, 저장, 모든이 출력을했다 만 모듈 실행이 완료 한 모든 후 인쇄 할 수 있습니다. 따라서 특히 큰 구름 형성 템플릿의 경우, 이것은 5 분 정도 기다린 다음 갑자기 많은 양의 텍스트가 화면 끝에 나타남을 의미합니다. 내가 기대했던 것은 "스택 작업이 여전히 작동 중입니다 ..."라는 메시지가 매 x 초마다 출력된다는 것입니다.

Asynchronous Actions and Polling이 내가 찾고있는 것 같습니다 ...하지만이 역시 작동하지 않았습니다. "{{stackname}}의 CloudFormation 시작"작업은 모두 건너 뜁니다. 내 플레이 북에서 관련 (YAML) 조각은 아래를 참조하십시오 :

- name: Launch CloudFormation for {{ stackname }} 
     cloudformation: > 
     stack_name="{{ stackname }}" state=present 
     region="{{ region }}" disable_rollback=true 
     template="{{ template }}" 
     register: cloud 
     args: 
     template_parameters: 
      KeyName: "{{ keyName }}" 
      Region: "{{ region }}" 
      SecurityGroup: "{{ securityGroup }}" 
      BootStrapper: "{{ bootStrapper }}" 
      BootStrapCommand: "powershell.exe -executionpolicy unrestricted -File C:\\{{ bootStrapper }} {{ region }}" 
      S3Bucket: "{{ s3Bucket }}" 
     async: 3600 
     poll: 30 

을이 그 비동기은 cloudformation 같은 복잡한 모듈을 전형적인 쉘 명령에 대한 의미되지 않으며, 나에게 말한다. 또는 - 내가 잘못했을 수 있습니다.

누구나이 상황을 밝힐 수 있습니까? 다시 한 번 말씀 드리지만, 시간이 많이 걸리는 대형 클라우드 정보 작업의 경우 작업이 아직 실행 중이며 정지하지 않았 음을 나타내는주기적인 표시를 원합니다. 도움에 감사드립니다!

답변

6

대답은 간단합니다. 많은 서버에서 실행되는 기능을 처리하고 실시간 stdout 결과를 표시하는 것을 목표로하는 연속 시스템은 매우 불편할 수 있습니다.

그러나 대상 시스템이 백그라운드에서 실행을 지원할 수 있으면 몇 가지 트릭을 사용할 수 있다고 생각합니다. 당신은 그 표준 출력의 변화를 볼 수 있습니다 당신은 ansible-playbook -vv background.yml 으로이 작전을 실행할 수 있습니다 나는 시스템이 창 것을 볼, 그래서 당신은

아래의 예에서 배경을 실행하는 능력 "잠 20 &"와 같은 명령을 위해에 Cygwin에서 설치해야 . echo Test---- >> /tmp/test && tail /tmp/test은 데모 명령입니다. 일부 파일에 데이터를 출력하고 진행 상황을 볼 수있는 기능을 제공해야합니다. 또는 stdout 파일의 파일 크기를보고 표시 할 수 있습니다. 사용 상상)))

# @file background.yml 

- hosts: 127.0.0.1 
    connection: local 
    gather_facts: no 

    tasks: 
    - name: Background operation 
    shell: "sleep 20 & \ PPID=$! \ echo $PPID" 
    register: bcktsk 

    - name: Check PPID 
    shell: "kill -0 {{ bcktsk.stdout | int + 2 }}" 
    register: checkppid 
    ignore_errors: true 

    - name: Check if process still active 
    shell: "echo Test---- >> /tmp/test && tail /tmp/test && kill -0 {{ bcktsk.stdout | int + 2 }}" 
    register: test 
    when: checkppid.rc == 0 
    until: test.rc ==1 
    delay: 2 
    retries: 10000 
    ignore_errors: true 
+1

감사합니다. 나는 적어도 30 초 간격으로 간단한 "작업이 아직 작동 중입니다 ..."라고보고하기 위해 이와 같은 작업을 수행 할 수 있습니다. Anabilities가 진정한 비동기 프로세스를 아직 지원하지 않는 것은 부끄러운 일입니다. – Brian

+1

실제로 이것은 CloudFormation 모듈에서는 작동하지 않습니다. 다시 말하지만 단순한 쉘 명령 만 비동기 적으로 (또는 백그라운드 프로세스로) 실행할 수 있습니다. ** 따라서 응답은 여전히 ​​구체적입니다 **. – Brian

0

이이 주위에 방법이며, 실시간 출력을 표시 할 것이다, 그러나 당신은 각 라인에 주입 접두사를 처리해야합니다. 그것은/지저분한 hackish입니다 그러나 디버깅/모니터링 목적을 위해이 일을 가져옵니다

- name: Run some command and echo it's realtime stdout 
    shell: ":" 
    with_lines: "/usr/bin/some_long_running_command with arguments and such here" 

명령 :는 쉽게인지 단지 무 조작, 당신은 쉽게 command: /usr/bin/true를 사용할 수 있습니다.어떤 경우에는, 유사이 출력됩니다 라인 : 로컬 호스트 모듈에 대한

changed: [localhost] => (item=first output line) 
changed: [localhost] => (item=second output line) 
changed: [localhost] => (item=third output line) 
1

내 방식 :

다른 창에 다음
... 
module.log(msg='test!!!!!!!!!!!!!!!!!') 
... 

:

$ tail -f /var/log/messages 

Nov 29 22:32:44 nfvi-ansible-xxxx python2: ansible-test-module test!!!!!!!!!!!!!!!!! 
관련 문제