Ansible и Git разрешение отклонено (publickey) в git Clone
У меня есть playbook, где я пытаюсь клонировать из частного РЕПО (GIT) на сервер.
У меня есть настройка SSH-переадресации, и когда я ssh в сервер и пытаюсь вручную клонировать из того же РЕПО, он успешно работает. Однако, когда я использую ansible для клонирования РЕПО на сервер, это не удается с "открытым ключом разрешения отказано".
Это мой сборник пьес deploy.yml:
---
- hosts: webservers
remote_user: root
tasks:
- name: Setup Git repo
git: repo={{ git_repo }}
dest={{ app_dir }}
accept_hostkey=yes
Вот как выглядит мой ansible.cfg:
[ssh_args]
ssh_args = -o FowardAgent=yes
Я также способен выполнять все другие задачи в моих учебниках (операции с ОС, установки).
Я пробовал:
- указание флага sshAgentForwarding в
ansible.cfgна сервере (ansible.cfg в директории с тактикой), используя:
Ssh_args = - o ForwardingAgent=yes
- используется
become: falseдля выполнения клона git
Запуск
ansible -i devops/hosts webservers -a "ssh -T [email protected]"возвращает:
an_ip_address | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh.",
"unreachable": true
}
Это команда, которую я использую для запуска playbook:
ansible-playbook devops/deploy.yml -i devops/hosts -vvvv
Это сообщение об ошибке I получить:
fatal: [162.243.243.13]: FAILED! => {"changed": false, "cmd": "/usr/bin/git ls-remote '' -h refs/heads/HEAD", "failed": true, "invocation": {"module_args": {"accept_hostkey": true, "bare": false, "clone":
true, "depth": null, "dest": "/var/www/aWebsite", "executable": null, "force": false, "key_file": null, "recursive": true, "reference": null, "refspec": null, "remote": "origin", "repo": "[email protected]:aUser/aRepo.git", "ssh_opts": null, "track_submodules": false, "update": true, "verify_commit": false, "version": "HEAD"}, "module_name": "git"}, "msg": "Permission denied (publickey).rnfatal: Could not r$ad from remote repository.nnPlease make sure you have the correct access rightsnand the repository exists.", "rc": 128, "stderr": "Permission denied (publickey).rnfatal: Could not read from remote r$pository.nnPlease make sure you have the correct access rightsnand the repository exists.n", "stdout": "", "stdout_lines": []}
3 ответов:
Прочитав документацию по SSH-пересылке в ansible. Я смог найти решение проблемы.
Проблема заключалась в том, что мои ssh-ключи не пересылались, потому что Ansible по умолчанию не пересылает ваши ключи, даже если вы настроили переадресацию ключей на
~/.ssh/conf(я обновил свой вопрос с помощьюansible.cfg, который у меня был до исправления проблемы).Решение состоит в том, чтобы добавить
transport = sshкansible.cfgпод[defaults]плюс запускansible-playbookиз того места, гдеansible.cfgнаходится расположенный.Мой
ansible.cfgтеперь выглядит так:[defaults] transport = ssh [ssh_connection] ssh_args = -o ForwardAgent=yes
Чтобы клонировать частное хранилище github через удаленный сервер, я делаю следующее:
Сначала добавьте ключ ssh к вашему ssh-агенту:
eval `ssh-agent -s` ssh-add ~/.ssh/my-private-key.pemПосле этого я изменил
ansible.cfg:[defaults] transport = ssh sudo_flags = -HE [ssh_connection] ssh_args = -o ForwardAgent=yesТеперь вы можете клонировать частное РЕПО github даже как пользователь root
Обычно я также добавляю эти две задачи в свою книгу игр / задачи ролей:
- name: Tell the host about our servers it might want to ssh to known_hosts: path: '/etc/ssh/known_hosts' name: 'github.com' key: "{{ lookup('pipe', 'ssh-keyscan -t rsa bitbucket.org') }}" - name: Upload sudo config for key forwarding as root lineinfile: dest: /etc/sudoers.d/ssh_key_forward line: 'Defaults env_keep+=SSH_AUTH_SOCK' create: yes owner: root group: root mode: "0440" state: present validate: 'visudo -c -f %s'Странно, это работает на меня. Если опция
sshне сработала для вас, то вы можете использовать опцию username / password, например это:- name: Pull the code git: repo: "https://{{ bitbucket_login }}:{{ bitbucket_password|urlencode }}@bitbucket.org/path/project.git" dest: /var/www/myproject version: masterНадеюсь, что это может быть полезно для вас и других
В сценарии localhost-only
ForwardAgentсовершенно бесполезно, так как это перенаправило бы агента только на удаленный хост.Даже если
gitработает из командной строки при запуске вручную, он не работает из Ansible, несмотря ни на что. Единственное рабочее решение, которое я нашел, было преобразоватьgitвcommand, например:- command: /usr/bin/git clone git@github
Comments