语境

语境

语境

我有一个 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

对于那些仍然想隐藏跳过的任务的人,现在有两个选择:

  1. 使用默认回调插件并设置display_skipped_hosts = Falseshow_per_host_start = True,这将在每个任务启动时添加另一行日志,但是它并没有完全恢复仅及时输出标题的行为(并且有时在任务完成后也会出现,因此使事情更难阅读)
  2. 继续使用(现已弃用)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
# ...

进一步阅读:

答案4

就我而言,我使用的是“免费”策略,在完成任务之前不会显示标题。

相关内容