到目前为止,我使用简单的代码来部署 Docker 堆栈。我不想使用社区.general.docker_stack模块,因为它的要求很荒谬:堆栈定义(docker compose yml 文件)需要放在远程节点,而我希望将它们全部集中在本地管理器主机上。示例代码如下(角色/任务和变量的一部分):
- 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
到目前为止,一切顺利。使用适当的 Compose 文件(放置在 files/docker_swarm/stacks 中),它工作得很好。一个堆栈由一个 yml 文件创建(当然,一个 yml 文件可用于创建具有不同名称的类似堆栈)。但我想改进它,这里有一个很大的问题:我想能够使用(合并)多个 Compose 文件作为 1 个堆栈的定义,但"{{lookup('文件', '路径/到/文件.txt')}}"仅限于 1 个文件。我已经尝试使用文件列表,但失败了。现在我不知道如何解决这个问题,所以如果您能分享您的知识,我将不胜感激,也许有人知道如何解决这个问题。
答案1
您需要一个大型组合 YAML 文件。查找过滤器仅将单个文件“读入”变量。因此,您需要循环遍历所有文件并将文件内容读入一个“变量” - 因此您将每个字典变量组合起来。该变量就是您要发送给 docker 命令的内容。
下面是一个例子:
- 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 是否真的很好地组合并正确导入(尤其是字典中有重复键的情况)。如果它不起作用,您可以使用 测试查找结果debug
。