Seongsiks

Being A DevOpser. Powered by
Obtvse, highlight.js, theme toc Creative Commons License
Seongsiks Twitter Github Email
DevOps Ruby On Rails Chef Projects Misc Movies & Drama ME

Ansible Secret Tips(비법)

Overview

ansible을 사용하면서 찾은 비법들을 공유합니다.

ansible + python 2.4

ansible이 설치되어 돌아갈려면 적어도 python 2.6이상이 설치 되어 있는 머신에서 실행하는 것이 좋습니다. 그리고 contolled machine, 즉 타겟 노드에서도 마찬가지로 2.6이상이 좋지만, 아예 사용하지 못하는 것은 아닙니다. 2.5이하를 사용하고 있다면 simplejson-python 모듈을 수동으로 설치해 주어야합니다.

TIP : ansible의 모듈중에는 타겟 노드에 파이선 버전이 낮거나, 아예 설치 되어 있지 않아도 실행할 수 있는 것들이 있습니다. 바로 raw모듈script모듈입니다. raw는 타겟 노드에 bash명령을 날릴 수 있는 모듈인데 이 모듈을 이용해서 위에 필요하다고 말씀드린 simplejson-python모듈을 설치하게 되면 이후 다른 ansible모듈을 사용 할 수 있는 상태로 만들 수 있습니다. 자세한 사항은 여기를 확인하세요.

paramiko vs ssh

ansible을 사용하면서 또 주의 해야할 사항이 타겟 노드와의 통신 방식이 버전에 따라 조금 다르다는 겁니다. ansible 1.2이하에서는 디폴트 통신방식이 paramiko입니다. 1.3부터는 ssh이고요. 두개의 차이는 속도 차이가 있을뿐 거의 똑같습니다. 그러나 사용할때 주의 할 점이 있습니다.

ansible 1.2.x + paramiko

이 조합은 그냥 1.2버전 이하에서 디폴트로 따로 설정을 안해주면 이 조합을 사용하게 됩니다. 기존 오래된 버전의 openssh보다 더 빠른 python의 paramiko모듈을 사용하도록 하는것이죠.

ansible 1.2.x + openssh

이렇게 사용하고 싶다면 ansible명령을 날릴때마다 -c ssh라고 줘야 합니다.

ansible 1.3.x + openssh

ansible이 새로운 버전부터 디폴트 통신을 ssh로 바꿔서 기존의 paramiko에 대한 의존성을 제거했습니다. 이렇게 바꿀 수 있던것은 openssh의 버전이 많이 빨라진 덕인데요. 이 옵션이 ControlPersist입니다. 그런데 이 옵션은 최신 버전의 openssh에서만 지원되기 때문에 이를 지원하지 못하는 오래된 os를 사용하는 경우에는 이 옵션을 꺼야합니다. 자세한 문헌은 여기에서 확인하세요.

ansible의 python sshpass 모듈

ansible은 기본적 ssh의 통신방식을 사용하기 때문에 패스워드를 필요하거나 ssh public key을 타겟에 미리 배포해놓고 no pass으로 접속해야하는 후자는 public key를 미리 배포해야한다는 것 때문에 초기 설정에 약간의 수동 부분이 생기고, 보안상도 좋지 않아 매번 패스워드를 받는것을 추천하는데, 이렇게 패스워드를 받는것을 추천.. 근데 문제가.. ansible이 이렇게 패스워드를 받을때 sshpass 모듈을 사용하는데.. 이게 약간 문제가 있어. 작동하지 않는 경우가 있습니다. 저는 그냥 nopass로 일단 열었습니다.

playbook선택적으로 실행시키기.

크기가 큰 playbook을 부분적으로 실행시키고 싶을때 사용할 방법으로 TAG기능을 ansible에서는 추천하고 있는데.. 실제로 사용해보니 제 취향에는 맞지 않아 사용하지 않았습니다. 그 이유는 playbook에는 어떤 tag가 있을때 실행된다라는 식으로 정의하고 CLI에서 이 태그를 선택하는 방식입니다. 실행 여부 선택을 CLI에서 하는게 싫었습니다. 게다가 실행 여부만 선택하지 특정 파라미터에 따라서 동작을 다르게 할 수 없습니다. 그래서 저는 playbook에서 variable을 선언하고 이 variable에 따라서 다르게 동작하는 ROLE을 만들어서 제가 원하는 방식으로 playbook에서 컨트롤 하는 방식을 사용했습니다.

변수선언 변수분기

ansible loop(반복문)

ansible에서 반복문은 다음과 같이 사용합니다. 변수분기 with_items에 배열을 주어서 해당 TASK가 반복되도록 하는데 이 반복되는 task의 변수 접근 scope가 격리되는 것을 확인하였습니다. 즉, item.XXX로 되어 있는 변수만 사용할 수 있고 다른 변수를 사용할 수 없는겁니다.

Ansible shell Module

가장 흔하게 많이 사용하는 module인 shell을 사용할때 약간 골때리는 문제가 생깁니다.

- name: move file
  shell: mv /logs/access.log /home/kssminus/logs creates=/home/kssminus/logs

shell module의 creates 옵션은 해당 파일이 있으면 실행하지 않도록하는 옵션입니다. 그런데 위와 같이 작성하면 해당 task는 에러가 나면서 실행되지 않습니다. 그 이유는 mv가 파라미터의 개수가 고정되어 있지 않은 쉘 명령이라서 creates을 포함 그 뒤도 다 mv명령의 파라미터로 인식하게 되는겁니다. 이럴때 해결하는 방법은 다음과 같이 작성하는 겁니다.

- name: move file
  shell: mv /logs/access.log /home/kssminus/logs; creates=/home/kssminus/logs

위와 같이 세미콜론 ;을 이용하여 쉘명령이 끝났음을 명시적으로 표시해주면 됩니다.

comments powered by Disqus
Back to Chef