首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并Ansible查找文件中的几个文件

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

Server Fault用户
提问于 2021-01-29 12:07:55
回答 1查看 1.8K关注 0票数 0

到目前为止,我使用简单的代码来部署Docker堆栈。我不想使用community.general.docker_stack模块,因为它的要求很荒谬:堆栈定义(docker文件)需要放在远程节点上,而我希望将它们全部收集到本地管理器主机上。示例代码如下(角色/任务和vars的一部分):

代码语言:javascript
复制
- 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)
代码语言:javascript
复制
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/stack),它的工作效果非常好。一个堆栈是从一个yml文件创建的(当然,一个yml文件可以用来创建具有不同名称的类似堆栈)。但是我想改进它,这里有一个很大的问题:我希望能够使用(合并)许多组合文件作为一个堆栈的定义,但是“{lookup(‘file’,‘path/ to /file.txt’)}”仅限于一个文件。我已经尝试过使用文件列表,但是失败了。现在我没有更好的办法解决它,所以如果你能分享你的知识,也许有人知道如何解决它,我会很感激。

EN

回答 1

Server Fault用户

发布于 2021-02-02 12:22:29

你需要一个大的合并的YAML文件。查找过滤器只将单个文件“读取”到变量中。因此,您需要的是对所有文件进行循环,并将文件中的内容读取到一个“变量”中,这样就可以将每个dict组合起来。这个变量就是,发送到docker命令。

这里有一个例子:

代码语言:javascript
复制
- 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
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1051657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档