연결 방법과 세부 사항

연결 방법과 세부 사항

이 섹션은 인벤토리에 대해 Ansible이 사용하는 연결 방법을 확장하고 보완하는 방법을 보여줘요. 기본 연결 방식에서 시작해 원격 사용자 설정, SSH 키, localhost 실행, 호스트 키 확인 관리까지 이어집니다.

기본적으로 Ansible은 네이티브 OpenSSH를 사용해요. OpenSSH가 ControlPersist(성능 기능)와 Kerberos, 그리고 ~/.ssh/config의 Jump Host 설정 같은 옵션을 지원하기 때문이에요. 만약 컨트롤 머신이 ControlPersist를 지원하지 않는 예전 버전의 OpenSSH라면, Ansible은 'paramiko'라는 파이썬 구현체로 폴백해요.

출처: 문서

본문

원격 사용자 설정

기본적으로 Ansible은 컨트롤 노드에서 쓰는 사용자 이름 그대로 모든 원격 장치에 연결해요. 원격 장치에 그 사용자 이름이 없으면 연결용으로 다른 사용자 이름을 정할 수 있어요. 그냥 일부 작업만 다른 사용자로 하고 싶을 때는 권한 상승(become) 문서를 보세요.

플레이북에서 연결 사용자를 설정하려면 이렇게 해요.

---
- name: update webservers
  hosts: webservers
  remote_user: admin

  tasks:
    - name: thing to do first in this playbook
      # ...

인벤토리의 호스트 변수로 설정할 수도 있어요.

other1.example.com     ansible_connection=ssh        ansible_user=myuser
other2.example.com     ansible_connection=ssh        ansible_user=myotheruser

또는 인벤토리의 그룹 변수로 설정할 수 있어요.

cloud:
  hosts:
    cloud1: my_backup.cloud.com
    cloud2: my_backup2.cloud.com
  vars:
    ansible_user: admin

SSH 키 설정

기본적으로 Ansible은 원격 머신 연결에 SSH 키를 쓴다고 가정해요. SSH 키 사용을 권장하지만, 필요하면 --ask-pass 옵션으로 비밀번호 인증을 쓸 수도 있어요. 권한 상승(sudo, pbrun 등)용 비밀번호가 필요하면 --ask-become-pass를 사용하세요.

참고로 Ansible은 ssh 연결 플러그인(기본값)을 쓸 때 사용자와 ssh 프로세스 사이에서 SSH 키를 해독하는 비밀번호를 수동으로 받아들일 채널을 노출하지 않아요. 그래서 ssh-agent 사용을 적극 권장해요.

ssh-agent를 설정해 비밀번호 재입력을 피하려면 이렇게 하면 돼요.

$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa

설정에 따라 pem 파일을 지정하려고 Ansible의 --private-key 명령행 옵션을 쓸 수도 있어요. 프라이빗 키 파일을 추가하는 방법도 있어요.

$ ssh-agent bash
$ ssh-add ~/.ssh/keypair.pem

ssh-agent 없이 프라이빗 키 파일을 추가하는 또 다른 방법은 인벤토리 파일에서 ansible_ssh_private_key_file을 쓰는 거예요.

localhost에 대해 실행하기

서버 이름에 "localhost"나 "127.0.0.1"을 쓰면 컨트롤 노드에서 명령을 실행할 수 있어요.

$ ansible localhost -m ping -e 'ansible_python_interpreter="/usr/bin/env python"'

인벤토리 파일에 이렇게 추가하면 localhost를 명시적으로 지정할 수 있어요.

localhost ansible_connection=local ansible_python_interpreter="/usr/bin/env python"

호스트 키 확인 관리

Ansible은 기본적으로 호스트 키 확인을 켜 둬요. 호스트 키 확인은 서버 스푸핑과 중간자 공격을 막아 주지만, 유지보수가 필요해요. 호스트를 재설치해서 known_hosts의 키가 달라지면 그 키를 고치기 전까지 에러 메시지가 나요. 또 새 호스트가 known_hosts에 없으면 컨트롤 노드가 키 확인을 물어보는데, Ansible을 cron 같은 데서 쓰면 대화형 경험이 생겨요.

이 동작을 끄고 싶다면, 그 의미를 잘 이해하고 나서 /etc/ansible/ansible.cfg 또는 ~/.ansible.cfg를 편집하면 돼요.

[defaults]
host_key_checking = False

대신 ANSIBLE_HOST_KEY_CHECKING 환경 변수로도 설정할 수 있어요.

$ export ANSIBLE_HOST_KEY_CHECKING=False

참고로 paramiko 모드의 호스트 키 확인은 꽤 느려서, 이 기능을 쓸 때는 'ssh'로 전환하는 것도 권장해요.

다른 연결 방법

Ansible은 SSH 외에도 다양한 연결 방법을 쓸 수 있어요. 로컬에서 관리하는 것과 chroot, lxc, jail 컨테이너를 관리하는 것을 포함해 아무 연결 플러그인이나 선택할 수 있어요. 또 'ansible-pull' 모드는 시스템을 뒤집어서, 각 시스템이 중앙 저장소에서 구성 지시문을 가져오도록 예약된 Git 체크아웃으로 '전화를 거는' 방식이에요.

더 알아보기 (Learn more)

  • ssh — ssh 클라이언트 바이너리로 연결하기와 remote_user 키워드·ansible_user 변수 세부 사항
  • Controlling how Ansible behaves: precedence rules — Ansible 우선순위 규칙
  • How to build your inventoryansible_ssh_private_key_file로 프라이빗 키를 넣는 방법을 포함한 인벤토리 구축법
  • Understanding privilege escalation: become — 다른 사용자로 작업을 실행하는 권한 상승