【问题标题】:Can Ansible dictionaries refer to themselves?Ansible 字典可以引用自己吗?
【发布时间】:2019-01-21 19:15:33
【问题描述】:

我正在尝试在本地的每台机器上构建某些软件。该剧本将下载源代码压缩包(使用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 抱怨“意外的 '*'”。

【问题讨论】:

    标签: ansible yaml ansible-2.x pyyaml


    【解决方案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
    

    【讨论】:

    • 谢谢,但这不适合这个任务 :( 不同的软件在下载 URL 的不同位置嵌入了版本,这样我需要一个 separate 变量每个包...不幸的是,像Python-*ver.tar.xz 这样的东西根本没有扩展...
    • 好吧,你问了一个问题,发布了一些代码,我回答了你的问题。我不知道你脑子里有什么任务。我也不明白“Python-*ver.tar.xz 根本没有展开”是什么意思,因为我发布的示例中没有出现这样的字符串。如果您没有定义锚点,YAML 解析器会在 python_version: *ver 行上给您一个错误 found undefined alias
    • 问题中描述了任务。目标是有一个单一的数据结构来描述,从哪里获取每个包的源代码。
    • 不幸的是,SO不允许像“你不能”这样简短的答案。看来你已经发现你做不到了。
    • 该行没有定义字符串。它指定两个 节点:映射的键和值。节点由映射指示符分隔 (:) 键是普通样式的标量节点,值是双引号样式的标量节点(那些引号是多余的)。 OP 显然浏览了 YAML 文档(如果他费心阅读他正在使用的工具的文档),因为这非常清楚地表明 锚和别名在节点级别上工作
    猜你喜欢
    • 2020-07-05
    • 2017-10-29
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 2014-08-07
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多