我正在运行Ansible 2.4.1.0。
我有以下但由于某种原因我没有得到预期的行为。
也许我错了或假设不正确?
我期待邮件回调插件输出失败消息(“Ansible:Alert - Rogue Port {{item}}”)。
请有人建议更改或解决方法吗?
- name: check allowed ports
tags: ports
fail:
msg: "Ansible: Alert - Rogue Port {{ item }}"
with_items: "{{ ports_var.stdout_lines }}"
failed_when:
- "item not in ports_lookup_var"
如下所示,生成的邮件中没有失败消息。
$> ansible-playbook playbooks/rpc.yml --limit=warp.?????.local --tags ports
TASK [check allowed ports] *****************************************************
failed: [warp.?????.local] (item=127.0.0.1:1196) => {"changed": false, "failed": true, "failed_when_result": true, "item": "127.0.0.1:1196", "msg": "Ansible: Alert - Rogue Port 127.0.0.1:1196"}
ok: [warp.?????.local] => (item=*:22)
ok: [warp.?????.local] => (item=127.0.0.1:25)
ok: [warp.?????.local] => (item=127.0.0.1:8090)
to retry, use: --limit @/home/ansible/playbooks/rpc.retry
PLAY RECAP *********************************************************************
warp.gsoc.local : ok=1 changed=1 unreachable=0 failed=1
收到的邮件。
Date: Thu, 14 Dec 2017 18:40:36 +0200 (SAST)
From: "Ansible: node03.??????.local" <root@ansible.?????.local>
To: root@ansible.??????.local
Subject: Failed: All items completed
Playbook: rpc.yml
Task: check allowed ports
Module: fail
Host: node03.???????.local
The following task failed:
check allowed ports (fail)
with the following message:
All items completed
A complete dump of the error:
Failed: {"msg": "All items completed", "failed": true, "changed": false}
答案 0 :(得分:0)
这不是邮件插件问题。这就是Ansible如何评估带循环的任务的失败。
我在这里看不到循环的原因 - 您可以使用difference
filter获取“恶意端口”列表,并在该列表不为空时失败。
条件是:
ports_var.stdout_lines | difference(ports_lookup_var) | length > 0
你可以在Jinja2模板中使用表达式的第一部分来很好地格式化错误信息(然后使用循环,但在模板中);或者只是将列表转换为字符串:
fail:
msg: "Ansible: Alert - Rogue Ports: {{ rogue_ports | join(', ') }}"
when: rogue_ports | length > 0
vars:
rogue_ports: "{{ ports_var.stdout_lines | difference(ports_lookup_var) }}"
有专门为合规性验证而创建的工具,Ansible可能不是此类任务的最佳选择。