--- # Доступ к приватному реестру cr.yandex (аутентификация json_key). # # Три независимых потребителя, каждому нужен свой способ: # 1. docker на хосте — образы сервисов compose (backend, frontend, ...) # 2. containerd на нодах — образы подов; /etc/rancher/k3s/registries.yaml # 3. source-controller Flux — OCI-чарты; Secret yc-cr-auth в flux-system # # Ключ читается с control-node и на целевой хост в открытом виде не кладётся # (кроме короткого окна для docker login, см. ниже). - name: Проверить наличие ключа реестра на control-node ansible.builtin.stat: path: "{{ registry_key_src }}" delegate_to: localhost become: false register: registry_key_stat tags: [login, registry] - name: Прервать деплой, если ключа нет ansible.builtin.fail: msg: | Не найден ключ сервисного аккаунта: {{ registry_key_src }} Без него не поедет ни один компонент — все чарты и образы лежат в приватном реестре {{ registry_host }}. Укажите актуальный путь: uv run poe platform -- -e registry_key_src=/path/to/authorized_key.json when: not registry_key_stat.stat.exists tags: [login, registry] - name: Прочитать ключ реестра с control-node ansible.builtin.set_fact: registry_key_content: "{{ lookup('file', registry_key_src) }}" no_log: true tags: [login, registry] # --- 1. docker на хосте ---------------------------------------------------- - name: Проверить, выполнен ли вход в реестр ansible.builtin.command: grep -q "{{ registry_host }}" /root/.docker/config.json register: registry_login_state changed_when: false failed_when: false tags: [login] - name: Скопировать ключ реестра на хост (временно) ansible.builtin.copy: content: "{{ registry_key_content }}" dest: "{{ registry_key_dest }}" mode: "0600" when: registry_login_state.rc != 0 no_log: true tags: [login] - name: docker login в приватный реестр ansible.builtin.shell: >- set -o pipefail && cat {{ registry_key_dest | quote }} | docker login --username {{ registry_username }} --password-stdin {{ registry_host }} args: executable: /bin/bash when: registry_login_state.rc != 0 register: registry_login_result changed_when: "'Login Succeeded' in registry_login_result.stdout" no_log: true tags: [login] # helm на хосте может отсутствовать — он нужен только для ручной отладки. # Flux чарты тянет сам, по секрету yc-cr-auth, а не через helm CLI. - name: Проверить наличие helm на хосте ansible.builtin.command: which helm register: registry_helm_present changed_when: false failed_when: false tags: [login] - name: helm registry login (если helm установлен) ansible.builtin.shell: >- set -o pipefail && cat {{ registry_key_dest | quote }} | helm registry login {{ registry_host }} --username {{ registry_username }} --password-stdin args: executable: /bin/bash when: - registry_helm_present.rc == 0 - registry_login_state.rc != 0 register: registry_helm_login changed_when: "'Login Succeeded' in registry_helm_login.stdout" no_log: true tags: [login] - name: Удалить временный ключ реестра с хоста ansible.builtin.file: path: "{{ registry_key_dest }}" state: absent tags: [login] # --- 2. containerd на нодах k3s ------------------------------------------- # Монтируется во все ноды (см. docker-compose.yaml). Изменение файла требует # перезапуска нод — k3s читает registries.yaml только на старте. - name: Отрендерить registries.yaml для нод k3s ansible.builtin.template: src: registries.yaml.j2 dest: "{{ deploy_dir }}/k3s/registries.yaml" owner: root group: root mode: "0600" no_log: true tags: [registry] # Секреты доступа в самом кластере создаются отдельно (registry-secrets.yml): # они требуют уже поднятого k3s, поэтому включаются из platform.yml после # первой волны, а не здесь.