YAML中的Ansible整型变量

Ale*_*rin 16 yaml jinja2 ansible

我正在使用Ansible来部署webapp.我想通过检查给定页面返回具有给定键/值的JSON来等待应用程序运行.

我希望在失败之前尝试几次任务.因此我使用了until/ retries/ delaykeybwords 的组合.

问题是,我想要retries从变量中获取数量.如果我写:

  retries: {{apache_test_retries}}
Run Code Online (Sandbox Code Playgroud)

我陷入了通常的Yaml Gotcha(http://docs.ansible.com/YAMLSyntax.html#gotchas).

相反,如果我写:

  retries: "{{apache_test_retries}}"
Run Code Online (Sandbox Code Playgroud)

我被说是价值不是整数.

ValueError:int()的基数为10的无效文字:'{{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
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题的任何想法?谢谢.

ibl*_*vic 20

我有完全相同的问题,并尝试了一些不起作用的事情,所以有一段时间我没有变量运行,但找到答案所以每个拥有它的人.

Daniels解决方案确实应该工作:

retries: "{{ apache_test_retries | int }}"
Run Code Online (Sandbox Code Playgroud)

但是,如果你运行的是较小版本的ansible,它将无法工作.因此,请确保您更新了我在1.8.4上测试过的ansible,并且它可以工作,而不是1.8.2

这是ansible的原始错误:https: //github.com/ansible/ansible/issues/5865

  • 当通过多个变量传递 int 值时,ansible 可能会在之后将值转换为字符串,尽管使用了 `|int`。设置 [jinja2_native=True](https://docs.ansible.com/ansible/latest/reference_appendices/config.html#default-jinja2-native) 可以解决这个问题。与 OP 无关,但与通过搜索网络到达这里的人相关。 (6认同)

udo*_*dan 9

您应该能够使用int过滤器将其转换为整数:

retries: "{{ apache_test_retries | int }}"
Run Code Online (Sandbox Code Playgroud)

  • 如果看到此错误,可能是因为您执行了类似“ {{some_var / 10 | int}}`实际上会解析为{{some_var /(10 | int)}}``所以您需要`{{(some_var / 10)| int}}`。除了`| 诠释完美 (2认同)