Ansible을 사용한 SSH 에이전트 전달
Ansible 1.5.3 및 Git을 ssh 에이전트 전달 ( https://help.github.com/articles/using-ssh-agent-forwarding ) 과 함께 사용하고 있습니다. Ansible로 관리하는 서버에 로그인하여 git에 대한 연결이 올바르게 구성되었는지 테스트 할 수 있습니다.
ubuntu@test:~$ ssh -T git@github.com
Hi gituser! You've successfully authenticated, but GitHub does not provide shell access.
또한이 계정을 사용하여 내 저장소 중 하나를 복제하고 업데이트 할 수 있으므로 git 구성이 좋아 보이고 ssh를 통해 서버에 직접 로그인 할 때 ssh 전달을 사용합니다.
문제 : Ansible 명령 모듈을 사용하여 위에 표시된 것과 동일한 테스트를 시도 할 때. "Permission denied"로 실패합니다. Ansible 출력 (상세 로깅 포함)의 일부는 다음과 같습니다.
failed: [xxx.xxxxx.com] => {"changed": true, "cmd": ["ssh", "-T", "git@github.com"], "delta": "0:00:00.585481", "end": "2014-06-09 14:11:37.410907", "rc": 255, "start": "2014-06-09 14:11:36.825426"}
stderr: Permission denied (publickey).
다음은이 명령을 실행하는 간단한 플레이 북입니다.
- hosts: webservers
sudo: yes
remote_user: ubuntu
tasks:
- name: Test that git ssh connection is working.
command: ssh -T git@github.com
질문 : ssh를 통해 수동으로 로그인하고 명령을 실행할 때 모든 것이 올바르게 작동하지만 동일한 명령이 Ansible을 통해 동일한 사용자로 실행될 때 실패하는 이유는 무엇입니까?
아무도 나를 이기지 않으면 곧 답변을 게시 할 것입니다. git을 사용하여 문제를 설명하고 있지만 ssh 에이전트 전달에 의존하는 모든 모듈에서 발생할 수 있습니다. Ansible에만 국한된 것은 아니지만 많은 사람들이이 시나리오에서 먼저 문제에 직면 할 것이라고 생각합니다.
문제는 플레이 북에서 다음 줄을 제거하여 해결됩니다.
sudo: yes
원격 호스트에서 sudo를 실행하면 로그인 중에 ssh에서 설정 한 환경 변수를 더 이상 사용할 수 없습니다. 특히 "에이전트와 통신하는 데 사용되는 UNIX 도메인 소켓의 경로를 식별"하는 SSH_AUTH_SOCK이 더 이상 표시되지 않으므로 ssh 에이전트 전달이 작동하지 않습니다.
필요하지 않을 때 sudo를 피하는 것은 문제를 해결하는 한 가지 방법입니다. 또 다른 방법은 sudoers 파일을 생성하여 sudo 세션 중에 SSH_AUTH_SOCK이 계속 유지되도록하는 것입니다.
/etc/sudoers:
Defaults env_keep += "SSH_AUTH_SOCK"
여기에는 매우 유용한 부분 답변이 있지만이 문제를 여러 번 겪은 후에 개요가 도움이 될 것이라고 생각합니다.
먼저 Ansible을 실행하는 클라이언트에서 대상 머신에 연결할 때 SSH 에이전트 전달이 활성화되어 있는지 확인해야합니다. 를 사용하더라도 transport=smart
클라이언트의 SSH 구성에 따라 SSH 에이전트 전달이 자동으로 사용 설정되지 않을 수 있습니다. 이를 확인하기 위해 ~/.ansible.cfg
다음 섹션을 포함하도록 업데이트 할 수 있습니다 .
[ssh_connection]
ssh_args=-o ControlMaster=auto -o ControlPersist=60s -o ControlPath=/tmp/ansible-ssh-%h-%p-%r -o ForwardAgent=yes
다음 으로 환경 변수가 재설정 되기 때문에 become: yes
(및 become_user: root
)이 일반적으로 에이전트 전달을 비활성화 한다는 사실을 처리해야 할 것 SSH_AUTH_SOCK
입니다. ( Ansible은 유용한 감사를 불가능하게 만들기 때문에 사람들이 SSH를 루트 로 사용한다고 가정 하는 것이 충격적입니다 .)이 문제를 처리하는 몇 가지 방법이 있습니다. Ansible 2.2부터 가장 쉬운 방법은 플래그 sudo
를 지정 하여 사용할 때 (전체) 환경을 보존 하는 것 -E
입니다.
become_flags: "-E"
그러나 .NET Framework와 같은 변수를 보존하면 원치 않는 부작용이 발생할 수 있습니다 PATH
. 가장 깨끗한 방법은 보존하는 것입니다 SSH_AUTH_SOCK
그것을 포함하여 env_keep
당신의 /etc/sudoers
파일 :
Defaults env_keep += "SSH_AUTH_SOCK"
Ansible로이를 수행하려면 :
- name: enable SSH forwarding for sudo
lineinfile:
dest: /etc/sudoers
insertafter: '^#?\s*Defaults\s+env_keep\b'
line: 'Defaults env_keep += "SSH_AUTH_SOCK"'
이 플레이 북 작업은 env_keep
기존 env_keep
설정 을 변경 하거나 SSH_AUTH_SOCK
이미 존재 한다고 가정 하지 않고 다른 기본 설정 (또는 파일이없는 경우 파일 끝에) 이후에 추가하기 때문에 제안 된 다른 작업보다 약간 더 보수적 입니다 .
귀하의 질문에 대한 또 다른 답변 (Ansible 1.9를 사용하는 경우 제외)은 다음과 같습니다.
ansible 문서에서transport=smart
권장 하는 대로 /etc/ansible/ansible.cfg (또는 구성 설정을 재정의 할 수있는 다른 세 개의 잠재적 위치)를 확인할 수 있습니다 . 내 제어 시스템이 OpenSSH를 사용하지 못하여 에이전트 포워딩을 방지하는 이전 설치 시도 중 어느 시점에서 내 기본값이 설정되었습니다 . 이것은 아마도 거대한 엣지 케이스 일 것입니다. 당신 일 수도 있습니다!transport=paramiko
Though I didn't find it necessary for my configuration, I should note that others have mentioned that you should add -o ForwardAgent=yes
to your ssh_args setting in the same file like so:
[ssh_connection]
ssh_args=-o ForwardAgent=yes
I only mention it here for the sake of completeness.
To expand on @j.freckle's answer, the ansible way to change sudoers file is:
- name: Add ssh agent line to sudoers
lineinfile:
dest: /etc/sudoers
state: present
regexp: SSH_AUTH_SOCK
line: Defaults env_keep += "SSH_AUTH_SOCK"
참고URL : https://stackoverflow.com/questions/24124140/ssh-agent-forwarding-with-ansible
'programing tip' 카테고리의 다른 글
간단한 프로그램을위한 클래스 로딩의 흐름 (0) | 2020.11.24 |
---|---|
입력 유형 "숫자"는 크기가 조정되지 않습니다. (0) | 2020.11.24 |
값 검색 (0) | 2020.11.24 |
PDF 파일의 구조? (0) | 2020.11.24 |
파이썬을 말하는 방법 (0) | 2020.11.24 |