【问题标题】:Ansible with_dict expects a dict - blank Null dictionary variableAnsible with_dict 需要一个 dict - 空白 Null 字典变量
【发布时间】:2017-07-11 01:09:26
【问题描述】:

Ansible 1.9.4

在我的group_vars/slave/slave 文件中,我将以下变量设置为 NULL 值(更准确地说是无/未定义/空字符串):

# NFS mount settings
slave_nfsmount:

Playbook 调用任务/动作:

  - name: Ensure nfs mount directory exists
    file: path={{item.key}} state=directory
    with_dict: "{{slave_nfsmount | default({})}}"
    ignore_errors: yes

收到错误消息:

TASK: [Ensure nfs mount directory exists] ************************************** 
fatal: [12.19.22.33] => with_dict expects a dict

FATAL: all hosts have already failed -- aborting

我不想想在 global_vars/slave/slave 文件中设置 slave_nfsmount 变量的值(因为用户可以在命令行中传递该值,也可以通过其他方式使其可用,具体取决于用户想要在运行时传递什么)。因为,目前它对 slave_nfsmount 变量使用 NULL、空白/无值,所以我使用 "{{ slave_nfsmount | default({})}}" 和 with_dict: 语句。

当值为空白/null/未定义/空时,我如何才能使这项工作发挥作用,以便我的剧本不会失败?

我尝试给予:and slave_nfsmount is not defined

或 ignore_errors: yes (True),但它不起作用,playbook 仍然失败,出现如上所示的致命错误。

【问题讨论】:

  • 同意@techraf,但问题仍然有效:)

标签: ansible ansible-2.x


【解决方案1】:

default() 过滤器仅在 var 为 undefined 时返回默认值。

http://jinja.pocoo.org/docs/2.9/templates/#default

如果值未定义,则返回传递的默认值,否则返回变量的值:

在您的情况下,slave_nfsmount 已定义且为 NULL。

如果您希望 var 被额外的 var 覆盖(即 -e 参数),请在初始化时为其指定一个默认值:

slave_nfsmount: {}

【讨论】:

  • 这实际上是有道理的(与我的问题有关)。仍然想知道,如果这能解决问题,很好,但为什么 ignore_errors: yes 或 ignore_errors: True 没有忽略/跳过错误..
  • 因为它像语法/编译错误(无法解析的变量引用),而不是任务本身产生的错误。
【解决方案2】:

我将以下变量设置为 NULL 值(无/未定义)

不,你没有。你有一个定义的变量。

例如使用三元过滤器。

with_dict: "{{slave_nfsmount | ternary(slave_nfsmount, {})}}"

【讨论】:

  • 不,值为NULL。
猜你喜欢
  • 2016-02-25
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2017-03-07
相关资源
最近更新 更多