Используйте переменную списка словарей при опросе Ansible Tower textare - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь разработать сборник пьес, если у меня есть следующая переменная.

disk_vars:
 - { Unit: C, Size: 50 }
 - { Unit: D, Size: 50 }

С переменными, определенными в пьесе, проблем нет, но когда я пытаюсь использовать опрос texarea на Ansible Tower, я не могу разобрать их как список словарей.

Я попытался добавить к опросу следующие две строки, которые уже имеют формат yaml.

 - { Unit: C, Size: 50 }
 - { Unit: D, Size: 50 }

И в моем разделе vars я использую test_var: "{{test_var1.split ('\ n')}} который преобразует выходные данные в строку из двух строк. Без разбиения это просто строка из одной строки.

Я мог бы заставить мою пьесу работать с простым словарем вроде

dict1: {{ Unit: C, Size: 50 }} 

, но я также возникают проблемы при его разборе.

РЕДАКТИРОВАТЬ

Изменение его на следующее, как предложено mdaniels works.

- set_fact:
   test_var: "{{ test_var1 | from_yaml }}"
- name: test
 debug: msg=" hostname is {{ item.Unit }} and {{ item.Size }}"
 with_items:
  - "{{ test_var }}"   

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

попытался изменить дату ввода на следующую, но я не мог понять, как отформатировать это в список словарей.

disk_vars:
 Unit: C, Size: 50
 Unit: D, Size: 50
* 102 7 * Я попытался использовать следующий фрагмент кода
- set_fact:
db_list: >-
  {{ test_var1.split("\n") | select | 
     map("regex_replace", "^", "- {") | 
     map("regex_replace", "$", "}") | 
     join("\n") }}

Но помещаю все это в одну строку.

"db_list": "- {dbid: 1, dbname: abc\ndbid: 2, dbname: xyz} "

Я пытался поиграть с ним, но не смог заставить это работать.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Я столкнулся с подобной дилеммой, то есть с тем, что я был связан с доступным форматом (ами) опроса, и я был вынужден использовать предложенное выше решение mdaniels с отправкой данных в виде текста, а затем анализировать их из YAML. Проблема, однако, заключалась в том, что управление форматом ввода (то есть YAML-строкой внутри текста), вероятно, вызвало бы много головной боли / ошибок, как вы описали.
Может быть, вам действительно нужно использовать Survey, но в моем случае мне было более интересно вызвать шаблон работы с помощью Tower REST API. По какой-то причине я подумал, что мне нужно провести опрос со всеми определенными параметрами. Но оказалось, что я был не прав, когда во время опроса я не смог предоставить словари в качестве входных данных (в extra_vars). Однако при удалении Survey, а также (не уверен, требуется ли это или нет) включение «Extra Variables -> приглашение при запуске», все стало работать !! Теперь я могу предоставить списки / словари в качестве входных данных для моих шаблонов при вызове их с помощью вызовов PEST API REST, см. Пример ниже:

{
    "extra_vars": {
        "p_db_name": "MYSUPERDB",
        "p_appl_id": "MYD32",
        "p_admin_user": "myadmin",
        "p_admin_pass": "mysuperpwd",
        "p_db_state": "present",
        "p_tablespaces": [
        { 
            "name": "tomahawk",
            "size": "10M",
            "bigfile": true,
            "autoextend": true,
            "next": "1M",
            "maxsize": "20M",
            "content": "permanent",
            "state": "present"
        }
        ],
        "p_users": [
        {                        
            "schema": "myschema",
            "password": "Mypass123456#",
            "default_tablespace": "tomahawk",
            "state": "present",
            "grants": "'create session', 'create any table'"
        }
        ]
    }
}
0 голосов
/ 16 января 2020

Я полагаю, вы были очень близки; вместо "{{ test_var1.split('\n') }}" Полагаю, вы можете просто подать его на фильтр from_yaml :

- set_fact:
     test_var1: '{{ test_var1 | from_yaml }}'
  # this is just to simulate the **str** that you will receive from the textarea
  vars:
     test_var1: "- { Unit: C, Size: 50 }\n- { Unit: D, Size: 50 }\n"
- debug:
     msg: and now test_var1[0].Unit is {{ test_var1[0].Unit }}
...