- name: Deploy a basic Nginx container hosts: webservers become: true tasks: - name: Ensure Docker is installed apt: name: docker.io state: present update_cache: yes - name: Ensure pip is installed apt: name: pip state: present update_cache: yes - name: Ensure Python Docker module is installed apt: name: python3-docker state: present - name: Ensure web root exists file: path: /data state: directory - name: Ensure user directory exists file: path: /data/{{ user_id }} state: directory - name: Ensure web root exists file: path: /data/{{ user_id }}/{{ site }} state: directory - name: Copy all files from local dir to remote dir synchronize: src: "../files/{{ user_id }}/{{ site }}/" dest: "/data/{{ user_id }}/{{ site }}/" recursive: yes delete: no - name: Build dynamic Traefik labels set_fact: traefik_labels: "{{traefik_labels | default({}) | combine ({ item.key : item.value }) }}" with_items: - { 'key': 'traefik.enable', 'value': 'true'} - { 'key': 'traefik.http.routers.site-{{ user_id }}-{{ site }}.rule', 'value': 'Host(`{{ domain }}`)'} - { 'key': 'traefik.http.routers.site-{{ user_id }}-{{ site }}.entrypoints', 'value': 'websecure'} - { 'key': 'traefik.http.services.site-{{ user_id }}-{{ site }}.loadbalancer.server.port', 'value': '80'} - { 'key': 'traefik.http.routers.site-{{ user_id }}-{{ site }}.tls.certresolver', 'value': 'le'} - name: Run Nginx container docker_container: name: nginx-{{ user_id }}-{{ site }} image: nginx:alpine state: started restart_policy: always networks: - name: traefik labels: "{{ traefik_labels }}" volumes: - "/data/{{ user_id }}/{{ site }}:/usr/share/nginx/html:ro"