Ansible - добавить элемент в список, который скрыт в словаре - PullRequest
0 голосов
/ 09 июля 2020

Цель

Я пытаюсь добавить строку в список, принадлежащий ключу, который находится на несколько уровней ниже в словаре.

Объяснение

Я инициализирую пустой список, скрытый внутри некоторой ранее существовавшей переменной с именем info:

tasks:

  - set_fact:
      info: "{{ info | combine( { host: { repo: { folders: [] }}}, recursive=true ) }}"

В более поздней задаче я sh добавляю к нему строку пустой список. Это может произойти в нескольких задачах, поэтому я не хочу заменять пустой список, но добавляю его по мере необходимости. В настоящее время я пытаюсь сделать это:

tasks:

  - set_fact:
      info: "{{ info | combine( { 'host': { 'repo': { 'folders': [] }}}, recursive=true ) }}"


  - set_fact:
      info: "{{ info.host.repo.folders + ['ERROR. folderX does not exist'] }}"
    when: folderX does not exist
  - set_fact:
      info: "{{ info.host.repo.folders + ['ERROR. folderY does not exist'] }}"
    when: folderY does not exist

Однако я получаю сообщение об ошибке шаблона:

FAILED! => {"msg": "template error while templating string: expected name or number. String: {{ info.host.repo.folder + ['ERROR. folderX does not exist'] }}"}

Я знаю, что вы можете просто добавлять элементы в список, когда пункт назначения находится на самом верхнем уровне . Например:

- set_fact:
    folders: []
- set_fact:
    folders: "{{ folders + ['ERROR. folderX does not exist'] }}"
  when: folderX does not exist
- set_fact:
    folders: "{{ folders + ['ERROR. folderY does not exist'] }}"
  when: folderY does not exist

- debug: var=folders

Что при желании дает:

TASK [debug] ***************************************************************************************************
"folders": [
    "ERROR. folderX does not exist",   
    "ERROR. folderY does not exist"
]

Итак, как изменяется синтаксис, когда я пытаюсь спуститься по нескольким уровням и получить доступ к списку, который находится в вложенный словарь? Спасибо!

1 Ответ

0 голосов
/ 09 июля 2020

dict s и list s в ansible являются «действующими», поэтому вы можете обновить их с помощью операторов set

- set_fact:
    info: >-
      {%- set _ = info.host.repo.update({"folders": []}) -%}
      {{ info }}
- set_fact:
    info: >-
      {%- set _ = info.host.repo.folders.append("ERROR. folderY does not exist") -%}
      {{ info }}
  when: folderY does not exist

, что set _ = бизнес, потому что Jinja ansible не поддерживает оператор do, поэтому нельзя иметь оператор присваивания отдельно

...