Tag Archives: Deploy

Ansible 시작하기

ansible_logo

머리말

이 글은 Ansible이 설치되어있다고 가정한 상태에서 작성한 글입니다. 아직 설치 전이라면 [Ansible Installation]을 먼저 확인하시어 자신의 OS에 맞게 설치해주시기 바랍니다. 저의 경우에는 CentOS 6환경에서 구동을 하고 있기에 위의 문서를 참고하여 다음과 같은 방법으로 설치를 진행하였습니다.

$ yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
$ yum install ansible

이 글에서는 Ansible을 시작하기 위한 몇가지 명령에 대해 알아보도록 하겠습니다. 여기서 처음 우리가 하려는것은 Ansible의 강력한 설정/배포/통합 기능이 아닙니다.  이러한 기능은 플레이북의 각각의 섹션에서 다루어지고 있습니다.

이 섹션에서는 초기에 무엇을 해야 하는지를 다룹니다. 이러한 컨셉을 이해한 다음에서는 [Introduction To Ad-Hoc Commands]에서 더 자세한 내용을 다루고 있으므로 읽어보시길 추천해 드립니다. 이후에 플레이북을 통해 가장 관심있는 파트의 내용을 확인하시면 됩니다.

원격 접속 정보

시작하기전에, Ansible이 어떻게 원격지의 서버와 SSH를 통해 통신하는지를 이해하는것이 중요합니다.

기본적으로, Ansible 1.3 혹은 그 이후 버전부터는 네이티브 OpenSSH를 통해서 원격 통신을 하게 됩니다. 이는 ControlPersist (SSH의 퍼포먼스 관련 옵션), Kerberos, 또는 ~/.ssh/config의 Jump Host 를 사용할 수 있습니다. 하지만 Enterprise Linux 6를(RHEL에서 나온 CentOS 포함) 컨트롤 머신으로 사용하게 될 경우 OpenSSH의 버전이 너무 낮아 ControlPersist를 지원하지 않습니다. 이러한 운영체제하에서는 Ansible은 높은 수준의 ‘paramiko’라고 불리는 OpenSSH의 Python 구현체를 대신 사용합니다. 만약 Kerberos가 적용된 SSH 또는 그 이상의 기능을 사용하고 싶다면 Fedora, OS X, 또는 Ubuntu와 같은 최신 버전의 OpenSSH가 적용된 플랫폼을 채택하시기 바랍니다. 또는 가속 모드(Accelerated Mode)를 확인해 보시기 바랍니다.

Ansible 1.2까지는 이 paramiko가 기본적으로 적용되어있습니다. 네이티브 SSH는 -c ssh 옵션을 사용하거나 설정파일에 정의해 줌으로써 명시적으로 사용할 수 있습니다.

가끔 디바이스가 SFTP를 지원하지 않는 경우를 겪을 수 있습니다. 이 경우는 매우 희귀한 경우지만 만약 발생한다면 설정 파일(Configuration file)에서 SCP 모드로 동작하도록 변경할 수 있습니다.

원격 머신과 통신할 때 Ansible은 당신이 기본적으로 SSH 키를 사용하고 있다고 가정하에 동작합니다. SSH키를 사용하는 것이 권장되지만 –ask-pass 옵션을 사용하여 패스워드 인증을 사용하는 것도 가능합니다. 만약 sudo 기능을 사용하고 이때에 비밀번호를 입력할 필요가 있다면 –ask-become-pass 옵션을 이용하여 대응할 수 있습니다.

상식이 될 수 있지만 중요한 부분이라 공유하자면, 관리 시스템은 관리받는 시스템과 가까운곳에 위치하는것이 좋습니다. 만약 Ansible을 클라우드 환경에서 사용한다면 이 머신을 클라우드 안쪽에서 운용할것을 권장합니다. 이렇게 하는것이 바깥의 인터넷 환경에서 사용하는것보다 더 나은 환경을 제공할 수 있습니다.

좀 더 고급 주제로, Ansible은 단순한 방법으로 SSH를 원격 접속하지 않습니다. 전송은 Pluggable Transport를 지원하며 chroot, lxc, jail 컨테이너를 사용하여 관리되는 요소들을 로컬에서 관리합니다. ansible-pull 이라고 불리는 모드를 사용하면 이러한 시스템을 뒤집을 수 있으며 (관리 머신이 Push하는 방식이 아닌) 원격 자원을 필요로 하는 시스템에서 원격 저장소에서 스케쥴링으로 git pull을 동작하도록 할 수 있습니다.

첫번째 명령

Ansible이 설치되어있다면 이제 기본적인것들을 시작해 보도록 하겠습니다.

당신이 관리하고자 하는 하나 또는 다수의 원격 시스템들을 /etc/ansible/hosts 파일에 작성해줍니다. 당신의 공개키가 이 서버들에 ~/.ssh/authorized_keys로 저장이 되어있어야 합니다.

192.168.122.221
192.168.122.222
192.168.122.223

이것을 Inventory 파일이라고 합니다. [Inventory]에서 좀 더 자세한 내용을 확인할 수 있습니다. 만약 당신의 시스템 셋업 상황에 따라 다른 비밀키를 사용해야 한다면 –private-key 옵션을 사용할 수 있습니다.

이제 모든 노드에 핑을 때려보도록 하겠습니다.

$ ansible all -m ping
192.168.122.221 | success >> {
    "changed": false, 
    "ping": "pong"
}

192.168.122.222 | success >> {
    "changed": false, 
    "ping": "pong"
}

192.168.122.223 | success >> {
    "changed": false, 
    "ping": "pong"
}

SSH를 사용할때와 마찬가지로 이제 Ansible은 당신의 현재 유저네임을 이용하여 각각의 머신들에 접속을 시도할 것입니다. 원격지 접속에 사용할 유저네임의 변경을 원할 경우 -u 파라미터를 사용하시면 됩니다.

# eye로 로그인
$ ansible all -m ping -u eye

# eye로 로그인하지만 sudo를 통해 root로 작업을 수행
$ ansible all -m ping -u eye --sudo

# eye로 로그인하지만 sudo를 통해 batman으로 작업을 수행
$ ansible all -m ping -u eye --sudo --sudo-user batman

# 최신의 Ansible은 sudo 파라미터가 deprecated됨. b 파라미터를 사용하여 root로 sudo 수행
$ ansible all -m ping -u eye -b

# eye로 로그인하지만 batman으로 sudo 수행
$ ansible all -m ping -u eye -b --become-user batman

이러한 sudo 실행에 대한 구현은 Ansible의 설정파일에서 당신이 원할 경우 다른 명령으로 변경할 수 있습니다. 실행시에 함께 추가하고 싶은 플래그(예를 들어 -H)도 설정할 수 있습니다.

이제 당신의 모든 노트들에 대해 실시간 명령을 실행할 수 있습니다.

$ ansible all -a "/bin/echo hello"
192.168.122.221 | success | rc=0 >>
hello

192.168.122.222 | success | rc=0 >>
hello

192.168.122.223 | success | rc=0 >>
hello

호스트 키 확인

Ansible 1.2.1 이후 버전부터는 호스트 키 확인 과정이 디폴트로 활성화 됩니다. 만약 호스트가 새로 설치 되었고 known_hosts 파일에 다른 키가 등록된다면 이 문제가 해결될때까지 에러 메시지가 뜨게 될 것입니다. 만약 호스트가known_hosts파일에 등록되지 않은 시점이라면 이 키를 등록할것인지에 대한 확인 프롬프트가 뜨게 될 것입니다. 당신은 이런것을 원치 않을 것입니다.

당신이 이것에 대해 이해를 하고 있고 이런 확인 과정을 비활성화 하길 원한다면 /etc/ansible/ansible.cfg 또는 ~/.ansible.cfg 파일을 수정하여 해결할 수 있습니다.

[defaults]
host_key_checking = False

또는 다음과 같이 환경 변수를 추가하여 피할 수도 있습니다.

$ export ANSIBLE_HOST_KEY_CHECKING=False

또한 paramiko 모드에서 호스트키 확인 과정이 느리게 동작하는 문제가 있으므로 이 기능을 사용할 때는 ssh로 전환할 것을 추천합니다.

Ansible은 동작할때 몇몇 정보들을 원격 서버의 syslog 에 로깅을 할 것입니다. 만약 이것이 필요없을 경우 “no_log: True” 설정을 추가하여 끌 수 있습니다. 이것은 나중에 다시 설명하도록 하겠습니다.

컨트롤 머신의 기본 로깅을 활성화 하기 위해서는 설정파일[Configuration File]의 “log_path” 설정을 세팅해주면 됩니다. 기업 유저의 경우 Ansible Tower에 흥미가 있을 수도 있겠습니다. Tower는 호스트, 프로젝트, 개별 인벤토리별로 상세한 히스토리를 볼 수 있는 굉장히 강력한 데이터베이스 로깅 기능을 제공합니다. 그래픽을 가진 화면과 REST API 모두를 제공합니다.

참고 : http://docs.ansible.com/ansible/intro_getting_started.html