语境
我有一个 Ansible 剧本,其中包含一项非常长的任务,长达一小时。
非常简单,它看起来像:
- hosts: localhost
tasks:
- name: Short task
debug:
msg: "I'm quick!"
- name: Long task
shell: "sleep 15s"
当用户运行剧本时,首先输出的是:
PLAY [localhost] ********************
TASK [Gathering Facts] **************
ok: [127.0.0.1]
TASK [Short task] *******************
ok: [127.0.0.1] => {
"msg": "I'm quick!"
}
(hang there until Long task is done)
TASK [Long task] ********************
changed: [127.0.0.1]
问题
Short task
剧本的最终用户认为,由于它挂在那里,所以存在问题,而Long task
这才是导致延迟的原因。
问题
我如何配置 ansible 或剧本来打印在name:
前执行任务?
我想要实现的输出如下:
PLAY [localhost] ********************
TASK [Gathering Facts] **************
ok: [127.0.0.1]
TASK [Short task] *******************
ok: [127.0.0.1] => {
"msg": "I'm quick!"
}
TASK [Long task] ********************
(and hang there during the execution)
changed: [127.0.0.1]
答案1
根据 OP 的要求将我的评论迁移到答案
我正在使用 Ansible 2.9.2。
我尝试了不使用配置文件和未声明 (default) 值的配置文件stdout_callback
。无论哪种情况,我都无法重现您的问题。
这是我的测试剧本:
---
- hosts: localhost
gather_facts: false
tasks:
- name: Short running
debug:
msg: I'm a short task
- name: LOOOOOOOOOng task
shell: sleep 2000
以及结果(两种情况。注意:任务头显示后用户中断)
$ ansible-playbook /tmp/play.yml
PLAY [localhost] **************************************************************************************************************************************************************************************************
TASK [Short running] **********************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "I'm a short task"
}
TASK [LOOOOOOOOOng task] ******************************************************************************************************************************************************************************************
^C [ERROR]: User interrupted execution
ansible-playbook --version
仔细检查您要在要启动剧本的目录中加载哪个配置文件。我还建议您尝试不使用任何配置文件,看看它是否能解决您的问题(然后查看哪个设置实际上导致了问题)。
从 OP 的评论中添加:事实证明,在这种特定情况下,ansible.cfg 中的问题设置是display_skipped_hosts=False
答案2
/etc/ansible/ansible.cfg 中的代码display_skipped_hosts=false
帮我修复了这个问题。
这是错误吗?我不喜欢看到跳过的主机,但喜欢看到我的剧本的进度。
使用 Ansible 2.10.3
答案3
对于那些仍然想隐藏跳过的任务的人,现在有两个选择:
- 使用默认回调插件并设置
display_skipped_hosts = False
和show_per_host_start = True
,这将在每个任务启动时添加另一行日志,但是它并没有完全恢复仅及时输出标题的行为(并且有时在任务完成后也会出现,因此使事情更难阅读) - 继续使用(现已弃用)skippy 插件在默认插件获得跳过功能之前,这是首选插件。它在 2.11 中仍按预期工作,也是我对此的首选修复。
stdout_callback = skippy
在您的 ansible.cfg 中设置。为了确保我还将插件列入白名单,callback_enabled = ansible.posix.skippy
我的 ansible.cfg 现在看起来像这样,并且一切工作正常,我使用默认值迁移到最新的 ansible.cfg :
[default]
# ...
stdout_callback = skippy
# if you had other plugins here just add to list, comma seperated
callback_enabled = ansible.posix.skippy
# deprecated flag, sometimes still needed, hence I always set both
callback_whitelist = ansible.posix.skippy
# ...
进一步阅读:
- 有关该问题的票:https://github.com/ansible/ansible/issues/51042
- 将功能引入默认插件以添加启动任务输出的 PRhttps://github.com/ansible/ansible/pull/53819
- 默认插件的最新文档https://docs.ansible.com/ansible/latest/collections/ansible/builtin/default_callback.html
- skippy 插件的最新文档https://docs.ansible.com/ansible/latest/collections/ansible/posix/skippy_callback.html
- 如何设置回调插件https://docs.ansible.com/ansible/latest/plugins/callback.html
答案4
就我而言,我使用的是“免费”策略,在完成任务之前不会显示标题。