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'}
Другие вопросы по тегам