如何将变量变成字典项

How to turn a variable into a dictionary item

我正在努力完成我认为最简单的任务。我想取一个变量 v 并将其转换为字典,其中

v: ValueofV

最终目标是将该字典写入包含变量列表的 JSON 文件,key: value 其中键名始终是变量名,因此对于变量 a, b, c, ...我应该以:

{
  "a": "a_val",
  "b": "v_val",
  "c": "c_val"
}

我试过构建列表 with_items,例如

- name: Var3
  set_fact:
    node_state4: "{{ node_state4 | default({}) | combine({ item : item })}}"
  with_items:
    - requested_node_count
    - added_node_count

但是,这使得该值成为字符串名称。如果我制作第二个项目 {{ item }} 它会失败。

为了通过名称的字符串表示形式访问变量值,您需要使用 vars lookup.

所以你的任务应该是:

- set_fact:
    node_state4: >-
      {{ 
        node_state4 
          | default({}) 
          | combine({ item: lookup('vars', item) })
      }}
  loop:
    - requested_node_count
    - added_node_count

鉴于这两个任务:

- set_fact:
  node_state4: >-
      {{ 
        node_state4 
          | default({}) 
          | combine({ item: lookup('vars', item) })
      }}
  loop:
    - requested_node_count
    - added_node_count
  vars:
    requested_node_count: foo
    added_node_count: bar

- debug:
    var: node_state4

这产生:

TASK [set_fact] **********************************************************
ok: [localhost] => (item=requested_node_count)
ok: [localhost] => (item=added_node_count)

TASK [debug] *************************************************************
ok: [localhost] => {
    "node_state4": {
        "added_node_count": "bar",
        "requested_node_count": "foo"
    }
}

使用过滤器 community.general.dict_kv 例如

  _dict: "{{ v|community.general.dict_kv('v') }}"

给予

  _dict:
    v: ValueofV

给定变量列表

    rnodes: [a, b, c]
    a: a_val
    b: b_val
    c: c_val

迭代列表并创建字典,例如

    - set_fact:
        _dict: "{{ _dict|d({})|
                   combine(lookup('vars', item)|
                           community.general.dict_kv(item)) }}"
      loop: "{{ rnodes }}"

给予

  _dict:
    a: a_val
    b: b_val
    c: c_val

下一个选项是提取变量并使用过滤器dict and zip,例如下面的任务给出了相同的结果

    - set_fact:
        _dict: "{{ dict(rnodes|zip(_vals)) }}"
      vars:
        _vals: "{{ rnodes|map('extract', vars) }}"