[AWS] ANSIBLE 로 관리노드 아파치 배포

고구마양갱·2025년 6월 6일

AWS CLOUD

목록 보기
28/32

수많은 인프라를 효율적으로 관리, 운영하기 위해선 테라폼, 앤서블과 같은
코드형 인프라 툴을 활용할 수 있어야 한다. 테라폼은 저번에 해봤으니
이번엔 앤서블을 해볼 차례이다.

테라폼은 사용자의 pc에서 할 수 있으나, 앤서블은 ssh 로 연결해서 명령을 전달해야 한다.
그렇기에 앤서블은 네트워크 내부에 명령을 전달할 제어노드(컨트롤 노드)와 명령을 받아 실행할 관리노드를 구성해야 한다. 제어노드에 앤서블을 설치, 제어노드가 관리노드에 SSH 로 연결하여 관리노드에서 명령어를 수행하는 방식이다.

실습 순서는

- ansible 설치
- 관리 노드 계정 SU 설정
- 컨트롤 노드, 관리 로드 ssh 연결 설정
- 컨트롤 노드에서 관리 노드로 명령 실행

1. ANSIBLE 설치

관리노드에 접속해서 명령어를 통해 앤서블을 설치한다. 서버 OS 별로 설치 명령어에 차이가 있으니, 검색해서 맞는 명령어를 사용한다.

앤서블 설치 확인

2. 관리노드 계정 SU 명령어 설정

관리노드를 위해 EC2 를 생성하고, 인벤토리 파일에 관리노드를 명시한다.
인벤토리 파일은 관리노드의 목록을 정의한 파일이다. 인벤토리에 정의한 시스템은 앤서블로 명령을 수행할 수 있다.

앤서블을 설치하면 디폴트 인벤토리 파일이 생성되는데, 경로는 /etc/ansible/hosts 이다.
물론 다른 파일을 만들어 인벤토리 파일로 사용가능하다. (기본적인 실습을 하고, 관련 자료가 많으니 찾아보자)

[web] 은 그룹명이다. 그 아래에 ip 가 있는데 web 그룹에 10.0.1.62 노드를 등록한다는 것이다. 이렇게 입력하고 :wq 로 저장한다.

인벤토리에 잘 등록됬는지 확인을 위해, 상기의 명령어를 입력한다.
all 로 끝나는 명령어는 인벤토리에 등록된 전체 관리노드를 출력하는 명령어이다.
web 으로 끝나는 명령어는 그룹명이 web 인 관리노드를 출력하는 명령어이다.

두 명령어 모두 등록된 관리노드를 출력했다.

ssh 로 접속을 시도할 계정을 생성한다. 물론 기본 계정 (ec2-user 로 해도 상관 없으나, 기본계정이니 만큼 취약하기도 하다.) 관리노드에 study 라는 계정을 생성하고 제어노드가 study 계정으로 SSH 접속 하게 설정한다.

sudo su 명령어로 권한 상승 후 useradd study 명령어로 계정명이 study인 계정을 생성한다.

앤서블 명령을 실행할 계정에 패스워드 없이 sudo 명령을 쓸수 있게 설정한다.
상기 사진은 특정 파일에 study 계정 파일을 만들고, 패스워드 없이 sudo 명령을 쓸 수 있게 파일을 구성하는 것이다.

3. 컨트롤 노드, 관리 로드 ssh 연결 설정

관리노드와 ssh 로 접속할 계정을 설정했으니, 컨트롤 노드에서 관리 노드로 ssh 연결 할 수 있게 설정한다.

컨트롤 노드와 관리 노드를 연결하기 위한 ssh 설정 과정은

- 컨트롤 노드에서 ssh-keygen 으로 ssh 공개키, 개인키 생성
- 관리 노드의 ~/.ssh/ 폴더, 폴더 하위에 authorized_keys 파일 생성
- ~/.ssh/ 폴더와 하위 파일들의 권한을 700으로 설정, 소유자와 소유그룹을 접속 계정명으로 되어 있는지 확인
- 컨트롤 노드에서 생성한 ssh 공개키를, 관리 노드로 복사
(ssh-copy-id 명령어로 복사하고 ssh 데몬 재시작, 또는 ~/.ssh/authorized_keys 파일에 공개키 값을 복사 저장 후 ssh 데몬 재시작)
- 컨트롤 노드에서 관리 노드로 ssh 접속 확인

으로 진행한다.

컨트롤 노드에서 ssh keygen 으로 생성하고, 뭘 입력하라고 그러는데 key 패스워드이므로 입력하지 말고 엔터눌러서 넘긴다. 생성한 개인키는 id_rsa, 공개키는 id_rsa.pub 이다.

관리노드에 접속하여 sudo su [계정명] 으로 계정을 study 로 전환한다. study(ssh 접속할 계정) 홈디렉토리에 .ssh/ 폴더와 authorized_keys 파일을 만들고, 700 권한을 준다. (무조건 700 권한이어야 한다. 초과 하거나 더 낮은 권한을 주면, ssh 접속에 문제가 발생 할 수 있다.)

그리고 ~/.ssh/ 폴더와 하위 파일들은 소유자 소유그룹이 모두 해당 계정이어야 한다.
즉 study 계정으로 접속한다면 , .ssh/ 폴더와 하위파일들은 모두 소유자 study, 소유그룹 study 여야 한다.

명령어는 상기 사진을 참고한다.

중요한 부분이므로 정리하면

- /home/[계정명]/.ssh/ 폴더와 하위 파일들의 권한은 모두 700 이어야 한다. (더 높거나, 낮아도 안됨)
- /home/[계정명]/.ssh/ 폴더와 하위 파일들의 소유자, 소유그룹은 모두 홈디렉터리의 계정과 같아야 한다.
- /home/[계정명]/.ssh/ 폴더와 하위 파일들을 수정한 후 ssh 데몬을 재시작해서 적용해야 한다. (ssh 데몬을 재시작하지 않으면 수정사항이 반영되지 않는다.)

컨트롤 노드의 \id_rsa.pub (공개키)값 확인 후, 관리 노드의 계정 홈디렉터리 /home/study/.ssh/authorized_keys
파일에 키값을 복붙한다. (경로의 study 는 계정명이다.) 왜냐면 공개키가 자물쇠 역할을, 개인키가 키 역할을 하기 때문이다. 컨트롤 노드에서 관리 노드로 접속을 하는 것이니, 관리노드의 authorized_keys 파일에 컨트롤 노드의 공개키(*.pub 파일)를 붙여 넣는 것이다.

컨트롤 노드는 개인키(id_rsa)를 이미 갖고 있으니 개인키를 신경 쓸 일은 없다.

컨트롤 노드의 공개키 값을 관리 노드의 authorized_keys 에 복붙하고 저장한다.ssh/ 폴더를 포함한 하위의 파일들은 모두 700 권한으로 설정해야 한다.

ssh 설정을 변경했으므로 sudo systemctl restart sshd 명령어로 ssh 데몬을 재시작해야 변경 사항이 적용된다. 그리고 ssh 명령어로 접속을 시도하면.

위와 같이 패스워드 입력 없이 정상 연결 된다. 처음 연결하면, 뭔가를 물어보는데 yes 를 입력하고 엔터를 누르면 연결된다.

여기서 중요한 것이 id_rsa 와 id_rsa.pub 파일을 접속용도로 사용해야 한다는 것이다.
ssh-keygen 명령어를 쓰면 id_rsa (개인키), id_rsa.pub(공개키)가 생성되고, 이 키들은 기본 키 이므로, ssh 접속 시 -i 옵션을 사용하지 않으면 자동으로 적용된다.

그러나 생성된 개인키, 공개키의 이름을 바꾸면, -i 옵션을 통해 key 이름을 지정해야 한다.

예를 들면 id_rsa 를 my-key 로 변경했다면
명령어를 ssh study@10.0.2.35 -i my-key 로 사용해야 접속할 수 있다.

만약 ssh-keygen 명령어를 재사용하면 기존의 id_rsa(개인키), id_rsa.pub(공개키) 는 덮어쓰기 되어 사라진다. 그러므로 ssh key를 여러개 만들어야 한다면 기존의 id_rsa, id_rsa.pub 키를 이름을 변경하여 저장해야 한다.

ssh 연결이 완료되었으니, 앤서블 명령어로 ping 을 해보자

앤서블 ping 명령어가 success (정상) 됨을 확인 할 수 있다.

** 만약에 ssh 키를 여러개 쓰는데 i 옵션으로 지정하고 싶지 않다면, /home/[계정명]/.ssh/config 파일을 만들어, 파일 내용을 하기의 형식으로 작성 저장한다. 그리고
ssh 데몬을 재시작한다.

Host ansible-node1
HostName 10.0.2.35
User study
Port 15000 (포트는 지정하지 않으면 22 번 포트 사용됨)
IdentityFile ~/.ssh/id_rsa_test (ssh 개인키 경로)

이렇게 하면 ssh ansible-node1(별칭)으로 접속할 수 있다. 우선 디폴트 이름을 가진 ssh 키를 사용할 것이므로, 지금은 별칭을 지정할 필요가 없다.

4. 컨트롤 노드에서 관리 노드로 명령 실행

- 앤서블 컨트롤 노드 python pip, boto3 설치
- 컨트롤 노드에서 앤서블 명령어로 관리 노드에 리눅스 명령어 수행
- 컨트롤 노드에서 앤서블 명령어로 관리노드에 아파치 웹 서버 설치

1) playbook 테스트 및 pip, boto3 설치

앤서블로 EC2 생성 및 설정 할 것이다. 앤서블에서 aws 모듈을 사용하기 위해선
python pip 와 boto3 이 컨트롤 노드에 설치 되어야 한다. 컨트롤 노드에 접속해서 직접 명령어를 실행해도 되지만,앤서블 playbook 테스트 겸, playbook 으로 설치한다.

설치 전 playbook 이 되는지 테스트 해볼 필요가 있다.
하기의 코드로 playbook 정상 사용가능한지 확인한다.
특별한 코드는 아니며, 컨트롤 노드(자기자신)에 pwd 명령어를 실행시켜 현재 경로를 출력한다.

작업 폴더 경로에 vi 명령어로 [playbook 파일명].yml 을 생성하고, 파일 내용을 아래의 코드로 작성한다.

- name: "Local Test"
  hosts: localhost
  connection: local
  tasks:
  - name: "pwd command"
    shell: "pwd"
    register: "output"
  - debug: var=output.stdout_lines

ansible-playbook [플레이북 파일명].yml 명령어를 실행하면 아래와 같이 출력된다.

하단부에 현재 경로(절대경로)가 출력되었다.

플레이북이 정상실행됨을 알았으므로, python pip 와 boto3 을 설치하면 된다.
아래의 코드로 플레이북 파일(*.yml) 을 만들고 ansible-playbook 명령어를 실행시킨다.

- name: "INSTALL-BOTO,PIP"
  hosts: localhost
  connection: local
  become: yes
  tasks:
- name: install pip
  yum:
    name:
      - python-pip
      - python3-pip
  state: present
  register: pip_result
- debug: var=pip_result
- name: install boto
  pip:
    name:
      - boto
      - boto3
  register: boto_result
- debug: var=boto_result
- name: "ls command"
  shell: "ls -al"
  register: "output"
- debug: var=output.stdout_lines

생성한 플레이북 파일을 ansible-playbook [플레이북 파일명].yml 명령어로 실행하면, python pip, boto3 가 설치된다.

2) 관리노드 EC2 아파치 설치

* 수행 순서는
- playbook 으로 관리노드에 명령어 실행 테스트
- playbook 으로 관리노드에 아파치 웹 서버 설치 및 테스트

로 진행할 것이다.

아파치 설치 전 관리노드에 명령어를 실행시켜 결과를 확인해본다.

테스트용 플레이북 파일을 만들고 내용은 위와 같이 입력하고 저장한다.
코드에 대해 설명하면 , name 은 그냥 이름인 것이고
- become: true 는 root 로의 권한 상승을 위한 옵션
- remote_user: study 는 관리노드에 study 계정으로 ssh 연결한다는 뜻이다.
- hosts: web 은 인벤토리파일(/etc/ansible/hosts)에 web 그룹에 속한 노드(호스트)들에게 명령을 수행하겠다는 뜻이다. 즉 hosts 는 명령을 수행받을 관리노드를 지정한다.
- 나머지 부분은 pwd 명령어를 수행해 현재 결과를 출력하는 것이다.

그리고 ansible-playbook 명령어로 플레이북 파일을 실행하면, 명령어 결과가 나온다.
pwd 명령어를 수행했고, study 계정으로 접속이 되니 TASK 부분에 /home/study 경로가 출력된다. (인벤토리 파일에서 관리노드를 하나 추가해서 두개 관리노드의 결과가 출력된다.)

관리노드에 원격 명령어를 수행했으니, 관리노드에 아파치 웹 서버를 설치해볼 차례이다.

아파치 웹 설치 yml 코드는 위와 같이 작성한다. 그리고 ansible-playbook 명령어로 yml 파일을 실행하면,

위와 같이 결과가 나오며, 10.0.1.62 는 아파치 웹이 설치되었지만, 10.0.2.35 는 설치되지 않았다. 특별한 이유는 아니며, 10.0.2.35 는 인스턴스가 stop 되어 있어 아파치 웹 서버를 설치할 수 없기 때문이다. 인벤토리 파일(hosts)에 등록, 활성화된 관리노드(10.0.1.62)는 앤서블 명령어가 정상적으로 실행되었다.

그럼 10.0.1.62 서버에서 실제 접속이 되는지 보면 된다.

이렇게 관리노드 (EC2, 10.0.1.62) 에서 아파치 웹 페이지가 정상적으로 출력된다.

0개의 댓글