Ansible: преобразовать строку, разделенную запятыми, с парами ключ: значение в словарь
Я запускаю книгу настройки для службы создания докеров (apache solr) через дополнительные переменные. Эти переменные задаются во время выполнения, поскольку этот сборник сценариев должен быть гибким и на одном сервере существует несколько конфигураций.
Моя идея состоит в том, что пользователь может настроить переменную в ansible ui (ansible семафор) как строку:
- Имя переменной
project_cores
- Значение переменной (строка)
main_en:english,main_de:german
Я хотел бы повторить эти ядра как словарь. Что я хочу в конце:
{
{
name: main_en,
language: english
},
{
name: main_de,
language: german
},
}
Первый шаг — разделить их по,
(это уже работает):
- name: "debug: split cores"
debug:
msg: "{{ item }}"
loop: "{{ project_cores.split(',') }}"
Затем я безуспешно попробовал следующее, поскольку это не добавляет ключи подэлементов:
- name: "Extract solr cores configuration."
set_fact:
dict: "{{ dict|default({}) | combine ( { item.split(':')[0] : item.split(':')[1] } ) }}"
with_items:
- "{{ project_cores.split(',') }}"
Я протестировал некоторые комбинации, но не нашел рабочего решения по добавлению ключей.
Есть идеи, как преобразовать эту строку в реальный каталог, указанный в первом примере? заранее спасибо!
1 ответ
Приведенная ниже декларация
project_cores_dict: "{{ dict(project_cores|
split(',')|
map('split',':')) }}"
дает то, что ты хочешь
project_cores_dict:
main_de: german
main_en: english
- Пример полного сценария для тестирования
- hosts: localhost
vars:
project_cores: 'main_en:english,main_de:german'
project_cores_dict: "{{ dict(project_cores|
split(',')|
map('split',':')) }}"
tasks:
- debug:
var: project_cores_dict
- Сделайте преобразование более надежным и обрежьте элементы .
project_cores_dict: "{{ dict(project_cores|
split(',')|map('trim')|
map('split',':')|map('map', 'trim')) }}"
Попробуй это
- debug:
msg: |
{{ pcd|to_yaml }}
loop:
- 'main_en:english,main_de:german'
- 'main_en:english, main_de:german'
- 'main_en: english, main_de:german'
vars:
pcd: "{{ dict(item|
split(',')|map('trim')|
map('split',':')|map('map', 'trim')) }}"
дает (в сокращении)
msg: |-
{main_de: german, main_en: english}
msg: |-
{main_de: german, main_en: english}
msg: |-
{main_de: german, main_en: english}
Без обрезки
- debug:
msg: |
{{ pcd|to_yaml }}
loop:
- 'main_en:english,main_de:german'
- 'main_en:english, main_de:german'
- 'main_en: english,main_de:german'
vars:
pcd: "{{ dict(item|
split(',')|
map('split',':')) }}"
пробелы станут частью ключей и значений
msg: |-
{main_de: german, main_en: english}
msg: |-
{' main_de': german, main_en: english}
msg: |-
{main_de: german, main_en: ' english'}