키가 거부 된 경우 Ansible에서 비밀번호를 사용하는 방법은 무엇입니까?


14

새 서버 인스턴스는 비밀번호로 ssh를 통해 루트에 로그인하도록 구성되어 있습니다. Ansible 플레이 북이 대신 키를 사용하고 처음 실행시 암호를 사용하여 루트 로그인을 비활성화하도록 다시 구성하기를 원하므로 다음과 같은 것이 필요합니다.

  • 키로 로그인을 시도
  • 키로 로그인 할 수없는 경우 :

    • 비밀번호로 로그인
    • certified_keys에 키 추가
    • 비밀번호로 루트 로그인 비활성화
    • 선택적으로 키를 사용하여 다시 연결
  • 다른 일을하다

어떻게하면 되나요?

편집 : 분명히하기 위해 키를 추가하거나 루트를 비활성화하는 방법을 묻지 않습니다. 단지 컨텍스트입니다. 키로 인증 할 수없는 경우 암호로 대체하는 방법을 묻습니다. 으로 --ask-pass또는 ansible_ssh_pass집합 Ansible도 공개 키 인증을 사용하려고하지 않을 것이다


좋은 질문입니다. 지금까지 무엇을 시도해 보셨습니까?
dawud

1
ssh 구성을 별도의 플레이 북으로 가져 와서 -k 옵션으로 실행 한 다음 -k없이 에이전트의 키를 사용하여 기본 플레이 북을 실행합니다. 나는 그것이 하나의 플레이 북에 포장 될 수 있기를 바라고 있었다. ..
petr0

@ petr0 ask-pass 암호가 키와 다른 사용자를위한 경우 (즉, ssh를 비활성화 한 후 원격 사용자를 전환 할 때)이 기능이 작동합니다. 그것이 도움이되는지 확실하지 않습니다.
DylanYoung

답변:


6

PreferredAuthentications옵션을로 설정하여 시도해 볼 수 publickey,password있습니다. 기본값은 다른 옵션과 함께이 순서대로 이들을 포함하므로 아마도 이것을 설정하는 것이 가능합니다. -o또는 클라이언트 를 통해 추가하면이를 ssh_config방지 할 수 있습니다.

랩퍼 스크립트를 사용할 수 있습니다. 예를 들어,이 함께 key_or_password.sh하고 pass.sh암호를 제공하는 실행 bash key_or_password.sh root@host공개 키를 시도 할 것이다 것은 대화 형이 아닌 암호 로그인 하였다.

export DISPLAY=dummy:0
export SSH_ASKPASS=$PWD/pass.sh
exec setsid ssh -v -o 'PreferredAuthentications publickey,password' "$@"

로그는 성공한 방법을 나타냅니다. 예 :

debug1: Authentication succeeded (publickey).

7

다음 ansible_user은 플레이 북의 '첫 실행'과 다른 경우 수행하는 작업 입니다 (예 : root사용자 만 있고 SSH 키를 사용하여 새 사용자를 설정하려는 경우).

  • ansible_pass비밀번호 로그인을 사용하는 경우 와 마찬가지로 비밀번호를 저장 합니다 (Vault를 사용해야 함). 이것은 플레이 북의 '첫 실행'에 사용하는 사용자의 비밀번호 여야합니다.
  • ansible_user서버에서 사용자를 올바르게 설정 한 경우 처음 실행 한 후 사용하려는 사용자의 사용자 이름으로 설정하십시오 .
  • ansible_user_first_run플레이 북의 '처음 실행'에 사용할 사용자 의 변수를 설정합니다 ( 예 :) root.
  • 사용하여 올바른 SSH 키를 사용하여 서버에 연결을 시도하는 로컬 명령을 사용 ignore_errors하고changed_when: False
  • 실패하면 ansible_user다음 값으로 업데이트 하십시오.ansible_user_first_run

코드는 다음과 같습니다.

---
- name: Check if connection is possible
  command: ssh -o User={{ ansible_user }} -o ConnectTimeout=10 -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes {{ inventory_hostname }} echo "Worked"
  register: result
  connection: local
  ignore_errors: yes
  changed_when: False
- name: If no connection, change user_name
  connection: local
  set_fact:
    ansible_user: "{{ ansible_user_first_run }}"
  when: result|failed

참고 : transport = ssh일부 구성에서 paramiko가 예기치 않게 서버에 로그인하지 못할 수 있으므로 설정하는 것이 좋습니다 (예 : 서버가 비밀번호를 허용하지 않도록 설정되어 있고 먼저 키를 사용하여 비밀번호를 시도하는 경우 ... 이상합니다!) 또한 ssh 전송이 더 빠르므로 어쨌든 가치가 있습니다.

추가 참고 :이 방법을 사용 gather_facts: false하는 경우 암호 테스트 단계에 도달하기 전에 설정 / 사실 수집 작업이 자동으로 실행되지 않도록 플레이 북 정의 파일에서 지정해야 합니다. 가능한 사실이 필요한 경우 setup등의 장소에서 일반적으로 사용 가능한 데이터에 액세스하기 전에 역할 을 명시 적으로 호출해야합니다 ansible_devices.이를 수행하는 한 가지 좋은 방법은 다음 을 확인 setup하는 when절 을 호출하는 것 입니다. 당신이 사용하는 사실은 당신의 역할에서 전화하기 전에 비어 있거나 아닙니다.


귀하의 솔루션은 좋다하지만 당신은 추가해야 gather_facts: no플레이 북 : 시작할 때 연결을 시도 ansible 중지
k4cy을

당신이 올바른지. 모든 플레이 북에 대해 gather_facts를 off로 설정하여 'setup'을 명시 적으로 호출해야합니다. 나는 대답에서 이것을 언급하는 것을 잊었다. 나는 지금 그것을 업데이트 할 것이다.
Tom Bull

5

--ask-pass플레이 북을 실행할 때 사용할 수 있습니다 .

요청한 다른 작업의 경우 복사 모듈과 같은 다양한 방법으로 수행 할 수 있습니다.
루트 로그인 비활성화도 가능합니다. 하는 주형에 의해 sshd_conf또는 conf의 파일에 라인을 삽입.


--ask-pass (-k와 동일)는 내가하고있는 일이며 위의 주석에서 이에 대해 썼습니다
petr0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.