✔️ artifact 재사용 - 역할
역할이 정의되어 있는 파일의 구조를 tree 명령어로 확인해보자
[vagrant@controller 0419]$ tree
.
├── ansible.cfg
├── deploy.yaml
├── inven.ini
├── revert.yaml
├── templates
│ ├── port.cnf.j2
│ └── wp-config.php.j2
└── vars
├── database.yaml
├── php_repo.yaml
└── wordpress.yaml
2 directories, 9 files
- deploy.yaml - 배포할 때 사용하는 메인 playbook 파일
- templates 디렉토리 - template 모듈에서 src로 지정하는 파일들을 모아둔다.
- vars - vars_files 에서 참조하는 변수들을 모아둔다.
위의 구조는 파일을 용도별로 나눠 디렉토리에 구분해 놓았다.
include나 import를 사용하여 tasks라는 디렉토리를 만들고 그 하위에 내용들을 모아두는 방법도 있다.
용도별로 디렉토리를 나눠 구분하는 것의 장점은 각 파일이 어디에 쓰이는 파일인지 알기가 쉽다는 것이다.
하지만 이렇게 분류하는 방법이 사람마다 다 다르면 오히려 혼돈을 줄 수 있다.
많은 사람들이 함께 개발하는 경우 문제가 더 커질 수 있다.
따라서 기본적으로 지켜야 하는 format에 대한 원칙이 존재한다.
playbook 작성시 파일, 디렉토리의 구조 등이 정해져 있는 role 이라는 개념이 있으며,
역할을 생성하고 → 역할을 통합해서 → 하나의 플레이북을 만들기 위한 통일화된 구조를 제공한다.
다시 말해 누가 만들어도 똑같은 구조를 갖도록 하기 위해 사용하는 것이다.
역할은 반드시 roles 라는 디렉토리를 사용한다.ansible-galaxy
: 역할 구조를 자동으로 생성해주는 명령어
반드시 ansible-galaxy를 사용해야 하는 것은 아니다. 다만 역할의 구조는 반드시 지켜야 한다.
[vagrant@controller 10_role]$ ansible-galaxy init common --init-path roles
- Role common was created successfully
[vagrant@controller 10_role]$ tree
.
└── roles
└── common
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
10 directories, 8 files
roles/common
:역할의 이름
tasks/main.yml
: 작업이 위치handlers/main.yml
: 핸들러 작업이 위치
tests/inventory
: 역할을 테스트 하기 위한 인벤토리tests/test.yml
: 역할을 테스트 하기 위한 플레이북
defaults/main.yml
: 기본 역할 변수 (우선 순위가 매우 낮음)vars/main.yml
: 역할 변수 (우선 순위가 매우 높음)
files
: 파일 관련 모듈의 src:
파라미터에서 참조하는 파일의 위치
files/a.txt
: 경로를 지정할 필요 없음
- copy:
src: a.txt
src: a.txt 라고 적어도 알아서 files 하위의 a.txt를 찾게 된다.
templates
: 템플릿 모듈의 src:
파라미터에서 참조하는 파일의 위치templates/a.j2
- templates:
src: a.j2
meta/main.yml
: 역할을 설명하고 있는 파일
- 역할의 버전
- 역할 이름
- 역할을 만든 사람
- 역할이 적용되는 플랫폼 (Linux 배포판)
- 역할의 의존성을 정의
대부분 내용이 비워져 있으며 필요한 경우 채워 쓰면 된다.
[vagrant@controller 10_role]$ cd roles/common/
[vagrant@controller common]$ ls
defaults files handlers meta README.md tasks templates tests vars
[vagrant@controller common]$ cat defaults/main.yml
---
# defaults file for common[vagrant@controller common]$
[vagrant@controller common]$ cat tasks/main.yml
---
# tasks file for common[vagrant@controller common]$
[vagrant@controller common]$ cat tests/inventory
localhost
[vagrant@controller common]$ cat tests/test.yml
---
- hosts: localhost
remote_user: root
roles:
- common[vagrant@controller common]$
[vagrant@controller common]$ cat meta/main.yml
galaxy_info:
author: your name
description: your role description
company: your company (optional)
# If the issue tracker for your role is not on github, uncomment the
# next line and provide a value
# issue_tracker_url: http://example.com/issue/tracker
라이센스 지정
# Choose a valid license ID from https://spdx.org - some suggested licenses:
# - BSD-3-Clause (default)
# - MIT
# - GPL-2.0-or-later
# - GPL-3.0-only
# - Apache-2.0
# - CC-BY-4.0
license: license (GPL-2.0-or-later, MIT, etc)
min_ansible_version: 2.9
# If this a Container Enabled role, provide the minimum Ansible Container version.
# min_ansible_container_version:
#
# Provide a list of supported platforms, and for each platform a list of versions.
# If you don't wish to enumerate all versions for a particular platform, use 'all'.
# To view available platforms and versions (or releases), visit:
# https://galaxy.ansible.com/api/v1/platforms/
#
# platforms:
# - name: Fedora
# versions:
# - all
# - 25
# - name: SomePlatform
# versions:
# - all
# - 1.0
# - 7
# - 99.99
galaxy_tags: []
# List tags for your role here, one per line. A tag is a keyword that describes
# and categorizes the role. Users find roles by searching for tags. Be sure to
# remove the '[]' above, if you add tags to this list.
#
# NOTE: A tag is limited to a single word comprised of alphanumeric characters.
# Maximum 20 tags per role.
dependencies: []
# List your role dependencies here, one per line. Be sure to remove the '[]' above,
# if you add dependencies to this list.
[vagrant@controller common]$
필요한 파일만 만들어 사용하면 되며 반드시 모든 파일이 존재해야 하는 것은 아니다.
✔️ 역할 사용 예시
[vagrant@controller common]$ code vars/main.yml
[vagrant@controller common]$ cat vars/main.yml
---
# vars file for common
message: hello roles
[vagrant@controller common]$ code tasks/main.yml
[vagrant@controller common]$ cat tasks/main.yml
---
# tasks file for common
- debug:
msg: "{{ message }}"
- include_tasks: debug.yaml
[vagrant@controller common]$ code tasks/debug.yaml
[vagrant@controller common]$ cat tasks/debug.yaml
- debug:
msg: "hello inner module"
[vagrant@controller common]$ cat tasks/main.yml
---
# tasks file for common
- debug:
msg: "{{ message }}"
notify:
- restart service
- include_tasks: debug.yaml
[vagrant@controller common]$ code handlers/main.yml
[vagrant@controller common]$ cat handlers/main.yml
---
# handlers file for common
- name: restart service
debug:
msg: "restart service"
[vagrant@controller 10_role]$ code site.yaml
[vagrant@controller 10_role]$ cat site.yaml
- hosts: 192.168.100.11
roles:
- common
[vagrant@controller 10_role]$ ansible-playbook site.yaml
PLAY [192.168.100.11] ***********************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************************************
ok: [192.168.100.11]
TASK [common : debug] ***********************************************************************************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "hello roles"
}
TASK [common : include_tasks] ***************************************************************************************************************************************************************************************************************************************
included: /home/vagrant/code/10_role/roles/common/tasks/debug.yaml for 192.168.100.11
TASK [common : debug] ***********************************************************************************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "hello inner module"
}
PLAY RECAP **********************************************************************************************************************************************************************************************************************************************************
192.168.100.11 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
✔️ 기존 파일을 역할 구성 만들기
현재 sample 디렉토리의 트리 구조는 다음과 같다.
[vagrant@controller sample]$ tree
.
├── sample.yaml
├── web_config
│ └── ports.conf.j2
└── web_contents
└── index.html
2 directories, 3 files
sample.yaml 파일 전체의 내용이다.
- hosts: 192.168.100.12
become: yes
vars:
web_port: 81
tasks:
- yum: # 패키지 설치
name: httpd
state: installed
- replace: # replace를 이용해 주석 처리 후
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen'
replace: '#Listen'
- template: # template를 이용해 포트 설정 파일을 구성
src: web_config/ports.conf.j2
dest: /etc/httpd/conf.d/ports.conf
notify: # 설정 파일이 변경되었으므로 Web Service를 재시작하도록 알림
- Restart Web Service
- copy:
src: web_contents/index.html
dest: /var/www/html/
- service:
name: httpd
state: started
enabled: yes
handlers:
- name: Restart Web Service # handler에서 처리함
service:
name: httpd
state: restarted
roles 구성을 만들어보자
# 필요한 파일을 만들어주기
[vagrant@controller sample]$ mkdir -p roles/web/tasks
[vagrant@controller sample]$ mkdir -p roles/web/handlers
[vagrant@controller sample]$ mkdir -p roles/web/vars
[vagrant@controller sample]$ mkdir -p roles/web/templates
[vagrant@controller sample]$ mkdir -p roles/web/files
roles/web/tasks/main.yaml
- yum:
name: httpd
state: installed
- replace:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen'
replace: '#Listen'
- template:
src: web_config/ports.conf.j2
dest: /etc/httpd/conf.d/ports.conf
notify:
- Restart Web Service
- copy:
src: web_contents/index.html
dest: /var/www/html/
- service:
name: httpd
state: started
enabled: yes
roles/web/handlers/main.yaml
- name: Restart Web Service
service:
name: httpd
state: restarted
roles/web/vars/main.yaml
---
web_port: 81
[vagrant@controller sample]$ cp web_config/ports.conf.j2 roles/web/templates/
[vagrant@controller sample]$ cp web_contents/index.html roles/web/files/
[vagrant@controller sample]$ code site.yaml
[vagrant@controller sample]$ cat site.yaml
- hosts: 192.168.100.12
become: yes
roles:
- web
역할 구성을 만든 후의 트리 구조이다.
[vagrant@controller sample]$ tree
.
├── roles
│ └── web
│ ├── files
│ │ └── index.html
│ ├── handlers
│ │ └── main.yaml
│ ├── tasks
│ │ └── main.yaml
│ ├── templates
│ │ └── ports.conf.j2
│ └── vars
│ └── main.yaml
├── sample.yaml
├── site.yaml
실행을 시켜보면 작업이 정상적으로 실행되었음을 확인할 수 있다.
PLAY [192.168.100.12] ***********************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************************************
ok: [192.168.100.12]
TASK [web : yum] ****************************************************************************************************************************************************************************************************************************************************
changed: [192.168.100.12]
TASK [web : replace] ************************************************************************************************************************************************************************************************************************************************
--- before: /etc/httpd/conf/httpd.conf
+++ after: /etc/httpd/conf/httpd.conf
@@ -39,7 +39,7 @@
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
-Listen 80
+#Listen 80
#
# Dynamic Shared Object (DSO) Support
changed: [192.168.100.12]
TASK [web : template] ***********************************************************************************************************************************************************************************************************************************************
--- before
+++ after: /home/vagrant/.ansible/tmp/ansible-local-143412qF7Qn/tmpN_wvod/ports.conf.j2
@@ -0,0 +1 @@
+Listen 81
changed: [192.168.100.12]
TASK [web : copy] ***************************************************************************************************************************************************************************************************************************************************
--- before
+++ after: /home/vagrant/sample/web_contents/index.html
@@ -0,0 +1 @@
+<h1> hello ansible role </h1>
\ No newline at end of file
changed: [192.168.100.12]
TASK [web : service] ************************************************************************************************************************************************************************************************************************************************
changed: [192.168.100.12]
RUNNING HANDLER [web : Restart Web Service] *************************************************************************************************************************************************************************************************************************
changed: [192.168.100.12]
PLAY RECAP **********************************************************************************************************************************************************************************************************************************************************
192.168.100.12 : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[vagrant@controller sample]$ curl 192.168.100.12:81
<h1> hello ansible role </h1>
✔️ 역할을 사용하는 기본 디렉토리 위치
[vagrant@controller sample]$ ansible-galaxy list
# /home/vagrant/.ansible/roles
# /usr/share/ansible/roles
# /etc/ansible/roles
(0. 현재 디렉토리의 roles)
1. /home/vagrant/.ansible/roles
2. /usr/share/ansible/roles
3. /etc/ansible/roles
앞서 만든 역할
[vagrant@controller sample]$ ansible-galaxy list --roles-path roles
# /home/vagrant/sample/roles
# /usr/share/ansible/roles
# /etc/ansible/roles
'DevOps > Ansible' 카테고리의 다른 글
[Ansible] ansible-galaxy 사용법 (0) | 2022.04.21 |
---|---|
[Ansible] 플레이 레벨에서 작업 실행 순서 (0) | 2022.04.21 |
[Ansible] artifact 재사용 - 파일 재사용 (2) (0) | 2022.04.20 |
[Ansible] artifact 재사용 - 파일 재사용 (1) (0) | 2022.04.20 |
[Ansible] 작업 제어 (Task Controll) (0) | 2022.04.20 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!