当subelement是字典时,with_subelements

时间:2018-10-29 18:26:28

标签: list dictionary ansible

说我在yml中定义了以下字典

st1: 
  d1:
    f1: fv1
    f2: fv2
    d:
      df1: dfv1
      df2: dfv2
  d2:
    f1: fv3
    f2: fv4
    d:
      df1: dfv3
      df2: dfv4

我可以使用with_subelements遍历上面的内容。像这样

with_subelements:

-  st1
-  d

但是运行剧本时出现以下错误。

  

失败! => {“ msg”:“键d应该指向列表,得到'{u'df1':   u'dfv1',u'df2':u'dfv2'}'“}

我正在使用ansible 2.4版

我怎样才能只将dict d的值放入列表中以成功获得上述剧本。

dictsort或dict2items对我不起作用

3 个答案:

答案 0 :(得分:0)

好的-我不确定您要输出什么,但是......

我首先重组了yaml文件:

---
st1: 
  - name: d1
    f1: fv1
    f2: fv2
    d:
      - df1: dfv1
      - df2: dfv2
  - name: d2
    f1: fv3
    f2: fv4
    d:
      - df1: dfv3
      - df2: dfv4

然后,这出戏看起来像这样:

  - debug:
      var: item.1
    with_subelements:
      - "{{ st1 }}"
      - d

输出如下:

TASK [debug] **********************************************************************************************************************************
ok: [localhost] => (item=None) => {
    "item.1": {
        "df1": "dfv1"
    }
}
ok: [localhost] => (item=None) => {
    "item.1": {
        "df2": "dfv2"
    }
}
ok: [localhost] => (item=None) => {
    "item.1": {
        "df1": "dfv3"
    }
}
ok: [localhost] => (item=None) => {
    "item.1": {
        "df2": "dfv4"
    }
}

答案 1 :(得分:0)

如果您给我们一些预期的输出,这将有所帮助。但是,您需要使用with_subelements的列表。如果您无法更改数据文件,则必须更改剧本。如果您想查看所有df1值,则可以这样做:

  - debug:
      msg: "{{ item.key }}: {{ item.value.d.df1 }}"
    with_dict: "{{ st1 }}"

使用您的字典文件,我得到了:

TASK [debug] **********************************************************************************************************************************
ok: [localhost] => (item=None) => {
    "msg": "d2: dfv3"
}
ok: [localhost] => (item=None) => {
    "msg": "d1: dfv1"
}

答案 2 :(得分:0)

不幸的是,您被困在一个糟糕的设计中。错误的设计会导致错误的代码。所以这是一些错误的代码:

---
- hosts: localhost
  become: no
  connection: local

  tasks:

  - set_fact:
      st1_json: "{{ st1 | to_json }}"

  - shell: echo '{{ st1_json }}' | jq '.[].d' | grep ':' | cut -d'"' -f4 | tr '\n' ',' | sed -e 's/^/[/' -e 's/,$/]/' -e 's/,/, /g'
    register: output

  - debug:
      msg: "{{ output.stdout }}"

非常可怕。但是它得到了期望的输出:

TASK [debug] ************************************************************************************************************************
ok: [localhost] => {
    "msg": "[dfv3, dfv4, dfv1, dfv2]"
}

享受。