首页 > 解决方案 > 在ansible中创建一个带有循环的docker-compose

问题描述

我需要基于 yml 文件构建一个 docker compose。在下一个 yml 中,它将是每个服务的名称、图像和版本。

"services":
  - "service": "front"
    "image": "acalls-caselog-web-app"
    "version": "latest" 
  - "service": "back"
    "image": "acalls-caselog-web-service"
    "version": "latest" 
  - "service": "vb"
    "image": "acalls-caselog-vb-service"
    "version": "latest" 
  - "service": "salesforce"
    "image": "acalls-caselog-salesforce-app-service"
    "version": "latest"  
  - "service": "tts"
    "image": "ydilo-tts-service"
    "version": "latest" 
  - "service": "ai classifier"
    "image": "acalls-caselog-ai-classifier-service"
    "version": "latest"  

到目前为止,我有一个数组来设置 docker compose 中的每个图像,就像这样

version: "3.3"
services:
  front:
    image: url/{{services[0].image}}:{{services[0].version}}
    ports: 
      - "81:81"
    extra_hosts:
      - "backend:172.32.3.46" 
    environment:
      profile: preproduction
  back:
    image: url/{{services[1].image}}:{{services[1].version}}
    ports: 
      - "20101:20101"
    environment:
      profile: preproduction
  saleforce:
    image: url/{{services[2].image}}:{{services[2].version}}
    ports:
      - "20103:20103"
    environment:
      profile: preproduction

但是我需要找到一种方法来动态地使用 ansible 任务中的循环来实现这一点,例如,在 docker-compose 文件中没有数组位置。

主.yml

---
  - name: stop container
    ignore_errors: yes
    become: True
    shell:
      cmd: "docker-compose down"
      chdir: dir

  - name: set docker-compose
    template:
      src: docker-compose-acalls.yml.j2
      dest: dir/docker-compose.yml
      mode: 0700

  - name: Run container
    become: True
    shell:
      cmd: "nohup docker-compose -f docker-compose.yml up -d"
      chdir: dir

标签: docker-composeansibleyaml

解决方案


您创建了一个模板文件:您必须使用空格%--%来调整位置,我刚刚给出了总体思路

version: "3.3"
services:
{% for item in services %}
  {{ item.service }}:
{% if item.image is defined %}
    image: url/{{item.image}}:{{item.version}} 
{%- endif %}     
{% if item.ports is defined %}
    ports: 
      - "{{ item.ports[0] }}"
{%- endif %}
{% if item.extra_hosts is defined %} 
    extra_hosts:
      - "{{ item.extra_hosts[0] }}"
{%- endif %}
{% if item.environment is defined %} 
    environment:
      - profile: {{ item.environment.profile }}
{% endif %}
{% endfor %}

你的剧本:

- name: test
  hosts: localhost
  vars_files:
    - reference.yml   
  tasks:
    template:
      src: fileconf.j2
      dest: composedocker.yml

和您的 reference.yml 文件:

services:
  - service: "front"
    image: "acalls-caselog-web-app"
    ports: 
      - "81:81"
    extra_hostss:
      - "backend:172.32.3.46" 
    environment:
      profile: preproduction
    version: "latest"
  - service: "back"
    image: "acalls-caselog-web-service"
    version: "latest"
    ports: 
      - "20101:20101"
    environment:
      profile: preproduction    
  - service: "vb"
    image: "acalls-caselog-vb-service"
    version: "latest"
  - service: "salesforce"
    image: "acalls-caselog-salesforce-app-service"
    version: "latest"
    ports:
      - "20103:20103"
    environment:
      profile: preproduction
  - service: "tts"
    image: "ydilo-tts-service"
    version: "latest"
  - service: "ai classifier"
    image: "acalls-caselog-ai-classifier-service"
    version: "latest"

结果:

version: "3.3"
services:
  front:
    image: url/acalls-caselog-web-app:latest     
    ports: 
      - "81:81" 
    extra_hosts:
      - "backend:172.32.3.46" 
    environment:
      - profile: preproduction
  back:
    image: url/acalls-caselog-web-service:latest     
    ports: 
      - "20101:20101" 
    environment:
      - profile: preproduction
  vb:
    image: url/acalls-caselog-vb-service:latest     
  salesforce:
    image: url/acalls-caselog-salesforce-app-service:latest     
    ports: 
      - "20103:20103" 
    environment:
      - profile: preproduction
  tts:
    image: url/ydilo-tts-service:latest     
  ai classifier:
    image: url/acalls-caselog-ai-classifier-service:latest    

推荐阅读