Notice
Recent Posts
Recent Comments
Link
Gom3rye
Ansible 본문
728x90
반응형
Ansible
- 오픈 소스 IT 자동화 도구로 사용자가 수작업으로 진행하던 프로비저닝, 환경 설정, 애플리케이션 배포 등의 IT 업무를 코드 기반으로 작성하여 여러 환경에 동일하게 적용할 수 있도록 돕는 역할을 수행한다.
Database 설치 1개 추가 설치
public cloud → 관리 콘솔에 접속해서 옵션을 선택 → 반복
private cloud → database download 수동으로 설치 → 반복
이때 버전이 달라지면 문제 생길 수 있음 ⇒ IaC, ansible, terraform 등장
- RedHat이 개발하고 관리한다.
특징
- No Agent
- 예전에 많이 사용하던 Puppet이나 Chef는 자동화 관리 대상 서버에 별도의 에이전트를 설치하고 이를 통해 자동화 업무를 수행한다.
- 이러한 데몬 형식의 에이전트에 기반한 자동화 도구는 관리를 위한 복잡한 추가 작업이나 운영체제 버전에 따라 추가 패키지나 모듈을 설치하는 등의 작업이 발생한다.
- Ansible은 별도의 Agent 설치 없이 SSH로 접속해서 Python Code를 수행한다.
- 예전에 많이 사용하던 Puppet이나 Chef는 자동화 관리 대상 서버에 별도의 에이전트를 설치하고 이를 통해 자동화 업무를 수행한다.
- idempotent (멱등성)
- 멱등성: 동일한 연산 또는 작업을 여러 번 수행하더라도 결과가 달라지지 않는 성질
- 동일한 운영 작업을 여러 번 수행해도 동일한 결과를 만들어 낸다.
- 쉬운 사용법과 다양한 모듈 제공
- 자동화 단계는 에디터만 있으면 YAML 문법을 사용하여 쉽게 작성하고 읽을 수 있다.
- 파일 복사와 같은 일반 시스템 관리 모듈부터 다양한 환경의 퍼블릭 클라우드 관련 모듈 및 컬렉션까지 제공
- playbook 샘플을 찾아보기 쉽다.
용도
- 시스템 환경을 설정
- 애플리케이션 설치
- 퍼블릭이나 프라이빗 클라우드 시스템의 가상 서버 생성
- 매일 점검해야 하는 시스템의 상태 체크
- 여러 시스템에 동일한 작업을 해야 할 상황에 주로 이용\
사용 가능한 운영체제
- Linux
- Mac OS
- BSD 계열의 유닉스
- WSL을 지원하는 윈도우
관련 자료
Ansible Architecture
- Community Ansible
- 오픈 소스 형태
- 제어 노드와 관리 노드라는 두 가지 유형의 시스템으로 구성
- 앤서블은 제어 노드에 설치되어 실행되고 앤서블이 실행되기 위해서는 python이 기본적으로 설치되어 있어야 한다.
- 앤서블 안에는 다양한 모듈과 플러그인이 함께 설치되어 있으며 앤서블이 관리하는 노드 정보를 저장하고 있는 인벤토리와 관리 노드에서 수행할 작업 절차가 작성되어 있는 플레이북이 존재한다.
- 제어 노드
- 앤서블이 설치되는 노드
- 리눅스 운영체제가 설치된 컴퓨터라면 제어 노드가 될 수 있다.
- 앤서블은 파이썬 모듈을 이용하므로 앤서블을 설치하고 실행하려면 파이썬이 설치되어 있어야 한다.
- 관리 노드
- 앤서블이 제어하는 원격 시스템 또는 호스트
- 관리 노드는 리눅스가 설치된 노드일 수도 있고 윈도우가 설치된 노드일 수도 있다.
- public cloud나 private cloud의 가상 서버도 가능하다.
- 별도의 에이전트를 설치하지는 않지만 관리 노드는 제어 노드와 SSH 통신이 가능해야 한다.
- Inventory
- 제어 노드가 제어하는 관리 노드의 목록을 나열해 놓은 파일
- 앤서블은 인벤토리에 사전에 정의되어 있는 관리 노드에만 접근이 가능하다.
- Module
- 앤서블은 관리 노드의 작업을 수행할 때 SSH를 통해 연결한 후 Ansible Module이라는 스크립트를 push 해서 작동한다.
- 대부분의 모듈은 원하는 시스템 상태를 설명하는 매개변수를 허용하며 모듈 실행이 완료되면 제거된다.
- Plugin
- 앤서블의 핵심 기능을 강화하는 역할을 수행
- 모듈이 대상 시스템에서 별도의 프로세스로 실행되는 동안 플러그인은 제어 노드에서 실행된다.
- 앤서블의 핵심 기능 (데이터 변환, 로그 출력, 인벤토리 연결 등)에 대한 옵션 및 확장 기능을 제공한다.
- Playbook
- 관리 노드에서 수행할 작업들을 YAML 문법을 이용해서 순서대로 작성해 놓은 파일
- 앤서블은 플레이북을 활용하여 관리 노드에 SSH로 접근해 작업을 수행한다.
- 제어 노드
- Red Hat Automation Platform
- 레드햇 서브스크립션을 이용
- 주요 컴포넌트는 Community Ansible과 동일하다.
- 커뮤니티 앤서블과 다르게 인벤토리, 제어 노드에 대한 인증 정보, 실행 환경 등을 관리하는 CMDB(Configuration Management Database)가 존재한다.
- 자원들을 관리하는 관리 웹 UI가 존재하고 REST API도 제공한다.
- 사용자가 외부에서 작성한 내용을 앤서블 관리 웹 UI를 통해서 가져올 수 있다.
- 3가지 필수 컴포넌트와 1가지 옵셔널 컴포넌트로 구성
- 오토메이션 컨트롤러: 앤서블 타워로 불리우던 관리 웹 UI
- 실행 환경: 앤서블 모듈과 플러그인이 존재하는 컨테이너 기반의 실행 환경
- PostgreSQL: 인벤토리, 인증 정보, 실행 환경 등의 메타데이터를 관리하는 CMDB
- 오토메이션 허브(옵션): 레드햇에서 기술 지원을 받을 수 있는 컬렉션 제공 서비스
- 구성에 따른 아키텍쳐
- All in One: 하나의 노드에 필수 컴포넌트를 전부 구성한다.
- AAP using External DB
- PostgreSQL을 별도의 노드로 그리고 오토메이션 컨트롤러와 실행 환경은 동일한 노드로 구성
- Private Automation HUB
- AAP using External DB와 동일한 아키텍쳐에 오토메이션 허브를 내부에서 사용할 수 있도록 별도의 노드로 구성된다.
- 주로 이건 인터넷이 되지 않는 환경에서 사용한다.
- AAP using External DB와 동일한 아키텍쳐에 오토메이션 허브를 내부에서 사용할 수 있도록 별도의 노드로 구성된다.
Ansible 설치
제어 노드에 ansible 설치
- 파이썬이 설치되어 잇는지 확인: python3 --version
- ansible 설치: sudo apt update, sudo apt install -y ansible
- 확인: ansible --version
- 앤서블에 관련된 설정은 /etc/ansible 이라는 디렉토리를 이용한다.
- 환경 설정 파일: ansible.cfg
- 인벤토리 설정: hosts
- 현재는 ls /etc/ansible 치면 아무것도 없다고 나올 테니 미리 만들어두자. mkdir /etc/ansible
Inventory 작성
- 인벤토리를 이용한 자동화 대상 호스트 설정
- 인벤토리 파일은 텍스트 파일이며 앤서블이 자동화 대상으로 하는 관리 호스트를 지정한다.
- INI 형식(이름=값) 또는 YAML을 포함한 다양한 형식을 이용해서 작성 가능하다.
- IP를 이용해서 인벤토리 파일을 작성
- 192.168.100.5
- 192.168.100.6
- 192.168.100.7
- 호스트 이름으로 파일 작성
- tnode1.exp.com
- tnode2.exp.com
- tnode3.exp.com
- 이 경우는 /etc/hosts 파일에 호스트 이름이 등록 되어 있어야 한다.
- 192.168.100.5 tnode1.exp.com
- 192.168.100.6 tnode2.exp.com
- 192.168.100.7 tnode3.exp.com
- 역할에 따른 호스트 그룹 설정
- 그룹별 호스트 설정
- [webservers]
- web1.example.com
- web2.example.com
- 192.0.2.42
- [db-servers]
- [webservers]
- 호스트는 여러 그룹에 속할 수 있다.
- [webservers]
- web1.example.com
- web2.example.com
- 192.0.2.42
- [db-servers]
- [east-datacenter]
- [west-datacenter]
- [development]
- 192.0.2.42
- [webservers]
- 중첩 그룹도 가능하다.
- [web-servers]
- [db-servers]
- [datacenter:children] # children이라고 써주면 중첩도 가능하다.
- web-servers
- db-servers
- 범위도 가능 [start:end]
- [web-servers]
- web[1:2].example.com
- [defaults]
- 192.168.4.[0:255]
- [dns]
- [a:c].dns.example.com
- [ipv6]
- 2001:db8::[a:f]
- EC2의 경우
- [컴퓨터이름] ansible_host=[IP(private ip도 가능)] ansible_user=[계정] ansible_ssh_private_key_file=[pem파일의 경로]
- 키 파일의 권한 문제로 에러가 발생하는 경우는 chmod 400 [pem 파일 경로]
- 그룹별 호스트 설정
- Ansible에서는 컨트롤러 노드(예: masternode)가 명령을 내려주고, 실제로 명령이 실행되는 곳은 워커 노드 (
worker1, worker2등)이기 때문에, sudo권한 설정은 워커 노드 쪽에 반드시 해줘야 한다.
- SSH 접속 설정 (EC2는 설정 필요 없다.)
- 유저 생성
- sudo adduser [유저이름]
- sudo adduser ansible
- sudo passwd [유저이름]
- sudo chmod u+w /etc/sudoers
- sudo vi /etc/sudoers 명령 후 하단에 추가
- 유저이름 ALL=(ALL:ALL) ALL
- 앞으로 계속 root 계정(kyla)로 작업할 예정이라 kyla ALL=(ALL:ALL) ALL 도 작성해주기
- worker1, worker2에서 해주는 것!!
- sudo adduser [유저이름]
- ssh 재시작: sudo service ssh(sshd) restart
- 유저를 이용해서 ssh 접속이 가능하다.
- ansible은 비밀번호 입력 없이 ssh 접속이 가능해야 한다.
- 접속하고자 하는 컴퓨터(제거 노드)에서 ssh-keygen 수행 후 ssh-copy-id [원격서버계정]@[원격서버IP]
- ssh-copy-id kyla@워커노드의 게스트ip
- ssh-copy-id kyla@192.168.56.101
- ssh-copy-id kyla@192.168.56.102
- 그러면 이제 key값이 복사가 되어서 다음부터는 비밀번호 없이 접속이 가능하다.
- 제어 노드(masternode)에서 비밀번호 입력 없이 관리 노드로(workernode1, 2) ssh 접속이 가능해야 한다.
- ssh-copy-id kyla@워커노드의 게스트ip
- 유저 생성

- 현재 컴퓨터에서 EC2에 파일 전송
- scp -i pem파일경로 전송할파일경로 계정@EC2퍼블릭DNS:복사할경로 (powershell에서 해야 한다.)
- 파일 복사하는 것을 해본 거고 사실은 그냥 git에 올려놓고 내려 받아도 된다.
- scp -i pem파일경로 전송할파일경로 계정@EC2퍼블릭DNS:복사할경로 (powershell에서 해야 한다.)
- EC2 인스턴스를 관리 노드로 설정(/etc/ansible/hosts)
- [itstudy]
- worker1 ansible_host=172.31.34.36 ansible_user=ubuntu
- ansible_ssh_private_key_file=/home/ubuntu/itstudy.pem
- worker2 ansible_host=172.31.47.228 ansible_user=ubuntu
- ansible_ssh_private_key_file=/home/ubuntu/itstudy.pem
- Or EC2 인스턴스가 아닌 노드를 관리 노드로 설정 (/etc/ansible/hosts)
[itstudy]
worker1 ansible_host=192.168.56.101
worker2 ansible_host=192.168.56.102
- 인벤토리 파일의 내용을 확인
- ansible-inventory -i 파일경로 --list
- ansible-inventory -i /etc/ansible/hosts --list
- ansible-inventory -i /etc/ansible/hosts --graph
- ansible-inventory -i 파일경로 --list
모듈을 실행해서 실제 인벤토리가 제대로 만들어졌는지 확인
https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html#
- host 접속 가능 여부 확인
- ansible all -m ping

- 메모리 확인
- ansible all -m shell -a "free -h"
- ansible itstudy -m shell -a "free -h"

- 파일 복사해서 전송해보기
- ansible 인벤토리이름 -m copy -a "src=복사할파일 dest=복사될경로"
- ansible itstudy -m copy -a "src=./test.txt dest=/tmp”
- worker 1, 2에게 모두 다 간다.

- 패키지 설치
- ansible 인벤토리이름 또는 all -m apt -a "name=패키지이름 state=present" -b
- ansible itstudy -m apt -a "name=nginx state=present" -b
- 이때 아래와 같은 에러가 나오면 -K 옵션 줘서 비밀번호 누르면 된다.
worker1 | FAILED! => { "msg": "Missing sudo password" } worker2 | FAILED! => { "msg": "Missing sudo password" } 해결 방법: kyla@masternode:~/ansible$ ansible itstudy -m apt -a "name=nginx state=present" -b -K BECOME password: 비밀번호 입력- 이때 masternode(명령을 실행한 곳)에서는 nginx 깔리지 않는다. (자기 자신에는 안 깔음)
- ansible itstudy -m apt -a "name=nginx state=present" -b
- ansible 인벤토리이름 또는 all -m apt -a "name=패키지이름 state=present" -b

playbook
작성 방법
- YAML 포맷으로 작성 (first-playbook.yaml)
---
- hosts: all
tasks:
- name: Print Message
debug:
msg: Hello Ansible World
# 문법 검사
ansible-playbook --syntax-check first-playbook.yaml
## playbook: first-playbook.yaml -> error 없는 것
# 실행 - ansible-playbook 파일 경로
ansible-playbook first-playbook.yaml

- 실행 점검: --check
- 관리 대상 호스트는 실제로 변경되지 않고 어떤 내용이 변경될 지만 미리 알 수 있다.
- ssh 서비스를 재시작하는 yaml파일 작성 (restart-service.yaml)
--- - hosts: itstudy tasks: - name: Restart ssh service # name은 아무거나 써도 된다. ansible.builtin.service: name: ssh state: restarted # 문법 체크 ansible-playbook --syntax-check restart-service.yaml # 점검 ansible-playbook --check restart-service.yaml ## 실제 해보지는 않고 test만 해보는 것이다. - 파일 복사
- 모듈의 이름은 copy
- 설정해야 하는 값
- src는 복사할 파일 경로
- dest는 복사될 디렉토리
- owner는 파일의 소유자
- mode는 파일의 권한
- yaml 파일 작성 (copy-test.yaml)
- name: Ansible File Copy hosts: itstudy tasks: - name: copying file with playbook copy: src: ./sample.txt # 또는 그냥 sample.txt (yaml파일이 있는 곳에 있으니까) dest: /tmp owner: kyla mode: "0644" # 실행 ansible-playbook copy-test.yaml

파일 다운로드
파일 다운로드
- get_url 이라는 모듈 사용
- url에 다운로드 받을 url을 설정하고 dest에 다운로드 경로를 설정하면 된다.
파일 관련 명령
- file 이라는 모듈 사용
- path에 생성할 파일이나 디렉토리를 설정하고 state에 종류를 설정하고 mode에 파일의 접근 권한을 설정할 수 있다.
- become과 become_user는 ansible에서 권한을 변경하고자 할 때 사용하는 속성이다.
- 일반적으로 sudo 명령을 사용하고자 하는 경우 become과 become_user를 사용한다.
- /opt/tomcat 이라는 디렉토리에 톰캣 파일을 다운로드
- url: https://tomcat.apache.org/download-90.cgi
- 또는 https://downloads.apache.org/tomcat/tomcat-9/v9.0.8/bin/apache-tomcat-9.0.8.tar.gz.sha512
- yaml 파일 작성 (filedownload.yaml)
- worker1, 2에 미리 sudo mkdir /opt/tomcat9 로 디렉토리 만들어놓기
- hosts: itstudy become: yes become_user: root tasks: - name: Create /opt/tomcat9 directory file: path: /opt/tomcat9 state: directory mode: "0755" - name: Download Tomcat .sha512 file get_url: url: <https://downloads.apache.org/tomcat/tomcat-9/v9.0.8/bin/apache-tomcat-9.0.8.tar.gz.sha512> dest: /opt/tomcat9/apache-tomcat-9.0.8.tar.gz.sha512- 여기서 자꾸 비밀번호로 에러가 난다면 workernode1, 2의 /etc/sudoers 파일에 kyla ALL=(ALL:ALL) NOPASSWD: ALL 가 설정되어 있는지 확인하자.

- nginx를 설치하고 설정을 수정하고 메인 페이지를 출력하도록 설정
- 제어 노드에 메인 페이지로 보여질 페이지를 생성(index.html)
<html> <head> <title>Welcome to Nginx Via Ansible</title> </head> <body> <h1>Nginx Configured by Ansible</h1> <p>앤서블을 이용해서 NGINX 설정 및 배포</p> </body> </html>- nginx 설정 파일 작성(nginx.conf)
server{ listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /usr/share/nginx/html; index index.html index.html # 이 디렉토리에 있는 파일이 맨 처음 보여지는 파일이 되겠다. server_name localhost; location /{ try_files $uri $uri/ =404; } }
- playbook 파일 작성(webserver.yaml)
- hosts: itstudy
become: yes
become_user: root
tasks:
- name: Ensure nginx is installed
package:
name: nginx
update_cache: yes
- name: Copy Nginx Config File
copy:
src: nginx.conf
dest: /etc/nginx/sites-available/default
- name: Manage Configuration
file:
src: /etc/nginx/sites-available/default
dest: /etc/nginx/sites-enabled/default
state: link
- name: Copy Homepage Template
template:
src: index.html
dest: /usr/share/nginx/html/index.html
- name: Restart Nginx
service:
name: nginx
state: restarted
# 만약 nginx.conf에서 에러 뜬다면
sudo nginx -t # 로 문법 체크 할 수 있다.

ip 고정하는 방법
→ 제어판\네트워크 및 인터넷\네트워크 연결 → wifi 더블 클릭 → 인터넷 프로토콜 버전 4 → 다음 ip 설정 클릭해서 정보 넣어주기 (이때 필요한 정보들은 ipconfig /all 명령어로 알 수 있다.)

728x90
반응형
'현대 오토에버 클라우드 스쿨' 카테고리의 다른 글
| 작심 큰일 챌린지 - 가장 많이 받은 선물 (파이썬) (3) | 2025.08.08 |
|---|---|
| Ansible- 변수 (0) | 2025.08.08 |
| 작심 큰일 챌린지 - 초콜릿 괴도 코코 (Sweet) (파이썬) (3) | 2025.08.07 |
| 작심 큰일 챌린지 - 컵라면 (파이썬) (3) | 2025.08.06 |
| AWS- 로그 관리와 운영 (5) | 2025.08.06 |