如何基于直到条件来递归调用ansible播放

时间:2019-03-01 05:11:13

标签: json recursion ansible

我正在尝试递归执行剧本,直到条件满足为止。但是,我无法以某种方式实现它。谁能给我建议解决方案。

Ansible版本:2.2.1.0

这是我的测试剧。

main_play.yml:

---
- hosts: localhost
  tasks:
  - name: Wait till you get the needed thing in the get call
    include: loop.yml

这是loop.yml

- name: Wait until migration jobs reach DbcAllJobxxxxx
  uri:
    url: "http://<url->/jobs"
    method: GET
    headers:
      Content-Type: "application/json"
      Accept: "application/json"
      Postman-Token: "31d6"
      cache-control: "no-cache"
    return_content: yes
  register: migration_status
  ignore_errors: yes

- debug: msg="{{ migration_status }}"

#write mig-status to file
- copy: content="{{ migration_status.content }}" dest=/path/to/dest/migration_status.json

- name: Get the DbcAllJobxxxxx status from py script
  shell: python jsonrc.py /path/to/dest/migration_status.json
  register: pyout

- debug: msg="{{ pyout.stdout }}"

- include: loop.yml
  when: pyout.stdout != '1'
  ignore_errors: yes

- debug: msg="{{ pyout.stdout }}"

要求:GET json调用将返回json。 json可能会随时间变化,因为它返回动态状态。因此,要连续存储json数据以知道键的值-这是调用其他事件的标志。因此,我需要等待json中的键值对。 [它可能会在时间范围内丢失。需要在那时捕获]。为了通过python脚本实现相同的json解析,并捕获pyscript的返回并检查值,如果不满足条件,则调用相同的播放。

执行ansible-playbook main_play.yml

即使pyout.stdout == '1'仍然抛出ERROR! Unexpected Exception: maximum recursion depth exceeded错误。我有想念吗??在这方面帮助我。

顺便说一句,我尝试使用until通过json_query实现这一目标。但是,解析在这一部分变得困难。因此,请避免使用此解决方案。

2 个答案:

答案 0 :(得分:1)

从ansible 2.4开始,内置include_tasks可以递归工作。

main_play.yml:

---
- hosts: localhost
  tasks:
  - set_fact:
      counter: 1
  - include_tasks: loop.yml

loop.yml:

- set_fact:
    counter: "{{counter | int + 1 }}"

- debug: msg="{{ counter }}"

- include_tasks: loop.yml
  when: counter | int < 5

结果:

PLAY [localhost] ****************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************
ok: [localhost]

TASK [set_fact] *****************************************************************************************************************************************************************************
ok: [localhost]

TASK [include_tasks] ***********************************************************************************************************************************
included: loop.yml for localhost

TASK [set_fact] *****************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "2"
}

TASK [include_tasks] ************************************************************************************************************************************************************************
included: loop.yml for localhost

TASK [set_fact] *****************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "3"
}

TASK [include_tasks] ************************************************************************************************************************************************************************
included: loop.yml for localhost

TASK [set_fact] *****************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "4"
}

TASK [include_tasks] ************************************************************************************************************************************************************************
included: loop.yml for localhost

TASK [set_fact] *****************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ********************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "5"
}

TASK [include_tasks] ************************************************************************************************************************************************************************
skipping: [localhost]

PLAY RECAP **********************************************************************************************************************************************************************************
localhost                  : ok=14   changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

答案 1 :(得分:0)

很明显,我认为。

"Here is the loop.yml"

...
- include: loop.yml
  

错误!意外的异常:最大递归深度超出错误。