IaC(Infrastructure as Code)

Ansible Part. 2 (Adhoc)

cwchoiit 2024. 3. 17. 17:41
728x90
반응형
SMALL
728x90
SMALL

이전 시간에 Inventory 파일들을 만들어보고 알아보았다. 그럼 이 파일을 어떻게 수행하고 어떻게 실행해야 하는걸까?

여러 방법이 있지만 그 중 하나인 Adhoc 방법에 대해 알아보자.

 

Adhoc

쉽게 말하면, ansible이라는 명령어를 통해 수행하는 CLI 방식이라고 생각하면 된다. 형식은 다음과 같이 생겼다.

ansible [host-pattern] [-m module] [-a 'module options'] [-i inventory]
  • host-pattern: 그룹명을 의미한다. 
  • -m module: Adhoc 명령어를 통해 실행할 ansible 모듈을 의미한다.
  • -a module options: 모듈에 특정 옵션을 부여할 경우
  • -i inventory: 특정 인벤토리 파일의 경로

ping 모듈

그럼 다음 명령어 사용 방법을 기반으로 한번 아래를 수행해보자.

ansible -i amazon.inv -m ping all

참고로 위 사용 방법과 순서가 뒤죽박죽으로 되어 있다. 즉, 순서에 영향을 받지 않는다는 의미이다. 지금은 인벤토리 파일이 먼저 왔고 모듈이 그 다음에 왔고 호스트 패턴(그룹)이 제일 마지막에 왔음을 확인할 수 있다.

 

아무튼 이 명령어를 수행하면 다음과 같은 에러를 마주한다. 이전 포스팅에서 설명했지만, Ansible은 SSH로 접속할 수 있어야 하기 때문에 접속 정보가 필요한데, Amazon EC2의 유저 정보는 ec2-user이다. 그러나, 우리가 amazon.inv 파일에서는 별칭이나 ansible_user를 정의하지 않았기 때문에 현재 로컬 사용자로 접속하려고 시도한다. 당연히 없을것이다 해당 유저는. 그래서 문제가 발생한다.

 

그럼 amazon.inv 파일을 그대로 사용할 경우 유저 정보를 기입해줘야 하는데 다음과 같이 사용가능하다.

ansible -i amazon.inv -m ping all -u ec2-user

-u 옵션을 통해서 유저 정보를 줄 수 있다. 이것을 어떻게 알아냈냐면 그냥 -h 옵션으로 사용가능한 옵션을 확인해보면 된다. 이렇게 수행하면 다음과 같이 정상 결과를 돌려 받는다.

 

근데, 여기서 정상 결과를 돌려 받은 이유는 나는 ssh-agent라는 것을 사용해서 내 .pem 파일을 SSH 키 보관 장소에 보관했기 때문에 해당 EC2에 접근 가능한 Key pair 정보를 알려주지 않고도 접속이 가능한 것이다. ssh-agent를 사용하지 않는다면 --private-key라는 옵션을 주어서 .pem 파일 경로를 지정해줘야한다. ssh-agent를 사용한다면 .pem 파일을 등록해서 사용하면 굳이 SSH로 접속할 때마다 키 정보를 알려주지 않아도 되기 때문에 편리하다. 다음이 SSH-Agent가 키를 보관하는 저장소에 추가하는 방법이다.

ssh-add -K /path/to/.pem/

 

참고로 여기서 사용한 ping 모듈은 우리가 흔히 아는 ping이랑 다르다. 여기서 ping 모듈은 하는 작업이 2개다. 1. 대상 호스트에 연결 2. 파이썬 사용가능 여부 확인. 이렇게 두 가지를 해주는 모듈이다. 실제로 저 성공 결과 이미지를 보면 discovered_interpreter_python이라는 키에 파이썬 경로가 보여지는것을 알 수 있다. 이 작업을 하는 이유는 'Ansible'을 이용하게 되면 Control Node, Managed Node 이렇게 두 가지가 있다. 

Control Node는 지금 이 명령어를 수행하는 로컬 PC를 의미한다. 반면, Managed Node는 Ansible이 작업하는 서버인 AWS EC2를 의미한다. 이 예제에선 Amazon EC2를 말한다고 보면 된다. 당연히 Control Node에는 Ansible이 설치되어 있어야 하고 Managed Node는 파이썬이 설치가 되어 있어야 한다. 그래서 ping 모듈이 파이썬이 설치됐는지 확인한다.

 

command 모듈

이번엔 command라는 모듈을 사용해보자. 이는 Managed Node 내부에서 주어진 커맨드를 실행하는 모듈이다.

ansible -i vars.inv -m command -a "uptime" ubuntu

 

이번엔 vars.inv 파일을 사용해서 ansible_user도 작성이 된 파일을 사용하자. 따로 -u 옵션을 사용하기 귀찮으니까.

그리고 command 모듈을 사용해서 "uptime" 이라는 명령어를 ubuntu 그룹에만 수행하자. 

잘 수행됐음을 알 수 있다.

 

apt 모듈

이번엔 Ubuntu의 패키지 매니저인 apt-get을 사용할 수 있는 apt 모듈을 사용해서 패키지를 내려받아보자.

ansible -i vars.inv -m apt -a "name=git state=latest update_cache=yes" ubuntu

저렇게 하면 다음과 같은 에러가 발생할 것이다. 이는 무슨 에러냐면 호스트에 글로벌로 패키지를 설치하려면 기본적으로 root 권한이 있는 사용자가 설치해야 한다. 그러나 지금 vars.inv 파일에 기입된 유저는 ubuntu이므로 아래와 같은 권한 에러가 발생하는 것.

이를 해결하기 위해 다음과 같이 옵션을 붙일 수 있다.

ansible -i vars.inv -m apt -a "name=git state=latest update_cache=yes" ubuntu --become

--become 옵션은 사용자를 변경하는 옵션인데 기본적으로 root 사용자로 변경한다. 이렇게 실행해보자.

 

다음과 같이 잘 수행되었다. 이제 위에서 배운 command 모듈로 실제로 git이 잘 설치됐는지 확인해보자. 각각의 호스트에 이렇게 잘 설치됐음을 확인할 수 있다.

 

이 반대로 패키지를 설치할수도 있지만 삭제할수도 있다. 그럴땐 이렇게 작성하면 된다. state=absent는 해당 패키지를 제거한다는 의미이다. 이 명령어를 수행해보자.

ansible -i vars.inv -m apt -a "name=git state=absent update_cache=yes" ubuntu --become

 

잘 삭제됐는지 다시 한번 git 명령어를 사용해보자. 아래처럼 git을 찾을 수 없다고 나온다. 

 

 

결론

Ansible을 사용하는 방법 중 하나인 명령어로 수행하는 방식 'Adhoc' 방식을 알아보았다.

728x90
반응형
LIST

'IaC(Infrastructure as Code)' 카테고리의 다른 글

Ansible Part. 4 (Handler)  (0) 2024.03.18
Ansible Part. 3 (Playbook)  (0) 2024.03.18
Ansible Part. 1 (Inventory)  (3) 2024.03.17
Packer Part. 5 (Post Processor)  (2) 2024.03.15
Packer Part. 4 (Data Source)  (0) 2024.03.14