Рейтинг:1

Ansible: преобразовать строку в словарь

флаг eg

Запускаю Ansible из Tower, потом заливаю новых пользователей текстом:

{имя: user1, uid: 5000}
{имя: пользователь2, идентификатор пользователя: 5001}

Я хотел бы повторить этих пользователей как словарь, например:

- имя: Печать варов
  отлаживать:
    переменная: "{{ item.name }}"
  with_items: "{{users.split('\n') }}"

Но это не работает:

TASK [Переменные печати] *************************************************** ******************************************************* **********************
ok: [lx-test] => (item={ name: user1, uid: 5000 }) => {
    "ansible_loop_var": "элемент",
    "item": "{имя: user1, uid: 5000}",
    "{ name: user1, uid: 5000 }": "ПЕРЕМЕННАЯ НЕ ОПРЕДЕЛЕНА!"
}
ok: [lx-test] => (item={ name: user2, uid: 5001 }) => {
    "ansible_loop_var": "элемент",
    "item": "{имя: user2, uid: 5001}",
    "{ name: user2, uid: 5001 }": "ПЕРЕМЕННАЯ НЕ ОПРЕДЕЛЕНА!"
}

Любая идея, как преобразовать эту строку в настоящий словарь? Заранее спасибо!

Рейтинг:1
флаг br

Обновлять

Выражение ниже

users_list: "{{users_str.splitlines()|карта('from_yaml')|список }}"

дает

список_пользователей:
  - имя: пользователь1
    ид: 5000
  - имя: пользователь2
    ИД: 5001

Объявите переменную как соответствующий.


Оригинальный ответ

Текст не является допустимым ни JSON, ни YAML. Вам придется разбивать строки и читать словари построчно. Например, учитывая текст

user_str: |
  {имя: user1, uid: 5000}
  {имя: пользователь2, идентификатор пользователя: 5001}

задание ниже

    - set_fact:
        users_list: "{{users_list|d([]) + [item|from_yaml] }}"
      цикл: "{{users_str.splitlines() }}"

создает список словарей

список_пользователей:
  - имя: пользователь1
    ид: 5000
  - имя: пользователь2
    ИД: 5001

Итерация тривиальна сейчас

    - отладка:
        переменная: item.name
      цикл: "{{user_list}}"

дает

  имя элемента: user1
  имя элемента: user2
Costales avatar
флаг eg
Отличный ответ, работает отлично! Большое спасибо Владимир
Francisco Rebolledo avatar
флаг us
Спасибо! ваши решения сработали потрясающе. Но не могли бы вы объяснить, что делает users_list: "{{users_list|d([]) + [item|from_yaml] }}"? Спасибо!
флаг br
Конечно. Выражение объединяет список. «d» является псевдонимом «по умолчанию». «Элемент» — это строка, поэтому она должна быть преобразована фильтром «from_yaml». Возможно, вы захотите разложить цикл и увидеть его самостоятельно.
флаг br
См. упрощенный код.

Ответить или комментировать

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