Ansible字典可以自我称呼吗?

时间:2018-08-14 21:05:32

标签: ansible yaml ansible-2.x pyyaml

我正在尝试在本地的每台计算机上构建某些软件。该剧本将下载源tarball(使用get_url),进行配置和构建。

我想定义要构建的项目列表,如下所示:

srcpkg:
  python:
    ver:    "3.7.0"
    sha:    "0382996d1ee6aafe59763426cf0139ffebe36984474d0ec4126dd1c40a8b3549"
    url:    "https://www.python.org/ftp/python/{{ srcpkg.python.ver }}/python/Python-{{ srcpkg.python.pyver }}.tar.xz"

不幸的是,这种对自身的引用(在上面的示例中,url指向ver)导致Ansible在运行时抛出“检测到递归循环”错误。

是否有一种方法(可以在Ansible中使用,或者可能只是在Yaml中)来定义内容,这样我就不必在多个地方重复该版本了?

更新:尝试使用锚点/引用:

srcpkg:
  python:
    ver:    &ver "3.7.0"
    sha:    "0382996d1ee6aafe59763426cf0139ffebe36984474d0ec4126dd1c40a8b3549"
    url:    "https://www.python.org/ftp/python/{{ *ver }}/python/Python-{{ *ver }}.tar.xz"

无济于事:Ansible抱怨“意外的'*'”。

1 个答案:

答案 0 :(得分:1)

在YAML中编写以下内容时:

url: "https://www.python.org/ftp/python/{{ *ver }}/python/Python-{{ *ver }}.tar.xz"
: 的右侧指定一个标量值。在部分标量中无法解析YAML别名。

Ansible因此创建了一个字符串变量,其值为:https://www.python.org/ftp/python/{{ *ver }}/python/Python-{{ *ver }}.tar.xz

对于Jinja2 *ver是语法错误。


您可以做的是使用辅助Ansible变量(YAML对别名使用急切求值,Jinja2对变量使用懒惰求值):

srcpkg:
  python:
    ver: &ver "3.7.0"
    sha: "0382996d1ee6aafe59763426cf0139ffebe36984474d0ec4126dd1c40a8b3549"
    url: "https://www.python.org/ftp/python/{{ python_version }}/python/Python-{{ python_version }}.tar.xz"
  python_version: *ver