Ansible은 개발 환경을 구축할 때 동일한 작업을 반복해야 하는 경우가 빈번히 발생하는 경우를 보완하기 위해 서버의 설정과 인프라 프로비저닝 등을 자동화할 수 있는 오픈소스 도구로, 별도의 Agent 없이 SSH를 통한 스크립트 실행을 지원하며 선언적으로 서버 설정을 정의
▶ 코드 기반으로 인프라 구축 및 관리 데브옵스
앤서블을 pip을 이용하거나, OS 패키지 관리 도구를 이용하여 편리하게 설치 가능
python
~# pip install ansible
---
# 특정 버전 설치시, 버전 설정
~# pip install ansible=={특정 버전}
CentOS
~# yum install -y ansible
Ubuntu
~# apt install ansible
MacOS
~# brew install ansible
앤서블은 ssh로 제어 노드와 매니지드 노드가 연결되어 작동함
앤서블을 이용하여 작업하기 전에 authorized_keys에 키를 추가하여 주는 것을 권장
- ssh-keygen으로 키 생성
```bash
~# ssh-keygen -t rsa
```
ssh-copy-id 로 키 추가
~# ssh-copy-id {user}@{연결할 호스트|IP}
ex. ssh-copy-id root@node1.com
ssh 연결
~# ssh root@node1.com
ping 모듈을 실행하여 동작 확인-m : 모듈 선택-i : 인벤토리 선택-u : 유저명 인벤토리 설정server.ini 파일로 저장[server]
10.1.2.3 # ip주소
example.com 모듈 실행server.ini 에 있는 서버 정보로 ping 명령을 실행하여 결과 반환# ping 실행
ansible server -i server.ini -m ping
# 유저명 주고 실행
ansible server -i server.ini -m ping -u ubuntu
ansible server -i server.ini -m ping -u deploy
/usr/bin/ansible 이나 /usr/bin/ansible-playbook 명령을 이용하여 제어 노드에서 관리 노드 관리ini 파일과 yaml 파일로 설정 ```
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
one.example.com
two.example.com
three.example.com
```
- yaml 파일
```
all:
hosts:
mail.example.com:
children:
webservers:
hosts:
foo.example.com:
bar.example.com:
dbservers:
hosts:
one.example.com:
two.example.com:
three.example.com:
```
- 사용 방법
- 파라미터 전달
`-i` 옵션으로 인벤토리 파일 지정
```bash
ansible-playbook -i inventory.yaml
```
- cfg 파일 설정
cfg 파일에 `inventory` 옵션에 파일 경로를 지정
인벤토리 파일은 콤마를 이용하여 여러 개 지정 가능
```
[default]
inventory = inventory.yaml,common.yaml
```
▶ 호스트명 설정
```
all:
hosts:
webserver-host1:
webserver-host2:
dbserver-host[1:10]:
10.1.3.2:
children:
webservers:
hosts:
webserver-host1:
webserver-host2:
dbservers:
hosts:
dbserver-host[1:10]:
```
- all : 모든 호스트의 정보를 추가
- children : 그룹별 호스트 정보 추가
※ 그룹은 작업 단위별로 설정하는 것이 좋음 ▶ db 서버 모음, 웹 서버 모음과 같은
- `dbserver-host[1:10]` 과 같은 형태로 1 ~ 10번까지의 호스트 설정 가능
- `10.1.3.2` 와 같은 형태로 IP를 직접적으로 설정하는 것도 가능
▶ 변수 설정
```
all:
hosts:
webserver-host1:
webserver-host2:
dbserver-host[1:10]:
10.1.3.2:
children:
webservers:
hosts:
webserver-host1:
host_var: "local_var"
webserver-host2:
dbservers:
hosts:
dbserver-host[1:10]:
vars:
db_id: "admin"
db_passwd: "passw@rd"
vars:
global_var: "server_name"
```
- 전역변수 : 모든 서버에서 사용할 수 있는 변수값
:: global_var
- 그룹변수 : 그룹에서 사용할 수 있는 변수값
:: dbservers 그룹에서 사용할 수 있는 변수값(vars: db_id, db_passwd)
- 호스트변수 : 단일 호스트에서 사용할 수 있는 변수
:: webserver-host1에서 host_var 사용 가능
▶ 변수 타입
```
vars:
string_var: "A"
number_var: 1
boolean_var: "yes"
list_var:
- A
- B
- C
dict_var:
key_a: "val_a"
key_b: "val_b"
key_c: "val_c"
```cp, apt, wget 등의 단일 명령어예제
file 다운로드 → 압축 해제 → symbolic link 생성
```
- name: download hue file
get_url:
url: "<https://cdn.gethue.com/downloads/hue-4.10.0.tgz>"
dest: /tmp
mode: '0660'
- name: unarchive hue file
unarchive:
src: "/tmp/hue-4.10.0.tgz"
dest: "/opt"
remote_src: True
owner: "hue"
group: "hue"
become: True
- name: "create symlink /opt/hue"
file:
src: "/opt/hue-4.10.0"
dest: /opt/hue
state: link
owner: "hue"
group: "hue"
become: yes
```
```bash
# inventory.yaml의 호스트로 playbook.yaml을 실행
ansible-playbook -i inventory.yaml playbook.yaml
```
**예제**
인벤토리에 플레이북에서 사용할 호스트 명(hue) 추가
```
---
all:
hosts:
hue-server:
children:
hue:
hosts:
hue-server:
```
플레이북은 `hosts`에 명령을 실행할 서버(hue)를 지정하고 태스크(파일 다운로드 → 압축해제 → symbolic link 생성) 실행
```
---
- hosts: "hue"
- name: download hue file
get_url:
url: "<https://cdn.gethue.com/downloads/hue-4.10.0.tgz>"
dest: /tmp
mode: '0660'
- name: unarchive hue file
unarchive:
src: "/tmp/hue-4.10.0.tgz"
dest: "/opt"
remote_src: True
owner: "hue"
group: "hue"
become: True
- name: "create symlink /opt/hue"
file:
src: "/opt/hue-4.10.0"
dest: /opt/hue
state: link
owner: "hue"
group: "hue"
become: yes
```