LINUX.ORG.RU
решено ФорумAdmin

ansible - итерация через list of lists

 ,


0

1

Есть некоторый набор пар [src, dest]. Я хочу пройтись по структуре вида:

- [ src1, dest1 ]
- [ src2, dest2 ]
- [ src3, dest3 ]
и сделать для каждой пары copy: src="{{ item.0 }}" dest="{{ item.1 }}". Но при использовании with_items оно просто выдаёт их как единый массив, и из каждой строки выделяет первую и вторую буквы. Сейчас я вышел из положения так:
with_together:
- [ src1, src2, src3 ]
- [ dest1, dest2, dest3 ]
Можно ли как-то сделать как в первом варианте?

★★★

Ответ на: комментарий от selivan

я такого не видел. но тут как раз видно прелесть ансибла — написать такой лукап плагин очень просто.

вот тут примеры существующих плагинов: https://github.com/ansible/ansible/tree/devel/lib/ansible/runner/lookup_plugins. стоит посмотреть например flattened и indexed_items. попробуй накатать по аналогии. у тебя будет что-то вроде:

def get_items(terms):
    return [(term[0], term[1]) for term in terms]

если не выйдет, касуй, гляну подробнее (сейчас нет времени попробовать)

val-amart ★★★★★ ()
Ответ на: комментарий от anton_jugatsu

не оно. я так понял у него структура типа [[src1, dst1], [src2, dst2], [src3, dst3]] и айтемы надо получить как (srcX, dstX) на каждой итерации.

val-amart ★★★★★ ()
Ответ на: комментарий от val-amart

В продакшене без этого обошёлся, а для тренировки сделал. Вот сей мегасложный сверхоптимизированный код:

def get_items(terms):
    return terms
После этого задание
- name: test iteration
  debug: msg="{{ item.0 }} and {{ item.1 }}"
  with_list_of_lists:
    - [ 'one', 'two' ]
    - [ 'three', four' ]
выдаёт, как и положено:
TASK: [test | test iteration] ************************************************* 
ok: [puppet-node-1] => (item=['one', 'two']) => {
    "item": [
        "one", 
        "two"
    ], 
    "msg": "one and two"
}
ok: [puppet-node-1] => (item=['three', "four'"]) => {
    "item": [
        "three", 
        "four'"
    ], 
    "msg": "three and four'"
}
То же задание с with_items выдаёт следующее:
ok: [puppet-node-1] => (item=one) => {
    "item": "one", 
    "msg": "o and n"
}
ok: [puppet-node-1] => (item=two) => {
    "item": "two", 
    "msg": "t and w"
}
ok: [puppet-node-1] => (item=three) => {
    "item": "three", 
    "msg": "t and h"
}
ok: [puppet-node-1] => (item=four') => {
    "item": "four'", 
    "msg": "f and o"
}
При этом по списку словарей, например, ансибл итерирует вполне нормально.

Поржал.

З.Ы. Ansible - жутко клёвая штука. Жаль, винду не умеет, для гетерогенной инфраструктуры всяческий puppet по-прежнему предпочтительней.

selivan ★★★ ()
Ответ на: комментарий от val-amart

Мне даже на гитхаб как-то стыдно выкладывать стало, название репозитория было бы длиннее кода :)

selivan ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.