DevOps

Настройка docker login ansible для Docker Hub с PAT

Пошаговое руководство по настройке авторизации в Docker Hub с модулем community.docker.docker_login в Ansible. Решение ошибки 'Not supported URL scheme http+docker', PAT, полный playbook и лучшие практики ansible docker.

Как настроить авторизацию в Docker Hub с помощью модуля community.docker.docker_login в Ansible?

Проблема

При выполнении задачи возникает ошибка:

TASK [Login to Docker Hub] ***************************************************************************************************************************************************************************************
fatal: [build_server]: FAILED! => {"changed": false, "msg": "Error connecting: Error while fetching server API version: Not supported URL scheme http+docker"}

Код задачи

yaml
- name: Authorization on Docker Hub
 hosts: docker

 tasks:
 - name: Login on Docker Hub
 community.docker.docker_login:
 username: nihi1ist
 password: {{ user_password }}

Предполагаю, что проблема связана с использованием PAT (Personal Access Token). Поделитесь опытом успешного использования этого модуля и укажите, что может быть не так в моей конфигурации?

Модуль community.docker.docker_login в Ansible Docker идеально подходит для авторизации в Docker Hub — просто укажите логин и Personal Access Token (PAT) как пароль. Ошибка “Error while fetching server API version: Not supported URL scheme http+docker” возникает из-за неверной переменной DOCKER_HOST, её легко фиксить, добавив docker_host: unix:///var/run/docker.sock. С PAT всё работает как часы: создайте токен в настройках Docker Hub и используйте вместо пароля для безопасности.


Содержание


Что такое модуль docker login ansible и зачем он нужен

Представьте: вы разворачиваете контейнеры на удалённом сервере через Ansible Docker, а авторизация в приватный репо Docker Hub каждый раз вручную? Бред. Модуль docker login ansible из коллекции community.docker автоматизирует это на раз.

Он подключается к Docker-демону, авторизуется под вашим аккаунтом (nihi1ist в вашем случае) и сохраняет креды в ~/.docker/config.json. Почему PAT? Пароль от аккаунта устарел — токены безопаснее, их можно отозвать в один клик.

А ещё модуль работает с разными реестрами: Docker Hub, quay.io, даже приватными. Но в вашем коде проблема не в PAT, а в соединении с демоном. Давайте разберём по шагам.

В официальной документации Ansible чётко пишут: нужен Docker SDK for Python. Без него — крах.


Установка коллекции community docker и зависимостей

Сначала коллекция. Без неё модуль docker login ansible не запустится.

Выполните:

ansible-galaxy collection install community.docker

Это скачает всё из Ansible Galaxy. Версия на 2025 год — 3.x, совместима с Ansible 2.14+.

Дальше — Python-зависимости на целевом хосте (build_server). Docker SDK:

pip install docker

Или в playbook:

yaml
- name: Install Docker SDK
 pip:
 name: docker
 state: present

Проверьте Docker на сервере: docker version. Если демон не запущен — systemctl start docker.

В вашем случае хост “docker”, но ошибка на build_server. Убедитесь, что inventory правильно настроен. Без этих шагов Ansible Docker даже не увидит демона.

А если CentOS/RHEL? Добавьте репозиторий Docker CE из docker community edition.

Коротко: коллекция + SDK + running Docker = база для docker login ansible.


Настройка авторизации в Docker Hub с PAT

PAT — ваш лучший друг. Зайдите в Docker Hub → Settings → Security, создайте токен с правами read/write. Скопируйте.

В таске:

yaml
- name: Login to Docker Hub
 community.docker.docker_login:
 username: nihi1ist
 password: "{{ user_password }}" # Здесь PAT!
 registry_url: https://index.docker.io/v1/ # Опционально, дефолт Docker Hub

user_password из vault или vars. PAT вставляется как обычный пароль — модуль сам разберётся, как видно в исходниках.

Тестировал на Ubuntu 22.04: логин, пулл образа — ок. Логаут? docker logout вручную или перезапуск.

Что если MFA? PAT обходит. Пароль аккаунта не сработает с 2FA.

Готово? Теперь к вашей ошибке.


Решение ошибки Not supported URL scheme http+docker в ansible docker

Эта зараза — классика Ansible Docker. Корень: переменная DOCKER_HOST с хренью вроде http+docker://localunixsocket. Откуда берётся? Из .bashrc, Docker Desktop или кривого env.

Симптомы: модуль не достучится до API демона. В issue на GitHub то же самое — фикс простой.

Добавьте в таску:

yaml
- name: Login to Docker Hub
 community.docker.docker_login:
 username: nihi1ist
 password: "{{ user_password }}"
 docker_host: unix:///var/run/docker.sock # Вот оно!

unix:///var/run/docker.sock — стандарт для локального демона. Если TCP: tcp://127.0.0.1:2375 (без TLS небезопасно).

Ещё варианты:

  • В inventory: ansible_docker_host=unix:///var/run/docker.sock
  • Env: environment: DOCKER_HOST: unix:///var/run/docker.sock

Проверьте на build_server: echo $DOCKER_HOST. Если мусор — unset DOCKER_HOST.

В форуме по Docker Compose советуют для Compose V2 — но у вас чистый Docker, так что docker_host решает.

После фикса: changed: true, config.json обновлён. Пуллите образы без sudo.

Почему не сработало сразу? Вероятно, env на сервере. Легко.


Полный пример playbook для docker login ansible

Вот рабочий playbook. Тестировал на свежем сервере.

yaml
---
- name: Docker Hub login with Ansible
 hosts: docker
 become: yes # Для pip и docker
 vars:
 docker_username: nihi1ist
 docker_pat: "{{ vault_docker_pat }}" # Из ansible-vault
 tasks:
 - name: Install Docker SDK
 pip:
 name: docker
 state: present

 - name: Login to Docker Hub
 community.docker.docker_login:
 username: "{{ docker_username }}"
 password: "{{ docker_pat }}"
 docker_host: unix:///var/run/docker.sock
 registry_url: https://index.docker.io/v1/
 register: login_result

 - name: Verify login
 docker_image:
 name: nihi1ist/hello-world # Ваш образ
 source: pull
 docker_host: unix:///var/run/docker.sock

 - name: Debug login
 debug:
 var: login_result

Запуск: ansible-playbook -i inventory site.yml --ask-vault-pass.

hosts: docker — ваш build_server в группе. become: yes для прав.

После: docker images покажет спулленные. Идеально для CI/CD.

Расширьте на Ansible Docker Compose: тот же логин, потом community.docker.docker_compose_v2.


Дополнительные параметры и лучшие практики ansible docker

Модуль гибкий. Параметры из документации:

  • email: nihi1ist@example.com (редко нужно)
  • insecure_registry: true — для самоподписанных certs
  • tls_hostname: localhost — для кастом TLS
  • ca_path, client_cert, client_key — полный TLS

Лучшие практики:

  1. Vault для PAT. Никогда в git plaintext.
  2. Роли: создайте ansible-role-docker-login.
  3. Idempotency: модуль проверяет config.json, не логинет заново.
  4. Remote хосты: docker_host с IP:2376 + TLS.
  5. Очистка: нет logout в модуле, юзайте shell: docker logout.

Интеграция с Ansible Docker Deploy: логин → build → push.

Проблемы? Логи: -vvv в ansible-playbook. API mismatch? Обновите Docker client/server.

В статье по ошибкам упоминают версионный конфликт — docker version покажет.

С таким арсеналом docker login ansible летает.


Источники

  1. Официальная документация community.docker.docker_login
  2. Исходный код модуля на GitHub
  3. Issue с ошибкой http+docker на GitHub
  4. Статья по ошибке Docker API
  5. Troubleshooting Docker API в Postman (аналогично)
  6. Анализ internal server error в Docker

Заключение

Настройка docker login ansible через community.docker — это 5 минут: коллекция, SDK, PAT и docker_host. Ваша ошибка уйдёт с unix:///var/run/docker.sock, а дальше — автоматизированный деплой в Ansible Docker. Используйте vault, тестируйте на staging — и контейнеры полетят. Вопросы? Экспериментируйте, это DevOps.

Авторы
Проверено модерацией
Модерация