我可以在模块执行期间打印信息吗?

2024-05-07 18:28:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有一种方法可以在模块执行时打印信息——主要是为了证明进程正在工作并且没有挂起。具体来说,我试图在执行cloudformation模块期间获得反馈。我尝试修改(Python)源代码以包括以下内容:

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

...

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

当然,这样做的目的是存储所有这些输出,并且只在模块完成执行后打印所有输出。所以对于特别大的cloudformation模板,这意味着我要等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。——我可能做错了什么。

有人能解释一下这种情况吗?同样,对于需要一段时间的大型cloudformation任务,我希望得到一些周期性的指示,表明该任务仍在运行,而不是挂起。我很感激你的帮助!


Tags: 模块方法namedebug证明源代码进程stack
3条回答

答案很简单-不。 Ansible是一个连续的系统,它的目标是处理在一堆服务器上运行并显示实时stdout结果的能力可能非常不可靠。

但我认为如果目标系统能够支持后台执行,那么您可以使用一些技巧。我看到您的系统是windows,因此您必须在其上安装cygwin,以便在下面的示例中运行诸如“sleep 20&;”之类的后台命令

你可以用ansible-playbook -vv background.yml运行这个剧本 你可以看到标准输出在改变。 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

我的本地主机模块方法:

...
module.log(msg='test!!!!!!!!!!!!!!!!!')
...

然后在另一个窗口上:

 $ tail -f /var/log/messages

 Nov 29 22:32:44 nfvi-ansible-xxxx python2: ansible-test-module test!!!!!!!!!!!!!!!!!

有一种方法可以解决这个问题,它将显示实时输出,但是您必须在每一行处理注入的前缀。这很混乱/有点黑,但为了调试/监视的目的,它完成了工作:

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

命令:只是一个noop,如果更简单的话,您可以轻松地使用command: /usr/bin/true。在任何情况下,这将输出类似于:

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

相关问题 更多 >