Infograb logo
Ansible

Ansible은 기본적으로 OpenSSH 클라이언트를 사용합니다. Teleport는 SSH 프로토콜을 지원하며 SSH 점프 호스트로 작동합니다.

이 가이드에서는 OpenSSH 클라이언트를 Teleport Proxy와 함께 작동하도록 구성하고 샘플 ansible 플레이북을 실행하는 방법을 설명합니다.

필수 조건

  • 실행 중인 Teleport 클러스터 버전 17.0.0-dev 이상. Teleport를 시작하려면 가입하여 무료 평가판을 이용하거나 데모 환경 설정 방법을 확인하십시오.

  • tctl 관리자 도구와 tsh 클라이언트 도구.

    tctltsh 다운로드 방법에 대한 지침은 설치를 방문하십시오.

  • ssh openssh 도구
  • ansible >= 2.9.6
  • 선택적 도구 jq 를 사용하여 JSON 출력을 처리합니다.
  • 연결이 가능한지 확인하기 위해 tsh login 으로 로그인한 다음, 현재 자격 증명을 사용하여 tctl 명령어를 실행할 수 있는지 확인하십시오. 예를 들어:
    tsh login --proxy=teleport.example.com --user=email@example.com
    tctl status

    클러스터 teleport.example.com

    버전 17.0.0-dev

    CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678

    클러스터에 연결할 수 있고 tctl status 명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 워크스테이션에서 후속 tctl 명령어를 실행할 수 있습니다.
    자신의 Teleport 클러스터를 호스팅하는 경우, Teleport Auth Service를 호스팅하는 컴퓨터에서 전체 권한으로 tctl 명령어를 실행할 수도 있습니다.

1/3단계. 로그인 및 SSH 구성

tsh 로 Teleport에 로그인합니다:

tsh login --proxy=example.com

tsh config 단축키를 사용하여 openssh 구성을 생성합니다:

tsh config > ssh.cfg
Tip

작동하지 않는 항목이 있는 경우 ssh.cfg 에서 매칭 패턴을 수정할 수 있습니다.

2/3단계. Ansible 구성

생성된 모든 파일을 수집할 ansible 폴더를 만듭니다:

mkdir -p ansible

이전 단계에서 생성한 openssh 구성을 ansible 디렉토리로 복사합니다

cp ssh.cfg ansible/
cd ansible

ansible.cfg 파일을 생성합니다:

[defaults]
host_key_checking = True
inventory=./hosts
remote_tmp=/tmp

[ssh_connection]
scp_if_ssh = True
ssh_args = -F ./ssh.cfg

인벤토리 파일 hosts 를 수동으로 생성하거나 아래 스크립트를 사용하여 환경에서 생성할 수 있습니다. 클러스터 이름(예: teleport.example.com 또는 Teleport Enterprise Cloud의 형식인 mytenant.teleport.sh )을 설정하면 이 스크립트가 openssh 구성과 일치하는 호스트 이름을 생성합니다:

tsh ls --format=json | jq '.[].spec.hostname + ".teleport.example.com"' > hosts

3/3단계. 플레이북 실행

마지막으로 간단한 ansible 플레이북 playbook.yaml 을 생성합니다.

아래 플레이북은 모든 호스트에서 hostname 을 실행합니다. remote_user 매개변수를 유효한 SSH 사용자 이름으로 설정해야 하며, 이 사용자 이름은 대상으로 하는 호스트와 함께 작동하며 Teleport에서 허용됩니다:

- hosts: all
  remote_user: ubuntu
  tasks:
    - name: "hostname"
      command: "hostname"

폴더 ansible 에서 ansible 플레이북을 실행합니다:

ansible-playbook playbook.yaml

PLAY [all] *****************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************

ok: [terminal]

TASK [hostname] ************************************************************************************************************************************

changed: [terminal]

PLAY RECAP *****************************************************************************************************************************************

terminal : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

모든 준비가 완료되었습니다. 이제 단기 SSH 인증서를 사용하고 있으며 Teleport가 모든 ansible 명령을 감사 로그에 기록할 수 있습니다.

문제 해결

Ansible이 연결할 수 없는 경우 다음과 같은 오류가 표시될 수 있습니다:

example.host | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname example.host: Name or service not known",
    "unreachable": true
}

ssh.cfg 에서 인벤토리 호스트와 일치하는 패턴을 점검하고 조정할 수 있습니다.

오류를 검사하기 위해 ssh.cfg 를 사용하여 자세한 모드에서 SSH 연결을 시도해 보세요:

ssh -vvv -F ./ssh.cfg root@example.host

ssh 가 작동한다면, 자세한 모드로 플레이북을 실행해 보십시오:

ansible-playbook -vvvv playbook.yaml

호스트 이름에 대문자가 포함되어 있는 경우(예: MYHOSTNAME ), Teleport의 내부 호스트 이름 일치는 기본적으로 대소문자를 구분하기 때문에 이 오류가 발생할 수 있습니다.

이 경우, 클러스터 수준에서 대소문자 구분 없는 라우팅을 활성화하여 문제를 해결할 수 있습니다.

Teleport auth_service 를 실행 중인 모든 서버에서 /etc/teleport.yaml 구성 파일을 수정한 후 각 서버에서 Teleport를 다시 시작합니다.

auth_service:
  case_insensitive_routing: true

tctl edit cluster_networking_config 명령을 실행하여 다음 사양을 추가한 후 저장하고 종료합니다.

spec:
  case_insensitive_routing: true
Teleport 원문 보기