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

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


기초: 명령어 날리기 (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
> inventory file 을 수정/생성 합니다. hosts 에서 지정한 name으로 말이죠

* 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 를 조화하여 실행할 수 있습니다.


To be continued
... #3 포스팅에서 만나요~~~!!





통계 위젯 (블랙)

38114
576
158410

GoogleAdsenseResponsive

Cluster map