[번역] Ansible 2 튜토리얼 #2 - 기본 명령어 와 모듈 개발 이것저것

이 글은 Servers for Hackers 사이트의 한 포스팅 글을 번역한 것입니다.
원문은 여기 를 참조해주세요~


설정하기 (Configuration)


이전 포스팅에서, 우린 Ansible 을 전역으로 설치하고 /etc/ansible 에 있는 기본 설정을 사용해 보았습니다.

하지만 일반적인 용법은 Ansible 을 위에서 우리가 한것처럼 virtualenv 에 두고 사용하는 것이지요. 이런경우, 우린 기본 설정파일을 가질 수 없습니다 (또는 그것을 원할 수도 있습니다.) 우린 이 상태로 계속 할겁니다 - 우린 설정파일을 우리가 필요할때 로컬 폴터에 생성할 수 있습니다. 우리는 /etc 또는 그 어떤 다른 위치의 설정파일도 필요가 없을 것입니다. 그리고 그로인해 조금 더 잘 사용할수 있죠

서버 관리 하기:인벤토리 (Managing Servers: Inventory)

Ansible 은 어떤 서버를 관리할것인지 정의하는 inventory file 을 가집니다. 이 파일명은 자유이지만, 주로 hosts 라고 짓습니다.
hosts 파일에는, 우리가 관리하고자 하는 서버를 정의할수 있습니다.
여기에 "web" 이라는 라벨 하위에 우리가 관리하고 싶은 2개의 서버를 정의해보겠습니다.
label 은 아무 값이나 넣어도 상관이 없습니다.

[web]
192.168.22.10
192.168.22.11


이것으로 현재는 충분합니다. 만일 필요하다면, 우리는 호스트를 범위로 지정할수도, 몇개의 그룹으로, 재사용 가능한 변수등으로 멋지게 setup 하여 동적인 inventory 생성을 할수 있습니다. 더 많은 호스트 선언 방식에 대한 정보는 아래 2개의 링크를 참조하세요
https://docs.ansible.com/ansible/latest/intro_inventory.html
https://docs.ansible.com/ansible/latest/intro_dynamic_inventory.html

이 문서를 테스트 해보려면, 우분투 16.04 서버를 aws 에 하나 띄우고(어떤 클라우드 서비스를 쓰든 상관 없습니다) Ansible Task 를 서버에서 돌리세요. 이 뜻은, Ansible 을 내가 직접 관리하는 서버에서 돌린다는 것입니다. 이는 Ansible 을 제대로 사용하는 법이죠. (주 사용법은 아니지만요)

우리가 Ansible 을 Local 환경에서 돌려보았을때, 우리는 inventory file 에 뭐가 들었는지 볼 필요가 없습니다. 제가 로컬환경에서와 원격서버에 각각 Ansible 을 돌리는 법을 보여드릴게요.

이제, "hosts" 파일을 수정하여 local host를 local 밑에 두고 가짜 원격 서버호스트를 remote 밑에 한번 둬볼까요

[local]
127.0.0.1

[remote]
192.168.1.2


제가 localhost 와 원격 서버로 연결하는 명령어를 보여드릴게요



기초: 명령어 날리기 (Basics: Running Commands)

자 이제, 서버에 Task 를 돌려봅시다.

Ansible 은 당신이 서버에 ssh-key 로 ssh 접근이 가능하다고 전제합니다.
왜냐면 Ansible은 ssh 를 쓰거든요. 그것이 설치된 서버는 inventory 서버에 ssh 접속이 필요합니다.

하지만 Ansible 은 현재 user 권한으로 연결을 시도할겁니다. 만일 ubuntu 라는 유저로 Ansible 을 구동했다면 (내 경우 AWS 에서) 그것은 다른 서버들에 ubuntu 라는 사용자 명으로 접속을 시도할겁니다.
만약 Ansible 이 SSH 로 직접적으로 원격서버에 접근할수 있으면 별 문제없이 커맨드를 날릴 준비가 된것입니다.

# Run against localhost
$ ansible -i ./hosts --connection=local local -m ping

# Run against remote server
$ ansible -i ./hosts remote -m ping
127.0.0.1 | success >> {
   "changed": false,
   "ping": "pong"
}

만약 "Too many authentication failures" 라는 SSH error 를 만나면, 옵션을 하나 주면 됩니다. 그래서 Ansible 이 우리에게 필요한 암호를 묻게 하는거죠.

ansible -i ./hosts --ask-pass --ssh-extra-args='-o "PubkeyAuthentication=no"' all -m ping.

--connection=local 을 쓰는 이유는 Ansible 이 ssh로 명령어를 날리지 않도록 하기 위한 것입니다. 왜냐하면 우린그저 로컬 환경에서 작업하는 것이니까요.
하지만 우린 여전히 hosts 파일을 작성하여 어디에 연결할 것인지 지정해야합니다.
(어떤경우에는 , 혼자서 자동으로 localhost 가 127.0.0.1 인줄 모르거든요!!)

어떤 경우라도, 우린 Ansible이 Task 가 어떤 변경사항과 결과가 있었는지 그에대한 JSON 출력을 볼수 있습니다.

명령어의 부분부분에 대한 의미를 쭉 훑어봅시다.

* -i ./hosts
> 위에서 작성한 
hosts 라는 파일을 inventory file 로 지정합니다.

* remote, local, all
> hosts inventory file 에 정의된 해당 서버들을 사용합니다.
> "all" 은 파일에 지정한 모든 서버를 사용하겠다는 특별 예약어 입니다

* -m ping
> 단순히 ping 명령어를 사용합니다. 해당 명령어를 날리고 그 결과를 리턴합니다

* -c local | --connection=local
> SSH 를 통해 명령어를 날리지 않고 로컬 서버에다가 직접 날립니다


모듈 (Modules)

Ansible 은 대부분의 Task 를 완수하기위해 modules 를 사용합니다. 모듈은 소프트웨어를 설치하고, 파일을 복사하고, 템플릿을 사용하는 등의 많은일을 할 수 있습니다. 궁금하면 아래 링크로 이동합니다.
http://docs.ansible.com/ansible/latest/modules_by_category.html

모듈은 Ansible 을 사용하는 방법입니다.
Task를 수행하기위해 Facts 라고 하는 context 를 사용하여 어떤 동작을 해야할지 결정하기 때문입니다.

만일 모듈이 없다면, 임의의 쉘 명령어들을 사용해야만했을 겁니다. 그리고 그저 bash script 를 짜야 했겠죠. 여기 Ansible 로 짠 임의의 쉘 명령어들이 있습니다. (쉘 모듈을 사용해서 말이죠!!)

# Run against a local server
ansible -i ./hosts local --connection=local -b --become-user=root \
-m shell -a 'apt-get install nginx'

# Run against a remote server
ansible -i ./hosts remote -b --become-user=root all \
-m shell -a 'apt-get install nginx'

여기에 "sudo apt-get install nginx" 라는 명령어는 쉘을 통하여 실행됩니다.

몇가지 새로운 옵션 플래그들을 살펴봅시다 :

* -b - "become" 의 약자입니다, Ansible 이 명령어를 실행할때 어떤 특정 유저로 실행하도록 하는거죠. 이것으로 서로다른 유저들이 root 권한을 가질수 있게 됩니다.
* --become-user=root - 뒤따르는 명령어를 root 권한으로 실행합니다. (sudo 를 붙이는거랑 비슷하죠) 여기에 root 이외 특정 유저를 넣을수도 있습니다.
* -a 는 -m 과 함께 그에 맞는 인자값을 넘기는데 사용합니다.

하지만 이것은 특별히 강력한 기능은 아니죠. 이러한 명령어들을 모든 서버에 한번에 실행하도록 하기에는 아직 bash script 가 하는 더 많은 일중에 아주 일부만 본 것입니다.

만일 우리가 좀더 적절한 모듈을 사용할수 있다면, 결과에 대한 확신을 가지고 명령어를 날릴 수 있을겁니다. Ansible 모듈은 멱등성을 보장합니다. 같은 task 를 여러번 날려도 결과가 같은 성질 말이죠

Debian/Ubuntu server 에서 설치를 하려면 "apt" 모듈이 같은 역할을 합니다. 그 역시 멱등성을 보장하죠.

# Run against a local server
ansible -i ./hosts local --connection=local -b --become-user=root \
-m apt -a 'name=nginx state=installed update_cache=true'

127.0.0.1 | success >> {
"changed": false
}

# Run against a remote server
ansible -i ./hosts remote -b --become-user=root \
-m apt -a 'name=nginx state=installed update_cache=true'

127.0.0.1 | success >> {
"changed": false
}

이것은 apt module 을 사용하여 repository cache 를 업데이트하고 Nginx 를 설치합니다. (만약에 설치가 안되어있을때)

Task 실행 결과에 "changed": false 라고 나왔습니다. 이것은 변경사항이 없었다는것을 알려줍니다.; 저는 이미 쉘 모듈로 Nginx 를 설치했기 때문이죠. 좋은점은 이 명령어를 여러번 실행해도 걱정이 없다는 겁니다. - Nginx 가 미리 설치된것을 Ansible 은 알고 재설치하지 않습니다.


명령어를 살펴봅시다.:

* -i ./hosts - inventory file 지정, 호스트가 지정된 것들을 불러오죠.
* -b - "become" 의 약자입니다, Ansible 이 명령어를 실행할때 어떤 특정 유저로 실행하도록 하는거죠. 이것으로 서로다른 유저들이 root 권한을 가질수 있게 됩니다.
* --become-user=root - 뒤따르는 명령어를 root 권한으로 실행합니다. (sudo 를 붙이는거랑 비슷하죠) 여기에 root 이외 특정 유저를 넣을수도 있습니다.
* local | remote - inventory file 로부터 local 혹은 remote 중 어떤것을 실행할지
* -m apt - apt 모듈 사용
* -a 는 -m 과 함께 그에 맞는 인자값을 넘기는데 사용합니다.

우리는 필요한 Task 들을 (모듈을 통해) 이렇게 직접적인 방법으로 실행시킬수 있습니다.
하지만 조금더 관리하기 쉽게 해봅시다. 이제 Task 에서 Playbook 으로 넘어갈겁니다.
Playbook 은 여러개 task 를 조화하여 실행할 수 있습니다.






핑백



통계 위젯 (블랙)

1875
454
168079

GoogleAdsenseResponsive

Cluster map