#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 }}