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

时间:2014-09-18 16:39:43

标签: python ansible

我想知道在执行模块时是否有办法打印信息 - 主要是为了证明流程正在运行但尚未挂起。具体来说,我试图在执行 cloudformation 模块期间获得反馈。我尝试修改(Python)源代码以包含以下内容:

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

...

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

当然,这样做是存储所有这些输出,并且只在模块执行完毕后才打印出来。因此,对于特别大的云形态模板,这意味着我等待大约5分钟左右,然后突然看到屏幕上最后出现大量文本。我期待的是看到#34;堆栈操作仍然有效......"每隔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

这告诉我async适用于典型的shell命令,而不是复杂的模块,例如cloudformation。 OR - 我可能做错了。

有人能说清楚这种情况吗?同样,对于需要一段时间的大型云形成任务,我想要定期指示任务仍在运行,而不是挂起。我很感激帮助!

4 个答案:

答案 0 :(得分:6)

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

但我认为如果您的目标系统可以支持后台执行,您可以使用一些技巧。我看到你的系统是windows,所以你必须在它上面安装cygwin才能运行像“sleep 20&”这样的后台命令。在下面的例子中

您可以使用ansible-playbook -vv background.yml运行此剧本 你可以看到stdout正在改变。 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 :(得分:6)

我对localhost模块的方法:

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

然后在另一个窗口:

 $ tail -f /var/log/messages

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

答案 2 :(得分:2)

有一种解决方法,它会显示实时输出,但是你必须在每一行上处理注入的前缀。这是凌乱/黑客但是为了调试/监控目的,它可以完成工作:

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

答案 3 :(得分:0)

我使用以下命令在后台运行shell命令并打印输出(部分基于上述podarok的回答)。在background_shell_command变量中提供要执行的命令,并作为剧本或使用include_tasks运行:

---

- name: Run shell command in background
  shell: "({{ background_shell_command }}>/tmp/background_task_output 2>&1; echo $? > /tmp/background_task_return_code) & echo $!"
  register: background_task

- name: check if background task has finished
  debug:
    var: "lookup('pipe','tr \"\\r\" \"\\n\"</tmp/background_task_output | tail -1')"
  retries: 10000000
  delay: 1
  until: "{{ lookup('pipe','ps -p {{ background_task.stdout | int }} >>/dev/null 2>&1 && echo false || echo true') }}"

- name: check return value of background task
  shell: "cat /tmp/background_task_return_code"
  register: background_task_exit_code

- name: fail if background task has failed
  fail:
    msg: "Error: the background command '{{ background_shell_command }}' has failed with return code {{ background_task_exit_code.stdout | int }}"
  when: background_task_exit_code.stdout | int != 0