合并 Ansible 查找文件中的几个文件

合并 Ansible 查找文件中的几个文件

到目前为止,我使用简单的代码来部署 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

相关内容