gpt4 book ai didi

ansible - 从上一个任务中获取更改/失败的主机列表 | Ansible的

转载 作者:行者123 更新时间:2023-12-04 07:44:46 26 4
gpt4 key购买 nike

全部,

示例:如果我有 20 个主机用于 playbook 并使用 Serial:10 运行它们,则以下 shell 命令一次在 10 个主机上运行。一旦完成处理程序任务被调用,其中创建 dict (_dict) 的任务不会给出字典输出,因此第二个任务 - 失败的主机 - 因提到的错误而失败。

      - name: Run some shell command
shell: "echo 2 > /abcd/abcd.txt"
when: random condition is satisfied
register: update2
ignore_errors: yes
notify: abc_handler

- handler:
- name: abcd_handler
set_fact:
_dict: "{{ dict(ansible_play_hosts|zip(
ansible_play_hosts|map('extract', hostvars, 'update2'))) }}"
run_once: true


- name: Find failed hosts
set_fact:
_failed: "{{ _dict|dict2items|json_query('[?value.failed].key') }}"
run_once: true

处理程序第一个任务输出:

        "changed: false"
"ansible_facts": {
"_dict": "{u'host1': {'stderr_lines': [], u'changed': True,...u'host2':.....u'host10'}"

当针对上述值运行 dict2items 时,第二个处理程序任务给出了上述错误。

谢谢。

最佳答案

问题:“执行某个任务、更改某些内容或失败的主机列表。”

A:例如,命令在 test_11 时没有更改,在 test_12 更改文件,在 test_13 时失败

- hosts: test_11,test_12,test_13
tasks:
- shell:
cmd: "echo 2 > /tmp/test/abcd.txt"
creates: /tmp/test/abcd.txt
register: update1
ignore_errors: true
TASK [shell] ***********************************************************
changed: [test_12]
fatal: [test_13]: FAILED! => changed=true
cmd: echo 2 > /tmp/test/abcd.txt
delta: '0:00:00.045992'
end: '2021-04-25 23:22:31.623804'
msg: non-zero return code
rc: 2
start: '2021-04-25 23:22:31.577812'
stderr: '/bin/sh: cannot create /tmp/test/abcd.txt: Permission denied'
stderr_lines: <omitted>
stdout: ''
stdout_lines: <omitted>
...ignoring
ok: [test_11]

让我们先用数据创建一个字典,例如

    - set_fact:
_dict: "{{ dict(ansible_play_hosts|
zip(ansible_play_hosts|
map('extract', hostvars, 'update1'))) }}"
run_once: true

给予

  _dict:
test_11:
changed: false
cmd: echo 2 > /tmp/test/abcd.txt
failed: false
rc: 0
stdout: skipped, since /tmp/test/abcd.txt exists
stdout_lines:
- skipped, since /tmp/test/abcd.txt exists
test_12:
changed: true
cmd: echo 2 > /tmp/test/abcd.txt
delta: '0:00:00.032474'
end: '2021-04-25 23:14:36.361510'
failed: false
rc: 0
start: '2021-04-25 23:14:36.329036'
stderr: ''
stderr_lines: []
stdout: ''
stdout_lines: []
test_13:
changed: true
cmd: echo 2 > /tmp/test/abcd.txt
delta: '0:00:00.054980'
end: '2021-04-25 23:14:35.565811'
failed: true
msg: non-zero return code
rc: 2
start: '2021-04-25 23:14:35.510831'
stderr: '/bin/sh: cannot create /tmp/test/abcd.txt: Permission denied'
stderr_lines:
- '/bin/sh: cannot create /tmp/test/abcd.txt: Permission denied'
stdout: ''
stdout_lines: []

请注意,尽管注册变量显示“stdout: skipped, since/tmp/test/abcd.txt 存在”。

分析现在很简单,例如

    - set_fact:
_failed: "{{ _dict|dict2items|json_query('[?value.failed].key') }}"
run_once: true

给出失败主机的列表

  _failed:
- test_13

和下一个任务

    - set_fact:
_changed: "{{ (_dict|dict2items|json_query('[?value.changed].key'))|
difference(_failed) }}"
_ok: "{{ _dict|dict2items|json_query('[?value.changed == `false`].key') }}"
run_once: true

给予

  _changed:
- test_12

_ok:
- test_11

注意

  1. 需要从更改的主机中减去失败的主机,因为失败的主机也被报告为已更改。

  2. 如果任务被跳过,则没有注册变量。


序列号

如果使用 serial,将 playbook 分成 2 个 play。例如

shell> cat playbook.yml
- hosts: all
serial: 10
tasks:
- shell:
cmd: "echo 2 > /tmp/test/abcd.txt"
creates: /tmp/test/abcd.txt
register: update1
ignore_errors: true

- hosts: all
tasks:
- set_fact:
_dict: "{{ dict(ansible_play_hosts|zip(
ansible_play_hosts|map('extract', hostvars, 'update1'))) }}"
run_once: true

关于ansible - 从上一个任务中获取更改/失败的主机列表 | Ansible的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67249975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com