Рейтинг:1

Возможность обновлять список словарей на основе определенного условия

флаг bz

Я хотел обновить список с помощью ansible, который содержит элементы словаря на основе определенных условий.

Например:

список1:
  - {"имя": "test1", "uid": 100, "gid": 250}
  - {"имя": "test2", "uid": 101, "gid": 250}
  - {"имя": "test3", "uid": 103, "gid": 250}
  - {"имя": "test4", "uid": 104, "gid": 250}

список2: [100, 101]

список3: [102,103]

если uid совпадает с элементом в списке2, он изменится gid=300, а если совпадает со списком3, он обновит его как 400, остальные элементы останутся прежними в списке1

Пожалуйста, предложите, как я могу создать список1 с указанными выше условиями.

флаг sv
Добро пожаловать в ServerFault. Если ответ полезен, пожалуйста, проголосуйте за него и, возможно, отметьте его как правильный ответ, если он действительно решил вопрос.
Рейтинг:1
флаг br

Например

    - set_fact:
        l4: "{{ l4|d([]) + [item|combine({'gid': _gid|from_yaml})] }}"
      цикл: "{{ список1 }}"
      вары:
        _гид: |
          {% если item.uid в списке2 %}
          300
          {% elif item.uid в списке3 %}
          400
          {% еще %}
          {{item.gid}}
          {% конец%}

дает

  l4|to_yaml: |-
    - {гид: 300, имя: тест1, ИД: 100}
    - {гид: 300, имя: тест2, ИД: 101}
    - {гид: 400, имя: test3, ИД: 103}
    - {gid: 250, имя: test4, uid: 104}

Обновлять

Нет необходимости повторять список в Ansible 2.12 и более поздних версиях. Вместо этого обновите список в канале. Выражения ниже дают тот же результат

dict_default: "{{ list1|items2dict(key_name='uid', value_name='gid') }}"
dict_x: "{{ dict_default|
            объединить (дикт (список2 | продукт ([300]) + список3 | продукт ([400]))) }}"
gid_x: "{{ list1|map(attribute='uid')|map('extract', dict_x)|list }}"
gid_x_update: "{{ gid_x|карта('community.general.dict_kv', 'gid')|список }}"
list4: "{{ list1|zip(gid_x_update)|map('combine')|list }}"
Подробности
дикт_по умолчанию:
  100: 250
  101: 250
  103: 250
  104: 250

дикт_х:
  100: 300
  101: 300
  102: 400
  103: 400
  104: 250

гид_х:
  - 300
  - 300
  - 400
  - 250

гид_х_обновление:
  - Гид: 300
  - Гид: 300
  - Гид: 400
  - Гид: 250
Sandeep avatar
флаг bz
Спасибо, Владимир Ботка, за работу с предоставленным решением.

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

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