InfoGrab Docs

Ansible

요약

Ansible은 기본적으로 OpenSSH 클라이언트를 사용합니다. 이 가이드에서는 Teleport Proxy와 함께 작동하도록 OpenSSH 클라이언트를 구성하고 샘플 ansible 플레이북을 실행하는 방법을 안내합니다.

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

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

작동 방식#

이 가이드에서 설명하는 설정에서는, Teleport가 발급한 SSH 인증서를 사용하여 Teleport로 보호된 서버에 연결하는 OpenSSH 구성을 생성합니다. 그런 다음 이 OpenSSH 구성과 Teleport로 보호된 서버의 인벤토리를 Ansible 호스트에 제공합니다. Ansible은 OpenSSH 구성을 사용하여 서버를 관리하기 위해 Teleport가 발급한 자격 증명을 제시합니다.

사전 요구 사항#

  • A running Teleport cluster. If you want to get started with Teleport, sign up for a free trial or set up a demo environment.

  • The tctl and tsh clients.

    Installing `tctl` and `tsh` clients
    1. Determine the version of your Teleport cluster. The tctl and tsh clients must be at most one major version behind your Teleport cluster version. Send a GET request to the Proxy Service at /v1/webapi/find and use a JSON query tool to obtain your cluster version. Replace with the web address of your Teleport Proxy Service:

      $ TELEPORT_DOMAIN=
      $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"
      
    2. Follow the instructions for your platform to install tctl and tsh clients:

  • ssh openssh 도구
  • ansible >= [ansible.min_version]
  • JSON 출력을 처리하기 위한 선택적 도구 jq

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

tsh로 Teleport에 로그인합니다:

$ tsh login --proxy=

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 + "."' > 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를 사용하여 SSH 연결을 시도해 보세요:

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

ssh가 작동하면 자세한 모드를 켜고 플레이북을 실행해 보세요:

$ 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

Ansible

원문 보기
요약

Ansible은 기본적으로 OpenSSH 클라이언트를 사용합니다. 이 가이드에서는 Teleport Proxy와 함께 작동하도록 OpenSSH 클라이언트를 구성하고 샘플 ansible 플레이북을 실행하는 방법을 안내합니다.

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

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

작동 방식#

이 가이드에서 설명하는 설정에서는, Teleport가 발급한 SSH 인증서를 사용하여 Teleport로 보호된 서버에 연결하는 OpenSSH 구성을 생성합니다. 그런 다음 이 OpenSSH 구성과 Teleport로 보호된 서버의 인벤토리를 Ansible 호스트에 제공합니다. Ansible은 OpenSSH 구성을 사용하여 서버를 관리하기 위해 Teleport가 발급한 자격 증명을 제시합니다.

사전 요구 사항#

  • A running Teleport cluster. If you want to get started with Teleport, sign up for a free trial or set up a demo environment.

  • The tctl and tsh clients.

    Installing `tctl` and `tsh` clients
    1. Determine the version of your Teleport cluster. The tctl and tsh clients must be at most one major version behind your Teleport cluster version. Send a GET request to the Proxy Service at /v1/webapi/find and use a JSON query tool to obtain your cluster version. Replace with the web address of your Teleport Proxy Service:

      $ TELEPORT_DOMAIN=
      $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"
      
    2. Follow the instructions for your platform to install tctl and tsh clients:

  • ssh openssh 도구
  • ansible >= [ansible.min_version]
  • JSON 출력을 처리하기 위한 선택적 도구 jq

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

tsh로 Teleport에 로그인합니다:

$ tsh login --proxy=

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 + "."' > 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를 사용하여 SSH 연결을 시도해 보세요:

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

ssh가 작동하면 자세한 모드를 켜고 플레이북을 실행해 보세요:

$ 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