从寄存器var创建dict

时间:2017-12-15 14:40:44

标签: ansible

我在尝试使用以下行格式化脚本输出时遇到问题:

"key1:val1"

在var中注册,它给出了:

"var.stdout_lines": [ "key1:val1", ]

And I would like to set_fact from this var to a dictionary like :
- name: 'set dict fact'
  set_fact:
    dict: "{{dict|combine(var.stdout_lines)}}"

我的出口如下:

combine expects dictionaries, got Undefined"

有人知道如何正确格式化我的脚本输出以正确地通过我的字典进行组合吗?

THKS

1 个答案:

答案 0 :(得分:0)

这里有多个问题:

  1. dict未初始化,因此它是Undefined,当您尝试将其与某些内容组合时,它不起作用。第一步是使用default过滤器:

    dict: "{{ dict| default({}) | combine(var.stdout_lines) }}"
    
  2. combine filter用于组合字典,但var.stdout_lines是一个列表,而不是字典,所以你会得到另一个错误:“| combine期待字典,得到[u'key1:val1 “]“

  3. 我看到的解决方案是将您的行转换为字典的字符串表示形式,然后使用from_json filter

    - set_fact:
        dict: "{{ ('{' + (var.stdout_lines | map('regex_replace', '(.*):(.*)', '\"\\1\":\"\\2\"') | join(',')) + '}') | from_json }}"
    

    注意:当键或值包含双引号char "时,它不处理这种情况。