with_subelements, когда подэлемент является словарем - PullRequest
0 голосов
/ 29 октября 2018

Скажите, что в моем yml

определен следующий dict
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

Но я получаю следующую ошибку при запуске playbook.

FAILED! => {"msg": "ключ d должен указывать на список, получил '{u'df1': u'dfv1 ', u'df2': u'dfv2 '}' "}

Я использую ANSIB версии 2.4

как я могу взять только значения dict d в список, чтобы добиться успеха с вышеупомянутой пьесой.

dictsort или dict2items не работает для меня

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Будет полезно, если вы дадите нам ожидаемый результат. Однако вам нужны списки для использования with_subelements. Если вы не можете изменить файл данных, вы должны изменить Playbook. Если вы хотите увидеть все значения 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"
}
0 голосов
/ 31 октября 2018

К сожалению, вы застряли с плохим дизайном. Плохой дизайн приводит к плохому коду. Итак, вот плохой код:

---
- 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]"
}

Наслаждайтесь.

0 голосов
/ 29 октября 2018

ОК - я не совсем уверен, что вы хотите для вывода, но ....

Сначала я реструктурировал файл 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"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...