--- - name: Check if YT-DLP master deployment directory exists stat: path: "{{ airflow_master_dir }}" register: master_dir_stat - name: Ensure YT-DLP master deployment directory exists file: path: "{{ airflow_master_dir }}" state: directory owner: "{{ ssh_user }}" group: "{{ deploy_group }}" mode: '0755' become: yes when: not master_dir_stat.stat.exists - name: Ensure YT-DLP master configs directory exists file: path: "{{ airflow_master_dir }}/configs" state: directory owner: "{{ ssh_user }}" group: "{{ deploy_group }}" mode: '0755' become: yes - name: "Log: Syncing YT-DLP service files" debug: msg: "Syncing YT-DLP service components (config generator, envoy/camoufox templates) to the master node." - name: Sync YT-DLP config generator to master synchronize: src: "../airflow/generate_envoy_config.py" dest: "{{ airflow_master_dir }}/" archive: yes rsync_path: "sudo rsync" rsync_opts: "{{ rsync_default_opts }}" - name: Sync YT-DLP config files to master synchronize: src: "../airflow/configs/{{ item }}" dest: "{{ airflow_master_dir }}/configs/" archive: yes recursive: yes rsync_path: "sudo rsync" rsync_opts: "{{ rsync_default_opts }}" loop: - "docker-compose-ytdlp-ops.yaml.j2" - "docker-compose.config-generate.yaml" - "envoy.yaml.j2" - name: Create .env file for YT-DLP master service template: src: "../../templates/.env.j2" dest: "{{ airflow_master_dir }}/.env" mode: "{{ file_permissions }}" owner: "{{ ssh_user }}" group: "{{ deploy_group }}" become: yes vars: service_role: "management" server_identity: "ytdlp-ops-service-mgmt" - name: Template docker-compose file for YT-DLP master service template: src: "../airflow/configs/docker-compose-ytdlp-ops.yaml.j2" dest: "{{ airflow_master_dir }}/configs/docker-compose-ytdlp-ops.yaml" mode: "{{ file_permissions }}" owner: "{{ ssh_user }}" group: "{{ deploy_group }}" become: yes vars: service_role: "management" - name: "Log: Generating YT-DLP service configurations" debug: msg: "Running the configuration generator script inside a temporary Docker container. This creates docker-compose and envoy files based on .env variables." - name: Ensure envoy.yaml is removed before generation file: path: "{{ airflow_master_dir }}/envoy.yaml" state: absent become: yes - name: Generate YT-DLP service configurations shell: cmd: "docker compose --project-directory . --env-file .env -f configs/docker-compose.config-generate.yaml run --rm config-generator" chdir: "{{ airflow_master_dir }}" become: yes become_user: "{{ ssh_user }}" - name: Pull YT-DLP service image community.docker.docker_image: name: "{{ ytdlp_ops_image }}" source: pull when: not fast_deploy | default(false) - name: Ensure correct permissions for build context after generation file: path: "{{ airflow_master_dir }}" state: directory owner: "{{ ssh_user }}" group: "{{ deploy_group }}" recurse: yes become: yes - name: Create dummy camoufox compose file for master to prevent errors copy: content: | # This is a placeholder file. # The master node does not run Camoufox, but the shared docker-compose-ytdlp-ops.yaml # may unconditionally include this file, causing an error if it's missing. # This file provides an empty services block to satisfy the include. services: {} dest: "{{ airflow_master_dir }}/configs/docker-compose.camoufox.yaml" mode: "{{ file_permissions }}" owner: "{{ ssh_user }}" group: "{{ deploy_group }}" become: yes - name: "Log: Starting YT-DLP management service" debug: msg: "Starting the YT-DLP management service on the master node. This service handles account and proxy management." - name: Start YT-DLP master service community.docker.docker_compose_v2: project_src: "{{ airflow_master_dir }}" files: - "configs/docker-compose-ytdlp-ops.yaml" state: present remove_orphans: true pull: "{{ 'never' if fast_deploy | default(false) else 'missing' }}"