У меня есть 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?
Я мог бы легко разбить их на задачи для каждого из компонентов, но я бы хотел найти лучший способ выполнить это, чтобы удовлетворить мое личное любопытство :.)