ansible failed_when
时间: 2023-11-20 11:07:47 浏览: 262
`failed_when` 是 Ansible 中的一个关键字,用于在任务执行失败时控制任务的行为。可以使用 `failed_when` 来定义一个条件,当这个条件成立时,任务会被标记为失败。例如:
```
- name: Check if file exists
stat:
path: /path/to/file
register: file_stat
failed_when: file_stat.stat.exists == False
```
在上面的例子中,如果文件不存在,任务会被标记为失败。
相关问题
- name: run rping ipv4 cli_command: command: ping {{ vrf }} {{ item }} -c 1 register: pingresult4 ignore_errors: True failed_when: "'100% packet loss' not in pingresult4.stdout" loop: "{{ dest.split(',') }}" when: params is not defined and item | ipv4
这是一个使用 Ansible 进行网络设备管理的 playbook 示例。该 playbook 中包含了一个名为 run rping ipv4 的任务,该任务使用 cli_command 模块执行 ping 命令,并将执行结果存储在 pingresult4 变量中。
具体而言,该任务使用了 loop 参数来循环执行 ping 命令,其中 dest 变量使用 split 方法将多个 IP 地址拆分为列表,并逐个执行 ping 命令。同时,使用了 register 参数将 ping 命令的执行结果存储在 pingresult4 变量中,以便后续处理和分析。
在 ping 命令执行过程中,使用了 ignore_errors 参数来忽略 ping 命令执行时可能遇到的错误。同时,使用了 failed_when 参数来判断 ping 命令执行结果中是否包含 "100% packet loss" 字符串,如果不包含则认为 ping 命令执行成功,否则认为 ping 命令执行失败。
最后,在 when 参数中使用了条件判断,当 params 未定义且 item 为 ipv4 地址时才执行该任务,以避免在不需要执行时浪费资源。
该 playbook 的目的是测试多个 IP 地址的连通性,并为网络管理员提供一个快速诊断和定位故障的工具。通过执行 ping 命令,管理员可以了解网络设备的可达性和响应时间,并及时进行故障排查和修复。
name: debug ping result vars: ansible_connection: local result: "{{ item.stdout[0] | parse_cli_textfsm('/usr/share/ansible/plugins/textfsm/ping') | json_query('[0]') | json_format }}" commandsH: { command: "ping {{item.item.vrf}} {{item.item.dest}} " } debug: msg: "{{result}} {{ commandsH }}" when: params is defined and item.skipped is not defined and item is succeeded loop: "{{ pingresult4.results | union(pingresult6.results) }}" - name: save ping vars: ansible_connection: local result: "{{ item.stdout[0] | parse_cli_textfsm('/usr/share/ansible/plugins/textfsm/ping') | json_query('[0]') | json_format }}" set_result: "{{ result is string | ternary(default_result, result) }}" isAlive: { isAlive: "{{ set_result.RATE > 0 | ternary(True, False) }}", RATE: "{{ set_result.RATE }}" } commandsH: { command: "ping {{item.item.vrf}} {{item.item.dest}} " } uri: url: "http://localhost:{{runServerPort}}/kafka/PerfRaw" method: POST body_format: json return_content: yes body: # 毫秒级,date命令不能计算毫秒,直接拼接 # 使用!!强制类型转换为int报错,原因尚未明确 taskId: "{{ id }}" extendInfo: "{{ item.item.extendInfo | default({}) | combine(commandsH) }}" ipFrom: "{{ host.ip }}" ip: "{{ item.item.dest }}" taskFinishTime: "{{ lookup('pipe','date +%s000') }}" result: { rping: "{{ set_result | combine(isAlive) | json_format }}" } taskType: monitor workerType: ansible monitorItemType: "{{item.item.monitorItemType}}" monitorItemList: "{{item.item.monitorItemList}}" register: this failed_when: "'\"code\":0' not in this.content" when: params is defined and item.skipped is not defined and item is succeeded loop: "{{ pingresult4.results | union(pingresult6.results) }}"
这部分代码是将 rping 的结果进行处理并保存到数据库中的过程,其中包含了两个 task。第一个 task 是将 rping 的结果进行格式化并输出到控制台,第二个 task 是将结果保存到数据库中。
在第一个 task 中,使用 `json_query` 函数和 `json_format` 过滤器将 `item.stdout` 中的 ping 结果转换为 JSON 格式,并存储在 `result` 变量中。然后使用 `debug` 模块打印出结果和相应的命令。`loop` 参数用于遍历 `pingresult4.results` 和 `pingresult6.results` 中的所有结果。
在第二个 task 中,使用 `uri` 模块将结果保存到数据库中。`body` 参数是一个 JSON 对象,其中包含了需要保存的信息,例如 taskId、extendInfo、ipFrom、ip、taskFinishTime、result 等字段。这些字段的具体含义需要根据实际情况进行理解和修改。`register` 参数用于将保存结果的返回值存储到 `this` 变量中,`failed_when` 参数用于判断请求是否成功。
注意,这段代码中的 `id`、`runServerPort`、`host.ip`、`item.item.extendInfo`、`item.item.monitorItemType`、`item.item.monitorItemList` 等变量的值需要根据实际情况进行修改。
阅读全文