从上一个任务获取更改/失败的主机列表 |安西布尔

2024-04-19

All,

示例:如果我有 20 个主机用于剧本并使用 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 针对上述值运行时,第二个处理程序任务会给出上述错误。

谢谢。


Q: “执行特定任务、更改某些内容或失败的主机列表。”

答:例如,该命令在以下位置不做任何更改: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

gives

  _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: []

注意test_11被报道ok not skipped尽管注册变量显示“标准输出:跳过,因为 /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

gives

  _changed:
  - test_12

  _ok:
  - test_11

注意

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

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


Serial

如果满足以下条件,则将剧本分为 2 个剧本:serial用来。例如

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从上一个任务获取更改/失败的主机列表 |安西布尔 的相关文章

随机推荐