Объедините несколько файлов в файле поиска Ansible

До сих пор я использовал простой код для развертывания стеков 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 файлом. Я уже пытался использовать список файлов, но ничего не получается. Теперь у меня нет лучшей идеи, как решить эту проблему, поэтому я буду благодарен, если вы поделитесь своими знаниями и, возможно, у кого-то есть идея, как ее решить.

0
задан 29 January 2021 в 14:07
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 .

0
ответ дан 24 April 2021 в 02:14

Теги

Похожие вопросы