【问题标题】:How can I hide skipped tasks output in Ansible如何在 Ansible 中隐藏跳过的任务输出
【发布时间】:2017-01-04 11:58:28
【问题描述】:

例如,我有 Ansible 角色

---
- name: Deploy app1
  include: deploy-app1.yml
  when: 'deploy_project == "{{app1}}"'

- name: Deploy app2
  include: deploy-app2.yml
  when: 'deploy_project == "{{app2}}"'

但我只在一个角色调用中部署一个应用程序。当我部署多个应用程序时,我会多次调用角色。但是每次都有很多skipped tasks output(来自不通过条件的任务),我不想看到。如何避免?

【问题讨论】:

  • 怎么可能不显示Deploy app1 而不是Deploy app2 的跳过任务?我只想为特定数量的任务跳过此显示。
  • 在下面的 cmets (stackoverflow.com/questions/39189549/…) 中,我们与 @konstantin-suvorov 讨论过,您不能跳过任务名称,因为它们是在做出任何决定之前打印出来的。

标签: plugins output ansible


【解决方案1】:

我假设您不想在运行 Ansible 时在输出中看到跳过的任务。

在 ansible.cfg 文件中将此设置为 false。

display_skipped_hosts = false

注意。它仍然会输出任务的名称,尽管它不再显示“已跳过”。

更新:顺便说一下,您需要确保 ansible.cfg 在当前工作目录中。

取自 ansible.cfg 文件。

ansible 将读取 ANSIBLE_CONFIG, ansible.cfg 在当前工作目录中,.ansible.cfg 在 主目录或 /etc/ansible/ansible.cfg,无论哪个 先找到。

所以请确保您在正确的 ansible.cfg 文件中设置 display_skipped_hosts = false

告诉我你的情况

【讨论】:

  • 在我提到的先前答案的 cmets 中,我尝试了这个 ansible.cfg 属性,尽管它与 skippy 回调插件具有相同的效果。不过谢谢你的回答。
  • 设置以下环境变量的作用相同:export ANSIBLE_DISPLAY_SKIPPED_HOSTS=false
  • 你不应该将 ansible.cfg 放在当前工作目录中,因为它会覆盖 all 设置,通常是一个非常意外的结果。 Ansible 不会组合您可能期望的几个 ansible.cfg 文件中的设置。
  • @32cupo 你是对的。 skippy 插件已弃用,display_skipped_host 设置是做同样事情的新官方方式。
【解决方案2】:

ansible 2.4 开始,添加了回调插件名称full_skip 以抑制在 ansible 输出中跳过任务名称和跳过关键字。你可以试试下面的 ansible 配置:

[defaults]
stdout_callback = full_skip

【讨论】:

  • 这是我想要的唯一答案:+1:
  • 从 Ansible 2.11 开始,改为设置 display_skipped_hosts=Falsefull_skip 插件现已弃用。
  • 这比display_skipped_hosts=False 效果更好,因为它实际上完全跳过了输出。在 ansible 2.9.9 中效果很好!谢谢!
  • ansible 2.9.13 - 这确实抑制了跳过的任务,但也会导致每个未跳过的任务行输出两次
【解决方案3】:

Ansible 允许您通过使用自定义 callbacks 来控制其输出。

在这种情况下,您可以简单地使用skippy callback,它不会在跳过的任务上输出任何内容。

也就是说,skippy 现在已弃用,并将在 ansible v2.11 中删除。

【讨论】:

  • 当我将插件复制到我的回调插件目录并再次运行 playbook 时,我没有注意到任何变化。我在 ansible.cfg 文件 (docs.ansible.com/ansible/…) 中找到了 display_skipped_hosts 属性,但它仍然显示已跳过任务的名称。
  • 您是否将其命名为相同?正如文档中提到的那样,它按字母顺序加载,default 显然在 skippy 之前,所以它不会加载。
  • @konstantin-suvorov 当我将 stdout_callback 属性设置为 skippy 时,显示行为与将 skippy 复制到回调目录相同。 Ansible 仍然显示已跳过任务的名称。
  • @32cupo 啊,对不起。我错过了您谈论跳过任务的 name 的事实。在做出任何决定之前会打印名称,因此您不能那么简单地摆脱它们。这样做是因为您可能为一部分主机跳过了任务。您唯一的选择是手工制作的插件。
  • 回调的正确链接是:docs.ansible.com/ansible/latest/plugins/callback/skippy.html 注意:它已被弃用,将在 2.11 中删除
【解决方案4】:

如果您不介意丢失颜色,您可以通过 sed 管道输出来省略跳过的任务:

ansible-playbook whatever.yml | sed -nr '/^TASK/{h;n;/^skipping:/{n;b};H;x};p'

【讨论】:

  • 您可以在ansible.cfg 中使用force_color = 1 强制颜色。
  • 完美运行,但是当我使用 force_color 时,我不得不使用修改后的 sed - sed -nr '/^TASK/{h;n;/^^[\[0;36mskipping:/{n;b};H;x};p'
【解决方案5】:

如果使用角色,可以使用when取消main.yml中的包含

# roles/myrole/tasks/main.yml
- include: somefile.yml
  when: somevar is defined


# roles/myrole/tasks/somefile.yml
- name: this task will only run (and be seen in the output) if somevar is defined
  debug:
    msg: "Hello World"

【讨论】:

  • 这不会取消包含,而只是将给定的时间添加到包含中的每个任务。请阅读静态/动态包含。
  • @KonstantinSuvorov 你是对的,我错了。任务行仍然显示。当我想跳过整个文件时,它可以节省线路/时间。
猜你喜欢
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多