Ansible
Teleport v18.9Ansible은 기본적으로 OpenSSH 클라이언트를 사용합니다. 이 가이드에서는 OpenSSH 클라이언트가 Teleport 프록시와 함께 작동하도록 설정하고 샘플 ansible 플레이북을 실행하는 방법을 다룹니다. 이 가이드에서 설명하는 설정에서는 Teleport가 발급한 SSH 인증서를 사용하여 Teleport가 보호하는 서버에 연결하는 OpenSSH 설정을 생성합니다.
Ansible은 기본적으로 OpenSSH 클라이언트를 사용합니다. Teleport는 SSH 프로토콜을 지원하며 SSH 점프호스트로 작동합니다.
이 가이드에서는 OpenSSH 클라이언트가 Teleport 프록시와 함께 작동하도록 설정하고 샘플 ansible 플레이북을 실행하는 방법을 다룹니다.
동작 방식#
이 가이드에서 설명하는 설정에서는 Teleport가 발급한 SSH 인증서를 사용하여 Teleport가 보호하는 서버에 연결하는 OpenSSH 설정을 생성합니다. 그런 다음 이 OpenSSH 설정을 Teleport가 보호하는 서버의 인벤토리와 함께 Ansible 호스트에 제공합니다. Ansible은 이 OpenSSH 설정을 사용하여 Teleport가 발급한 자격 증명을 제시함으로써 서버를 관리합니다.
사전 요구사항#
-
실행 중인 Teleport 클러스터. Teleport를 시작하려면 무료 체험판에 가입하거나 데모 환경을 구성하세요.
-
tctlandtshclients.Installing `tctl` and `tsh` clients
-
Teleport 클러스터의 버전을 확인합니다.
tctlandtshclients는 Teleport 클러스터 버전보다 최대 한 개의 메이저 버전까지만 뒤처질 수 있습니다. Proxy Service의/v1/webapi/find로 GET 요청을 보내고 JSON 쿼리 도구를 사용하여 클러스터 버전을 확인합니다.teleport.example.com:443를 Teleport Proxy Service의 웹 주소로 바꿉니다:$ TELEPORT_DOMAIN=teleport.example.com:443 $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')" -
사용 중인 플랫폼에 대한 지침에 따라
tctlandtshclients를 설치합니다:
-
Mac
`tctl` and `tsh` clients가 포함된, 서명된 Teleport macOS .pkg 설치 프로그램을 다운로드합니다:
```code
$ curl -O https://cdn.teleport.dev/teleport-${TELEPORT_VERSION?}.pkg
```
Finder에서 `pkg` 파일을 더블 클릭하여 설치를 시작합니다.
Homebrew를 사용하여 Teleport를 설치하는 것은 지원되지 않습니다. Homebrew의
Teleport 패키지는 Teleport에서 유지 관리하지 않으므로 신뢰성이나 보안을
보장할 수 없습니다.
Windows - Powershell
```code
$ curl.exe -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-windows-amd64-bin.zip
# Unzip the archive and move the `tctl` and `tsh` clients to your %PATH%
# NOTE: Do not place the `tctl` and `tsh` clients in the System32 directory, as this can cause issues when using WinSCP.
# Use %SystemRoot% (C:\Windows) or %USERPROFILE% (C:\Users\<username>) instead.
```
Linux
Linux 설치판의 모든 Teleport 바이너리에는 `tctl` and `tsh` clients가 포함되어 있습니다. RPM/DEB
패키지 및 i386/ARM/ARM64용 다운로드를 포함한 더 많은 옵션은
[설치 페이지](../installation/installation.mdx)를 참조하세요.
```code
$ curl -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
$ tar -xzf teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
$ cd teleport
$ sudo ./install
# Teleport binaries have been copied to /usr/local/bin
```
sshopenssh 도구ansible>=[ansible.min_version]JSON출력을 처리하기 위한 선택적 도구jq
1단계/3단계. 로그인 및 SSH 설정#
tsh로 Teleport에 로그인합니다.
$ tsh login --proxy=teleport.example.com
tsh config 단축 명령을 사용하여 openssh 설정을 생성합니다.
$ tsh config > ssh.cfg
바로 작동하지 않는 부분이 있다면 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 매개변수를
대상 호스트에서 작동하고 Teleport에서 허용하는 유효한 SSH 사용자 이름으로 설정해야
합니다.
- 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를 사용하여 verbose 모드로 SSH 연결을 시도해 오류를 확인해 보세요.
$ ssh -vvv -F ./ssh.cfg root@example.host
ssh가 작동한다면 verbose 모드를 켜고 플레이북을 실행해 보세요.
$ ansible-playbook -vvvv playbook.yaml
호스트 이름에 대문자(예: MYHOSTNAME)가 포함되어 있는 경우, Teleport의 내부 호스트
이름 일치는 기본적으로 대소문자를 구분하므로 이로 인해 이 오류가 발생할 수도 있다는 점에
유의하세요.
이 경우라면 Teleport 관리자에게 클러스터 수준에서 대소문자를 구분하지 않는 라우팅을 활성화하도록 요청하여 이 문제를 우회할 수 있습니다. 관리자는 다음 지침에 따라 대소문자를 구분하지 않는 라우팅을 활성화할 수 있습니다.
Teleport auth_service를 실행하는 모든 서버에서 /etc/teleport.yaml 설정 파일을
편집한 다음 각 서버에서 Teleport를 재시작하세요.
auth_service:
case_insensitive_routing: true
tctl edit cluster_networking_config를 실행하여 다음 사양을 추가한 다음 저장하고
종료하세요.
spec:
case_insensitive_routing: true