Ansible 을 이용하여 관리노드에 nginx 캐시 서버 세팅을 진행 해보았습니다.
앤서블 은 설치, 관리 등 인프라 자동 구축을 위한 프로그램입니다.
현재는 레드햇 과 앤서블 커뮤니티에 의해서 관리 되고 있는 python 기반 오픈소스 프로그램으로
ssh 를 기반으로 명령을 전달, 실행하여 관리대상 서버에 별도의 에이전트 설치가 필요 없다는 특징이 있습니다.
종 류 | 엔지니어 / 엔서블 Ansible |
난이도 | 하 |
내용요약 |
Ansible 기본설치, 관리노드 웹데몬 설치 유저, 가상호스트 생성 테스트 |
테스트 환경 | Linux Rocky 9 2대 |
관련직무 | 시스템&클라우드 엔지니어 |
목차. | |
테스트 환경 |
|
서버 OS |
Rocky Linux 9 |
Ansible설치
Python 3.9 가 설치된 거의 대부분의 Unix 계열 OS 에서 설치 가능합니다.
메니지드 노드는 컨트롤 노드에서 생성한 코드를 실행 하기 위해 Python 2.7, or Python 3.5 – 3.11 과
POSIX 셸을 통해 노드에 SSH로 연결할 수 있는 사용자 계정이 필요합니다
컨트롤 노드 에서 설치를 진행합니다.
sudo dnf install ansible ansible-collection-community-general |
*EPEL 레포지토리가 필요하므로 없는 경우 epel-release 를 먼저 설치 합니다.
기본 설치시 /etc/ansible 에 설정 파일들이 생성 됩니다.
사용 방법
메니지드 노드들에 대한 정보가 담겨있는 인벤토리 와
실행할 코드들이 담긴 플레이북 으로 관리 합니다.
준비 작업
SSH 를 통해 작업이 진행 되므로 ssh-keygen 을 이용하여 SSH 키 를 전달 해둡니다.
기본 인벤토리는 /etc/ansible/hosts 를 사용하며
해당 파일을 열면 ini 방식의 인벤토리 구조를 확인 할 수 있습니다.
그룹 없이 도메인, IP 로 입력 가능하며 가능하며
[그룹이름] 으로 그룹을 만들어서
그 아래 해당 그룹에 들어갈 호스트들을 입력 할 수 있습니다.
호스트 등록할 때 img[001:005].iwinv.kr 처럼
패턴으로 다수 도메인 적용도 가능합니다.
인벤토리는 기본적인 ini 방식 이외에 yaml 로도 관리 가능합니다.
인벤토리 를 만든 후 아래 와 같은 명령으로 연결상태를 체크 할 수 있습니다.
ansible -i 인벤토리 -m ping (그룹 or all) |
플레이북 은 yaml 로 작성 합니다.
아래는 apache 를 설치 하도록 하는 playbook 입니다.
--- - hosts: servers become: true # Run tasks with sudo (root) privileges tasks: - name: Update package cache package: name: '*' state: latest become: true - name: Install Apache package: name: httpd state: present - name: Start Apache service service: name: httpd state: started enabled: true ...
엔서블의 yaml 관련된 자세한 사항은 다음 링크에서 확인 가능합니다. (앤서블 docs)
NGINX 리버스 프록시 캐시 서버 세팅
아래는 테스트에 사용한 playbook yaml 구성 입니다.
실행할 명령이 담긴 playbook.yml 파일 하나와
추가할 계정의 가상호스트 설정 파일이 담겨있는 conf.j2 파일 두가지 로 구성 되어있습니다.
--- - hosts: web become: true # Run tasks with sudo (root) privileges tasks: - name: Install Nginx package: name: nginx state: present - name: Install Apache package: name: httpd state: present - name: Change Apache Listening Port lineinfile: path: /etc/httpd/conf/httpd.conf regexp: '^Listen ' line: 'Listen 8080' notify: Restart Apache - name: Ensure Nginx is enabled and started systemd: name: nginx enabled: yes state: started - name: Ensure Apache is enabled and started systemd: name: httpd enabled: yes state: started handlers: - name: Restart Nginx service: name: nginx state: restarted - name: Restart Apache service: name: httpd state: restarted ...
nginx 가 80 포트로 받아서 백그라운드에 있는 apache 8080 포트로 연결 되는 구조로 세팅 됩니다.
” ansible-playbook -i 인벤토리 플레이북 파일 ” 로 실행 합니다.
진행 결과가 바로 표시 됩니다.
메니지드 노드 에서 확인 하면 아파치와 nginx 가 정상 설치되어 올라와 있는 것을 확인 할 수 있습니다.
서비스 사용을 위한 계정 생성 테스트를 진행하였습니다.
--- - hosts: web become: true vars: new_user_id: "test" new_user_password: "testuserpassword" home_directory: "/cache_user/{{ new_user_id }}" home_directory_permissions: "0755" tasks: - name: Add User with Home Directory user: name: "{{ new_user_id }}" state: present createhome: yes home: "{{ home_directory }}" - name: Change Password for New User user: name: "{{ new_user_id }}" password: "{{ new_user_password | password_hash('sha512') }}" update_password: always - name: Set Permissions for User's Home Directory file: path: "{{ home_directory }}" state: directory mode: "{{ home_directory_permissions }}" recurse: yes - name: Configure Apache Virtual Host for New User template: src: apache_virtual_host_user.conf.j2 dest: "/etc/httpd/conf.d/{{ new_user_id }}.conf" notify: Restart Apache - name: Configure Nginx Virtual Host for New User template: src: nginx_virtual_host_user.conf.j2 dest: "/etc/nginx/conf.d/{{ new_user_id }}.conf" notify: Restart Nginx handlers: - name: Restart Nginx service: name: nginx state: restarted - name: Restart Apache service: name: httpd state: restarted ... 54,3 바닥
nginx 가상호스트 설정 파일 정보가 담긴 nginx_virtual_host_user.conf.j2 입니다.
server { listen 80; server_name {{ new_user_id }}.sample.domain; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
apache 가상호스트 apache_virtual_host_user.conf.j2
<VirtualHost *:8080> ServerAdmin webmaster@{{ new_user_id }}.com ServerName {{ new_user_id }}.sample.domain DocumentRoot /CACHE_USER/{{ new_user_id }} <Directory /CACHE_USER/{{ new_user_id }}> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog /var/log/httpd/{{ new_user_id }}_error.log CustomLog /var/log/httpd/{{ new_user_id }}_access.log combined </VirtualHost>
동일하게 ansible-playbook 으로 실행시 메니지드노드에 사용자와 가상호스트설정이 추가 됩니다.
가상호스트 설정 파일과 유져 계정 관련 설정들 줄 일부만 약식으로 테스트 진행 해보았습니다.
메니지드 노드, 서버에 아파치 데몬 설치 와 같은 서비스 세팅 이외에도 운영중인 노드에 사용자 추가, 정지 등 관리 용도로도
사용이 가능 할 것으로 생각 됩니다.