ansible

ANSIBLE ROLES 따라하기

이번에 고객 요청으로 인프라 자동화 구현을 위해 여러가지 기능 및 테스트 하려고 이것 저것 테스트 하기로함

 

우선은 ansible을 사용하여 centos에 nginx를 설치하고 정상 설치 확인을 위해서 index.html 페이지에 host정보를 출력하게하는 playbook을 만들기로 생각하고, 나중에 다른곳에서도 재사용을 용이하게 하기 위해서 roles을 사용하여 적용하기로 하고 검색하던중 필요한 부분을 발췌하여 봅니다.

 

우선 roles는 Ansible에서 비슷한 플레이북을 만들때 재사용시 아주 용이하게 만들어 주기에 테스트해보기로함

 

목표 : 새로운 centos에 nginx을 설치 하고 기본 페이지(index.html)를 서버의 IP주소 및 페이지 작성 시간이 출력 되게 구성하는 ansible-playbook 생성

 

새 Role 을 작성하는데 ansible-galaxy 명령어 사용

# created directory
cd ~/ansible

# Create a roles directory
mkdir roles
cd roles

# nginx 라는 새 Role 을 초기화 한다
ansible-galaxy init nginx

Role은 말그대로 역할을 정의하고 그에 대해서 directory별로 분리합니다. 

$ tree
.
├── roles
│   └── nginx
│       ├── defaults
│       │   └── main.yml
│       ├── files
│       │   └── iac.repo
│       ├── handlers
│       │   └── main.yml
│       ├── meta
│       │   └── main.yml
│       ├── README.md
│       ├── tasks
│       │   └── main.yml
│       ├── templates
│       │   └── index.html.j2
│       ├── tests
│       │   ├── inventory
│       │   └── test.yml
│       └── vars
│           └── main.yml
└── web.yml
  • tasks : playbook에 작성 했던 tasks와 동일합니다..
  • handlers : linux service를 처리하기 위해 사용합니다.
  • defaults : 기본 변수를 설정합니다.
  • vars : 작업 수행 시 사용할 변수를 정의합니다.
  • files : 각 managed 서버에 배포할 파일의 위치입니다.
  • templates : managed 서버에 배포할 템플릿 파일 위치입니다.
  • meta : roles에 대한 정보, 호환 버전 등 메타 데이터를 정의합니다.

Ansible role에서는 file, templates를 제외한 나머지 main, vars, tasks 등은 main.yml 로 시작됩니다.


1. file

Role사용시 해당 Role에서 사용하는 파일을 위치

인터넷이 되지 않은 환경의 내부에 레파지토리 서버를 구성하고 해당 정보를 새로운 서버에서 사용하기위한 파일

$ ls -l roles/nginx/files/
total 4
-rw-r--r-- 1 iac iac 78 Dec 19 02:38 iac.repo
$ cat roles/nginx/files/iac.repo
[iactest]
name=iac test repo
baseurl=http://192.168.0.40
enabled=1
gpgcheck=0

 

2. handlers

테스크와 비슷하지만 테스크에서 트리거하여 사용하는 부분을 작성

예) 서비스 시작 및 재시작 관련 task작성 

$ cat roles/nginx/handlers/main.yml
---
# handlers file for nginx
- name: Start Nginx
  service:
    name: nginx
    state: started

- name: Reload Nginx
  service:
    name: nginx
    state: reloaded

 

3. templates

python jinja 템플릿 엔진 기반 템플릿 변수를 담을수 있음

예) 서버별로 다른 index.html을 구현하기 위해 템플릿 변수 사용 "{{ }}" 안에 템플릿 변수가 사용시 바뀌어서 만들어짐

$ cat roles/nginx/templates/index.html.j2
this is test page<br>
this host is {{ ansible_host }}<br>
create datetime is {{ ansible_date_time.date }} {{ ansible_date_time.time }}

 

4. tasks

위에서 만든 것을을 모아서 사용할수 있게

$ cat roles/nginx/tasks/main.yml
---
# tasks file for nginx
- name: copy file from local host to remote host
  copy:
    src: iac.repo
    dest: /etc/yum.repos.d/iac.repo

- name: install nginx web server
  action: "{{ ansible_pkg_mgr }} name=nginx state=present"

- name: Creating a test index.html
  template:
    src: index.html.j2
    dest: /usr/share/nginx/html/index.html
  notify:
    - Start Nginx

 task1 -> file 디렉토리에 있는 iac.repo 파일을 새로운 서버에 복사

 task2 -> 내부에 있는 레파지토리를 이용 nginx 설치

     "ansible_pkg_mgr" 변수는 OS별로 패키지 설치 명령어가 다르지만 같은 형태로 구현하게함(centos인경우 yum)

 task3 -> 템플릿 폴더에 있는 index.html.j2파일을 해당위치에 템플릿변수를 변경하여 만들고, 핸들러폴더에 있는 

      " -Start Nginx" 부분을 실행


이제 만들어진 roles를 사용

web.yml파일을 만들어서 host1변수에 값을 입력받아서 해당 호스트에 nginx를 설치하고 index 페이지를 확인해봄

$ cat web.yml
---
- name: install web server on server
  hosts: "{{ host1 }}"
  become: yes
  roles:
    - nginx

실행

ansible-playbook 실행시 "-e" 옵션 사용하여 변수를 사용하게함

$ ansible-playbook -i hosts/ansible_host web.yml -e host1=192.168.0.8

PLAY [install web server on server] ******************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************
ok: [192.168.0.8]

TASK [nginx : copy file from local host to remote host] **********************************************************************************************
changed: [192.168.0.8]

TASK [install nginx web server] **********************************************************************************************************************
changed: [192.168.0.8]

TASK [nginx : Creating a test index.html] ************************************************************************************************************
changed: [192.168.0.8]

RUNNING HANDLER [nginx : Start Nginx] ****************************************************************************************************************
changed: [192.168.0.8]

PLAY RECAP *******************************************************************************************************************************************
192.168.0.8                : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

내가 원하는 결과가 나오는것 확인~~

$ curl http://192.168.0.8
this is test page<br>
this host is 192.168.0.8<br>
create datetime is 2020-12-19 12:34:43

curl 해당 홈페이지에서 서버의 IP와 index페이지를 작성한 시간이 나옴

 

이제 다른 서버에 nginx설치시 host1변수만 바꾸어서 실행하면 추가로 playbook를 만들지 않아도 쉽게 구현 가능

 

참고 : oniondev.egloos.com/9978477

 

[번역] Ansible 2 튜토리얼 #4 - Roles

https://serversforhackers.com/c/an-ansible2-tutorial위 링크를 번역한 글입니다.================================================== 역할(=Roles)Role 은 여러개의 연관된 Task 를 체계화 하고, 그에 쓰이는 데이터를 묶는데 좋

oniondev.egloos.com

 

반응형