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": []}
738   3  

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

    Ничего не найдено.