我正在使用Ansible部署webapp。我想通过检查给定页面返回具有给定键/值的JSON来等待应用程序运行。
我希望在失败之前尝试几次任务。因此,我使用了until
/ retries
/ delay
个关键字的组合。
问题是,我希望从变量中获取retries
的数量。如果我写:
retries: {{apache_test_retries}}
我陷入了通常的Yaml Gotcha(http://docs.ansible.com/YAMLSyntax.html#gotchas)。
相反,我写道:
retries: "{{apache_test_retries}}"
我被说是价值不是整数。
ValueError:基数为10的int()的无效文字:'{{apache_test_retries}}'
这是我的完整代码:
- name: Wait for the application to be running
local_action:
uri
url=http://{{webapp_url}}/health
timeout=60
register: res
sudo: false
when: updated.changed and apache_test_url is defined
until: res.status == 200 and res['json'] is defined and res['json']['status'] == 'UP'
retries: "{{apache_test_retries}}"
delay: 1
有关如何解决此问题的任何想法?感谢。
答案 0 :(得分:20)
我有完全相同的问题并且尝试了一些没有用的东西,所以有一段时间我没有变量运行,但是对于每个拥有它的人都找到了答案。
Daniels解决方案确实应该有效:
retries: "{{ apache_test_retries | int }}"
但是如果你运行的是较小版本的ansible,它就不会起作用。因此,请确保更新我在 1.8.4 上进行了测试,并确保其正常运行,并且不会在1.8.2
上进行测试这是ansible的原始错误: https://github.com/ansible/ansible/issues/5865
答案 1 :(得分:9)
您应该能够将其转换为int filter的整数:
retries: "{{ apache_test_retries | int }}"
答案 2 :(得分:0)
您是否检查过您拥有正确的变量名称?
Ansible使用Jinja2变量模板。因此,如果变量不存在,则将其替换为空字符串。
http://jinja.pocoo.org/docs/dev/templates/
如果变量或属性不存在,您将返回未定义的值。使用这种值可以做什么取决于应用程序配置:默认行为是,如果打印它会计算为空字符串,并且您可以迭代它,但每个其他操作都会失败。
答案 3 :(得分:0)
我遇到了类似的问题,在我的情况下,我想重新启动celeryd
服务。它有时需要很长时间才能重新启动,我想给它最多30秒进行软重启,然后强制重启它。我使用了async
(每5秒轮询一次重启结果)。
celery/handlers/main.yml
- name: restart celeryd
service:
name=celeryd
state=restarted
register: celeryd_restart_result
ignore_errors: true
async: "{{ async_val | default(30) }}"
poll: 5
- name: check celeryd restart result and force restart if needed
shell: service celeryd kill && service celeryd start
when: celeryd_restart_result|failed
然后我在剧本中使用上面作为任务的处理程序(restart celeryd
始终位于notify
列表中)
在你的情况下,下面的东西可能会起作用。没有检查它是否确实,但它可能会给你一些黑客想法以不同的方式解决它。此外,由于您将忽略第一项任务中的错误,因此您需要确保第二项内容正常:
- name: Poll to check if the application is running
local_action:
uri
url=http://{{webapp_url}}/health
timeout=60
register: res
sudo: false
when: updated.changed and apache_test_url is defined
failed_when: res.status != 200 and res['json'] is not defined and not res['json']['status'] == 'UP'
ignore_errors: true
async: "{{ apache_test_retries | default(60) }}"
poll: 1
# Task above will exit as early as possible on success
# It will keep trying for 60 secs, polling every 1 sec
# You need to make sure it's fine **again** because it has ignore_errors: true
- name: Final UP check
local_action:
uri
url=http://{{webapp_url}}/health
timeout=60
register: res
sudo: false
when: updated.changed and apache_test_url is defined
failed_when: res.status != 200 and res['json'] is not defined and not res['json']['status'] == 'UP'
希望它可以帮助您解决retries
中的错误问题。