2014-09-18 48 views
14

我想知道在模块执行时是否有办法打印信息 - 主要是作为证明过程正在运行并且没有挂起的手段。具体来说,我试图在执行cloudformation模块期间得到反馈。我试图修改(Python)的源代码,包括以下内容:Ansible - 我可以在模块执行期间打印信息吗?

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 

这告诉我,异步是为典型的shell命令,而不是复杂的模块,如cloudformation。 - 我可能做错了什么。

任何人都可以对这种情况有所了解吗?再次,对于需要一段时间的大型云计算任务,我希望定期指示任务仍在运行,而不是挂起。我感谢帮助!

回答

6

答案很简单 - 没有。 Ansible是一个连续系统,旨在处理在一堆服务器上运行的能力,并显示实时标准输出结果可能非常不方便。

但我想你可以使用一些技巧,如果你的目标系统可以支持在后台执行。我看你的系统是windows,所以你必须在例如安装cygwin到它运行后台能力命令,如“睡眠20 &”的

您可以ansible-playbook -vv background.yml 运行这个剧本可以看出,标准输出变化。 echo Test---- >> /tmp/test && tail /tmp/test是一个演示命令。您应该将数据输出到某个文件并将其拖尾以查看进度。或者您可以查看标准输出文件的文件大小并显示它。使用想象力)))

# @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秒的间隔报告一个简单的提示“操作仍在进行......”。 Ansible并不支持真正的异步过程,这真是一种遗憾。 – Brian 2014-09-18 20:04:10

+1

虽然在实践中,这似乎不适用于CloudFormation模块。同样,看起来只有简单的shell命令可以异步执行(或作为后台进程)。**所以答案仍然是一个具体的NO。** – Brian 2014-09-19 14:55:42

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!!!!!!!!!!!!!!!!! 
相关问题