Выдернуть мои волосы. Я знаю, что сделал это 10 * 1034 годами с более старыми версиями ansible. Я почти не трогал ansible, поэтому не помню, как я это сделал. На первый взгляд это кажется смехотворно простым, так что, очевидно, что-то глупое, что я упускаю из виду.
Учитывая пример инвентаризации, ничего особенного:
Примечание: для краткости удалите полные доменные имена. Примечание: эта автоматизация работает с большим количеством хостов и множеством переменных, чем я здесь представляю. Это в основном дурацкий пример.
[nodes]
foo1
foo2
foo3
[all:vars]
minio_proto=http
disks_per_node=64
В конечном итоге мне нужно построить строку, которая обернет текст вокруг имен хостов. Это для мини, если вы знакомы с ним.
Вы запускаете сервер, указав все узлы и пути к дискам:
minio server http://foo1/data/disk{0...79} http://foo2/data/disk{0...63} http://foo3/data/disk{0...63}
Так что в моей игре мне нужно построить эту строку, которая в итоге будет передана команде оболочки, чтобы запустить сервер на каждом узле.
Итак, у меня есть книга игр (в конечном итоге это будет роль), которая будет запущена один раз, а не для каждого хоста, просто для создания этого параметра сервера.
I ' Я перепробовал так много разных вещей, что я не могу перечислить их все, но вот лишь один из моих последних уловок:
---
- hosts: all
gather_facts: false
become: true
ignore_errors: false
vars:
minio_startup1: []
minio_startup2: []
tasks:
- name: Verifying hosts are up and we can become root
become: true
ping:
# THIS WORKS FINE, APPENDING A SIMPLE VARIABLE WORKS
- name: Building minio startup parameter
set_fact:
minio_startup1: "{{ minio_startup1 + [item] }}"
with_items:
- "{{ ansible_play_hosts }}"
- debug: var=minio_startup1
# DOING STUFF LIKE THIS DOES NOT WORK
- name: Building minio startup parameter
set_fact:
minio_startup2: "{{ minio_startup2 }} + [{{ minio_proto }}//{{ item }}/data{0...{{ disks_per_node|int - 1 }}}] }}"
with_items:
- "{{ ansible_play_hosts }}"
- debug: var=minio_startup2
В основном на этом этапе в книге воспроизведения я хочу список, который выглядит следующим образом:
[ 'http://foo1/data{0...63}', 'http://foo2/data{0...63}', 'http://foo2/data{0...63}']
Затем, позже, в сборнике пьес, я могу объединить это в одну строку и передать свой контейнер minio с помощью команды оболочки:
{{ minio_startup|join(' ') }}
Я знаю, что делал это годами go, но после 3 часов стягивания волос это ускользает от меня.
* ОБНОВЛЕНИЕ *
Ну, я нашел способ, не уверен, что это лучше. Если интересно, это то, что я сделал. Похоже, вы можете использовать '~' для объединения элементов внутри []. Мне все еще приходилось делать математику определения конечного номера диска в отдельной переменной. (disk_ending_index)
minio_startup2: "{{ minio_startup2 + [ minio_proto ~ '//' ~ item ~ '/data{0...' ~ disk_ending_index ~ '}' ] }}"