ansible - 我如何在ansible中计算任务成功/失败?
问题描述
我正在使用 ansible 来设置分布式应用程序。我正在安装节点,然后创建虚拟接口,并且虚拟接口不能多于节点。因此,如果我在 X 节点上安装,并且 Y 节点失败,我需要检查是否没有更多 (XY) 虚拟接口。
有没有办法为特定任务获取成功/失败节点数的数值,以便我以后可以使用它来检查虚拟接口的数量?
解决方案
使用ansible-runner。请特别参阅Runner Artifact Job Events和“stats”。例如 ansible-runner 和 playbook
shell> cat private3/project/test.yml
- hosts: test_01:test_02
gather_facts: false
tasks:
- debug:
var: inventory_hostname
- fail:
msg: Fail test_02
when: inventory_hostname == 'test_02'
shell> ansible-runner -p test.yml -i ID01 run private3
...
ASK [fail] ********************************************************************
skipping: [test_01]
fatal: [test_02]: FAILED! => {"changed": false, "msg": "Fail test_02"}
...
在目录中创建记录private3/artifacts/ID01/job_events/
。我不知道有任何公开可用的工具来分析这些事件。我创建了一个显示失败任务的剧本
shell> cat pb.yml
- hosts: localhost
gather_facts: false
vars:
events_dir: private3/artifacts/ID01/job_events
tasks:
- find:
paths: "{{ events_dir }}"
register: result
- include_vars:
file: "{{ item }}"
name: "{{ 'my_var_' ~ my_idx }}"
loop: "{{ result.files|json_query('[].path') }}"
loop_control:
index_var: my_idx
label: "{{ my_idx }}"
- set_fact:
my_events: "{{ my_events|default({})|
combine({my_key: lookup('vars', my_key)}) }}"
loop: "{{ range(0, result.matched)|list }}"
loop_control:
index_var: my_idx
vars:
my_key: "{{ 'my_var_' ~ my_idx }}"
- set_fact:
my_list: "{{ my_events|json_query('*.{counter: counter,
event: event,
task: event_data.task_action,
host: event_data.host}') }}"
- debug:
var: item
loop: "{{ my_list|sort(attribute='counter') }}"
loop_control:
label: "{{ item.counter }}"
when: item.event == 'runner_on_failed'
给
shell> ansible-playbook pb.yml
...
skipping: [localhost] => (item=11)
ok: [localhost] => (item=12) => {
"ansible_loop_var": "item",
"item": {
"counter": 12,
"event": "runner_on_failed",
"host": "test_02",
"task": "fail"
}
}
skipping: [localhost] => (item=13)
...
随意根据您的需要调整剧本。
推荐阅读
- javascript - Nuxt/Buefy -
组件显示不一致 - react-native - 无法使用 react-native-beacons-manager 检测 Android 中的 ibeacons
- bash - 如何为每个唯一字符串添加值?
- php - Symfony 教义错误“DoctrineMigrationsBundle 需要启用 DoctrineBundle。”
- flutter - 如何在颤动的提要屏幕中将照片和视频一起添加
- algorithm - 如何使用 union-find 方法解决 Manager peer 问题?
- java - 绘画程序JavaFX中的线条绘画
- javascript - 如何将复选框中的值作为分组参数添加到 URL 字符串?
- dataset - 赞助搜索 RTB 的数据集
- node.js - REST API - Can't fetch Post image in front end