Как отредактировать факт в Ansible

#loops #ansible

Вопрос:

У меня в моем сборнике игр ansible есть диктант, который похож на:

   "fact_one": true,
  "fact_two": true,
  "disks": [
    {
      "name": "/dev/sda"
    },
    {
      "name": "/dev/sdb"
    },
    {
      "name": "/dev/sdc"
    }
  ],
}
 

Итак, теперь мне нужно выполнить цикл по элементам дисков, а затем обновить каждую запись на дисках новой переменной с именем ID. Итак, мой новый диктант должен выглядеть так:

   "fact_two": true,
  "disks": [
    {
      "name": "/dev/sda"
      "id": "id001"
    },
    {
      "name": "/dev/sdb"
      "id": "id002"
    },
    {
      "name": "/dev/sdc"
      "id": "id003"
    }
  ],
}
 

Кроме того, как вы можете видеть, мой идентификатор-это счетчик, который следует добавлять в 1 на каждой итерации.

Как я могу написать такой цикл в Ansible ? Я хочу обновить существующие факты, а не создавать новые.

Ответ №1:

Одно из решений заключается в следующем:

 set_fact:
  disks: |
    {% set result = [] %}
    {% for d in disks %} 
    {%   set _ = result.append('name': d.name, 'id': 'id00'   loop.index | str) %}
    {% endfor %}
    {{ result }}
 

или

 set_fact:
  disks: |
    {% set result = [] %}
    {% for d in disks %} 
    {%   set item = d %}
    {%   set _ = item.update('id': 'id00'   loop.index) | str ) %}        
    {%   set _ = result.append(item) %}
    {% endfor %}
    {{ result }}