Доступ к приватным ресурсам из Ansible playbooks
Дано:
- сервисы разработки (gitlab и т.д.) изолированы от внешнего мира;
- серверы production находятся во внешнем мире и не имеют доступа в gitlab;
- в задаче Ansible необходимо клонировать проект из gitlab на production-сервер;
- задача запускается с компьютера, имеющего к сервисам разработки полный доступ.
Решение:
- в качестве транспорта по умолчанию в Ansible используется OpenSSH;
- в состав OpenSSH входит прокси-сервер Socks5, запускаемый на локальной либо удалённой стороне (ключами -D и -R соответственно, с номером TCP-порта);
- большинство утилит в Linux/Unix умеет использовать прокси, и читает его адрес из переменных окружения;
- Ansible поддерживает настройку переменных окружения для ролей, playbooks, блоков и отдельных задач с помощью раздела environment.
В inventory/hosts добавляем запуск socks5-прокси на стороне сервера prod.host.name при подключении Ansible к нему:
prod.host.name ansible_ssh_extra_args="-R 1080"
В tasks/main.yml указываем git-клиенту через переменную окружения — обращаться к серверу через прокси:
- name: clone repo from private git
git:
repo: https://gitlab+deploy-token-1:VerySecretPassphrase@git.private.lan/aa/aa.git
dest: /opt/aa
depth: 1
environment:
https_proxy: "socks5://localhost:1080"
При каких условиях такое решение не применимо?
- Ansible-модуль или Linux-утилита не умеет работать через socks-прокси
- ..или не умеет читать его адрес из переменной окружения.
В этом случае можно использовать более примитивный TCP-прокси:
- в дополнение к номеру локального порта для -R указывается адрес и порт целевого сервера, например,
-R 1022:git.private.lan:22; - обращение из модуля или утилиты делается на локальный порт:
- name: clone repo from private git
git:
repo: git+ssh://git@127.0.0.1:1022/aa/aa.git
dest: /opt/aa
depth: 1
Недостатки TCP-прокси:
- в большинстве случаев перенаправление http/https не заработает, т.к. в HTTP-запросе сервер будет получать в качестве имени сайта 127.0.0.1;
- если необходим доступ к нескольким сервисам, для каждого из них потребуется отдельный порт/прокси.
Преимущество TCP-прокси:
если через socks5 злонамеренные процессы могут обращаться к абсолютно любым ресурсам, доступным с вызывающего компьютера, то через TCP-прокси — только к явно перечисленным, что является более безопасным.
Как использовать прокси без Ansible?
- добавляйте ключ -R в командную строку ssh для однократного использования или директиву RemoteForward в файл ~/.ssh/config для постоянного:
Host prod.host.name
RemoteForward 1080
RemoteForward 1022:git.private.lan:22