我正在尝试递归执行剧本,直到条件满足为止。但是,我无法以某种方式实现它。谁能给我建议解决方案。
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
实现这一目标。但是,解析在这一部分变得困难。因此,请避免使用此解决方案。
答案 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
错误!意外的异常:最大递归深度超出错误。