Какой самый чистый способ перебора диктов с вложенным списком в Ansible? - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть 2 дикта со следующей структурой:

# this will be set in the role

knative_base_urls:
  serving: 
    url: "https://github.com/knative/serving/releases/download/{{ knative_serving_version }}/"
  eventing: 
    url: "https://github.com/knative/eventing/releases/download/{{ knative_eventing_version }}/"
  eventing-contrib: 
    url: "https://github.com/knative/eventing-contrib/releases/download/{{ knative_eventing_version }}/"
  monitoring: 
    url: "https://github.com/knative/eventing-contrib/releases/download/{{ knative_monitoring_version }}/"

# this will be provided by the end user
knative_install_components:
  serving:
    install:
    - serving.yaml
    - foo.yaml
  eventing:
    install:
    - release.yaml
  eventing-contrib:
    install:
    - event-display.yaml

Я нашел способ их объединения, используя {{ knative_base_urls | combine(knative_install_components, recursive=true) }}, что дает мне следующую структуру:

knative_yamls:
    eventing:
      install:
      - release.yaml
      url: https://github.com/knative/eventing/releases/download/v0.11.0/
    eventing-contrib:
      install:
      - event-display.yaml
      url: https://github.com/knative/eventing-contrib/releases/download/v0.11.0/
    monitoring:
      url: https://github.com/knative/eventing-contrib/releases/download//
    serving:
      install:
      - serving.yaml
      - foo.yaml
      url: https://github.com/knative/serving/releases/download/v0.11.1/

Но я застрял в том, что не могу найти способ l oop перевернуть / преобразовать эти данные, чтобы я мог успешно l oop по списку URL-адресов и имен файлов.

Трудность заключается в том, что каждый из ключей install может содержать список из множества файлов, которые затем должны быть сопоставлены с базовым URL-адресом их родительского компонента.

- name: Compile list of Knative components to install
  debug:
    msg: "{{ item.value.url }}{{ item.value.install }}"
  with_dict: "{{ knative_base_urls | combine(knative_install_components, recursive=true) }}"
  when: item.value.install is defined

# output

TASK [ratings-ansible-role-knative : Compile list of Knative components to install] **********************************************************************
ok: [localhost] => (item={'key': 'serving', 'value': {'url': 'https://github.com/knative/serving/releases/download/v0.11.1/', 'install': ['serving.yaml', 'foo.yaml']}}) =>
  msg: https://github.com/knative/serving/releases/download/v0.11.1/['serving.yaml', 'foo.yaml']
ok: [localhost] => (item={'key': 'eventing', 'value': {'url': 'https://github.com/knative/eventing/releases/download/v0.11.0/', 'install': ['release.yaml']}}) =>
  msg: https://github.com/knative/eventing/releases/download/v0.11.0/['release.yaml']
ok: [localhost] => (item={'key': 'eventing-contrib', 'value': {'url': 'https://github.com/knative/eventing-contrib/releases/download/v0.11.0/', 'install': ['event-display.yaml']}}) =>
  msg: https://github.com/knative/eventing-contrib/releases/download/v0.11.0/['event-display.yaml']
skipping: [localhost] => (item={'key': 'monitoring', 'value': {'url': 'https://github.com/knative/eventing-contrib/releases/download//'}})

Что такое «самый чистый» способ выполняя это за Ansible?

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

1 Ответ

0 голосов
/ 11 февраля 2020

Это оказалось проще и чище, чем я ожидал!

Вот пример определения задачи, в котором просто выводятся результаты:

- name: print
  debug:
    msg: "url: {{ item.0.url }}, file: {{ item.1 }}"
  with_subelements:
    - "{{ knative_yamls }}"
    - install
    - skip_missing: true

Вывод:

ok: [localhost] => (item=[{'url': 'https://github.com/knative/serving/releases/download/v0.11.1/'}, 'serving.yaml']) =>
  msg: 'url: https://github.com/knative/serving/releases/download/v0.11.1/, file: serving.yaml'
ok: [localhost] => (item=[{'url': 'https://github.com/knative/serving/releases/download/v0.11.1/'}, 'foo.yaml']) =>
  msg: 'url: https://github.com/knative/serving/releases/download/v0.11.1/, file: foo.yaml'
ok: [localhost] => (item=[{'url': 'https://github.com/knative/serving/releases/download/v0.11.1/'}, 'many']) =>
  msg: 'url: https://github.com/knative/serving/releases/download/v0.11.1/, file: many'
ok: [localhost] => (item=[{'url': 'https://github.com/knative/serving/releases/download/v0.11.1/'}, 'more']) =>
  msg: 'url: https://github.com/knative/serving/releases/download/v0.11.1/, file: more'
ok: [localhost] => (item=[{'url': 'https://github.com/knative/eventing/releases/download/v0.11.0/'}, 'release.yaml']) =>
  msg: 'url: https://github.com/knative/eventing/releases/download/v0.11.0/, file: release.yaml'
ok: [localhost] => (item=[{'url': 'https://github.com/knative/eventing/releases/download/v0.11.0/'}, 'yamls']) =>
  msg: 'url: https://github.com/knative/eventing/releases/download/v0.11.0/, file: yamls'
ok: [localhost] => (item=[{'url': 'https://github.com/knative/eventing-contrib/releases/download/v0.11.0/'}, 'event-display.yaml']) =>
  msg: 'url: https://github.com/knative/eventing-contrib/releases/download/v0.11.0/, file: event-display.yaml'
...