До сих пор я использовал простой код для развертывания стеков Docker. Я не хочу использовать модуль community.general.docker_stack из-за его нелепого требования: определение стека (docker compose yml файл) должно быть размещено на удаленном узле, в то время как я хочу, чтобы все они были собраны на локальном узле менеджера. Пример кода ниже (часть role/tasks и vars):
- name: deploy Docker stacks
command: docker stack deploy --compose-file - {{ item.name }}
args:
stdin: "{{ lookup('file', item.source) }}"
with_items: "{{ docker_swarm_stacks }}"
when: (docker_swarm_stacks is defined)
docker_swarm_stacks:
- name: portainer
source: files/docker_swarm/stacks/portainer.yml
- name: www-1
source: files/docker_swarm/stacks/nginx-static.yml
- name: www-2
source: files/docker_swarm/stacks/wordpress.yml
Пока все хорошо. При наличии соответствующих композитных файлов (размещенных в файлах/docker_swarm/stacks) все работает очень хорошо. Один стек создается из одного yml файла (конечно, один yml файл может быть использован для создания похожих стеков с разными именами). Но я хотел бы улучшить это, и здесь есть большая проблема: Я хотел бы сделать возможным использование (слияние) многих составных файлов в качестве определений для 1 стека, но "{{lookup('file', 'path/to/file.txt')}}" ограничен 1 файлом. Я уже пытался использовать список файлов, но ничего не получается. Теперь у меня нет лучшей идеи, как решить эту проблему, поэтому я буду благодарен, если вы поделитесь своими знаниями и, возможно, у кого-то есть идея, как ее решить.
Вам нужен один большой комбинированный файл YAML. Фильтр поиска «считывает» только один файл в переменную. Итак, вам нужен цикл по всем файлам и чтение содержимого из файлов в одну «переменную», поэтому вы объединяете каждый dict-var. И эта переменная - это что-то, что вы отправляете команде докера.
Вот пример:
- name: "Define an empty definition"
set_fact:
combined_config: {}
- name: "Load all definitions into the definition"
set_fact:
combined_config: "{{ combined_config | combine(lookup('file', item.source)) }}"
loop: "{{ docker_swarm_stacks | default([]) }}"
- name: "Deploy Docker stacks"
command: docker stack deploy --compose-file - {{ item.name }}
args:
stdin: "{{ combined_config }}"
Я не проверял, действительно ли YAML хорошо скомбинирован и правильно импортирован (особенно с повторяющимися ключами в dict). Если он не работает, вы можете проверить результат поиска с помощью debug
.