我想知道在执行模块时是否有办法打印信息 - 主要是为了证明流程正在运行但尚未挂起。具体来说,我试图在执行 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 - 我可能做错了。
有人能说清楚这种情况吗?同样,对于需要一段时间的大型云形成任务,我想要定期指示任务仍在运行,而不是挂起。我很感激帮助!
答案 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