ansible이 사실 수집에 매달릴 수있는 데는 여러 가지 이유가 있지만, 더 나아 가기 전에 이러한 상황에서해야 할 첫 번째 테스트는 다음과 같습니다.
ansible -m ping <hostname>
이 테스트는 호스트에 연결하고 리턴하기에 충분한 코드를 실행합니다.
<hostname> | SUCCESS => {
"changed": false,
"ping": "pong"
}
이것이 작동하면 원격 호스트 파이썬 인터프리터로 대상 호스트 이름을 확인하고, 연결을 열고, 인증하고, 사용 가능한 모듈을 실행할 수 있음을 입증하므로 설정 또는 연결 문제를 거의 배제 할 수 있습니다.
이제, 다음은 플레이 북의 시작 부분에서 잘못 될 수있는 것들의 목록입니다.
ansible이 실행 한 명령이 대화식 입력을 기다리는 중입니다.
명령이 sudo 암호 ( -K
스위치 를 잊었을 때)와 같은 대화식 입력을 기다리 거나 새로운 ssh 호스트 지문 수락 (새로운 대상의 경우)과 같은 이전의 사용 가능한 버전에서 발생하는 것을 기억할 수 있습니다. 숙주).
최신 버전의 ansible은 이러한 경우를 정상적으로 처리하고 일반적인 유스 케이스에서 즉시 오류를 발생시킵니다. 따라서 ssh 또는 sudo 호출과 같은 작업을 수행하지 않는 한 이러한 종류의 문제가 없어야합니다. 그리고 당신이하더라도 사실 수집 후에 일 것입니다.
죽은 ssh 마스터 연결
여기에 주어진 디버그 로그에 ssh 클라이언트에 전달되는 매우 흥미로운 옵션이 있습니다.
ControlMaster=auto
ControlPersist=60s
ControlPath=/home/vagrant/.ansible/cp/ansible-ssh-%h-%p-%r
이 옵션은 man ssh_config에 설명되어 있습니다 .
기본적으로 ansible은 ssh 연결 사용과 관련하여 현명하고 노력합니다. 주어진 호스트에 대해, 플레이의 각각의 모든 작업에 대해 새로운 연결을 생성하는 대신, 한 번 열어서 전체 플레이 북 (및 플레이 북 전체)에 대해 열린 상태로 유지합니다.
새로운 연결을 설정하는 것이 기존 연결을 사용하는 것보다 훨씬 느리고 계산 집약적이기 때문에 좋습니다.
실제로 모든 ssh 연결은에서 소켓이 있는지 확인합니다 ~/.ansible/cp/some-host-specific-path
. 첫 번째 연결은 찾을 수 없으므로 정상적으로 연결되어 만들어집니다. 이후의 모든 연결은이 소켓을 사용하여 이미 설정된 연결을 통과합니다.
설정된 연결이 오랫동안 사용되지 않으면 결국 시간 초과되어 닫히더라도 소켓도 닫히고 다시 정사각형으로 돌아갑니다.
여태까지는 그런대로 잘됐다.
그러나 때때로 연결이 실제로 끊어 지지만 ssh 클라이언트는 여전히 연결이 설정된 것으로 간주합니다. 일반적으로 랩톱에서 플레이 북을 실행할 때 WiFi 연결이 끊어집니다 (또는 WiFi에서 이더넷으로 전환하는 등).
이 마지막 예는 끔찍한 상황입니다. 기본 ssh 구성으로 대상 시스템에 ssh를 수행 할 수 있지만 이전 연결이 여전히 활성 상태 인 것으로 간주되는 경우 새로운 연결을 설정하려고 시도조차하지 않습니다.
이 시점에서, 우리는이 오래된 소켓을 제거하고 싶습니다. 가장 간단한 방법은 소켓을 제거하는 것입니다.
# Delete all the current sockets (may disrupt currently running playbooks)
rm -r ~/.ansible/cp
# Delete only the affected socket (requires to know which one it is)
rm ~/.ansible/cp/<replace-by-your-socket>
이 기능은 원샷 수정에 적합하지만 너무 자주 발생하면 장기 수정을 찾아야 할 수도 있습니다. 이 목표를 달성하는 데 도움이 될만한 몇 가지 조언은 다음과 같습니다.
- 서버에서 플레이 북 시작 (노트북보다 안정적인 네트워크 연결 방식)
- 사용 가능한 구성을 사용 하거나 직접 ssh 클라이언트 구성 을 사용하여 연결 공유를 사용하지 않도록 설정
- 동일한 리소스를 사용하지만 시간 초과를 미세 조정하여 마스터 연결 충돌이 실제로 더 빨리 시간 초과되도록
글을 쓰는 시점에서 몇 가지 옵션이 변경 ControlPath=/home/toadjaune/.ansible/cp/871b533295
되었지만 (예를 들어, 최근 실행으로 나에게 주었다 ) 일반적인 아이디어는 여전히 유효합니다.
사실 시간이 너무 많이 걸리는 사실 수집
모든 플레이가 시작될 때 ansible은 대상 시스템에 대한 많은 정보를 수집하여 Facts에 넣습니다 . 이것들은 플레이 북에서 사용할 수있는 변수이며 일반적으로 매우 편리하지만 때로는이 정보를 얻는 데 시간이 오래 걸릴 수 있습니다 (잘못된 마운트 포인트, 높은 입출력이있는 디스크, 높은로드…)
이것은 당신이하지 않는 말했다되고 엄격하게 각본을 실행하는 사실을해야하고, 거의 확실히 그들 모두, 그래서 우리는 필요하지 않습니다 무엇의 시도하자 비활성화합니다. 그에 대한 몇 가지 옵션 :
- 설정 모듈을 완전히 비활성화
- 특정 부분 만 포함 하도록 설정 모듈 의 구성을 변경하십시오 .
디버깅 목적으로 명령 줄에서 직접 설정 모듈을 호출하는 것이 매우 편리합니다.
ansible -m setup <hostname>
이 마지막 명령은 플레이 북과 함께 중단되고 결국 시간 초과 (또는 성공)해야합니다. 이제 모듈을 다시 실행하여 가능한 모든 기능을 비활성화하겠습니다.
ansible -m setup -a gather_subset='!all' <hostname>
그래도 문제가 해결되지 않으면 항상 게임에서 모듈을 완전히 사용 중지 할 수 있지만 문제가 다른 곳에있을 가능성이 큽니다.
그러나 제대로 작동하면 모듈 설명서를 살펴보십시오 . 두 가지 옵션이 있습니다.
- 필요하지 않은 것을 제외하고 팩트 수집을 서브 세트로 제한하십시오 (의 가능한 값 참조
gather_subset
).
gather_timeout
더 많은 시간을 허용하여 문제를 해결하는 데 도움을 줄 수도 있습니다 (정지 시간이 아닌 오류를 수정하는 것이지만)
다른 문제
분명히 다른 일이 잘못 될 수 있습니다. 디버깅에 도움이되는 몇 가지 지침 :
-vvvv
실행 가능한 모든 명령이 표시 되므로 최대 상세 레벨 ( )을 사용하십시오.
- 위에서 설명한대로 명령 줄에서 직접 사용
ping
및 setup
모듈
ansible -m ping
작동하지 않으면 수동으로 ssh를 시도하십시오
vagrant ssh
유용 아무것도가 있는지 요령 중 및 조사ps
와는netstat
? 또한 중단의 첫 번째 의심 중 하나는 DNS입니다. 가상 머신 내부에서 DNS가 확인되는지 확인하십시오.