YAML中的Ansible整型变量

时间:2015-01-30 11:00:50

标签: yaml jinja2 ansible

我正在使用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

有关如何解决此问题的任何想法?感谢。

4 个答案:

答案 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中的错误问题。