Search code examples
docker-composeansiblejinja2

Ansible loop to create docker networks


Suppose I have my docker networks defined in a variable such as:

docker_networks:
  - name: default
    driver: bridge
  - name: proxy
    driver: bridge
    ipam_options:
      subnet: '192.168.100.0/24'
  - name: socket_proxy
    driver: bridge
    ipam_options:
      subnet: '192.168.101.0/24'

How would I go about running this with a loop to create these docker networks?

I tried the following, however the ipam_config parameter causes it to fail if no subnet is defined:

- name: Create networks
  docker_network:
    name: '{{ item.name }}'
    driver: '{{ item.driver | default(omit) }}'
    ipam_config:
      - subnet: '{{ item.ipam_options.subnet | default(omit) }}'
  loop: '{{ docker_networks }}'

Solution

  • If you modify your docker_networks variable so that the value of the ipam_options key is a list of dictionaries:

    docker_networks:
      - name: proxy
        driver: bridge
        ipam_options:
          - subnet: '192.168.100.0/24'
      - name: socket_proxy
        driver: bridge
        ipam_options:
          - subnet: '192.168.101.0/24'
      - name: no_subnet
        driver: bridge
    

    Then you can rewrite your task like this:

    - name: Create networks
      community.docker.docker_network:
        name: '{{ item.name }}'
        driver: '{{ item.driver | default(omit) }}'
        ipam_config: "{{ item.ipam_options | default(omit) }}"
      loop: '{{ docker_networks }}'
    

    (I would also just rename the ipam_options key to ipam_config, so that it matches the parameter name.)