我正在尝试在本地的每台计算机上构建某些软件。该剧本将下载源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抱怨“意外的'*'”。
答案 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