✔️ 아티팩트 재사용 - 파일
아티팩트라는 용어는 ?
Artefact, Artifact : 인공물
인공적으로 만든 형태를 artifact 라고 한다.
software가 실행됨에 따라 만들어진 데이터도 아티팩트라고 한다. (ex. 로그)
web browser에서 입력하는 것들은 모두 기록이 되어 컴퓨터 어딘가에 파일로 저장이 되는데 그것 또한 아티팩트이다.
yaml 코드 짜는 것도 아티팩트라고 한다.
정리하자면 artifact는
- 애플리케이션이 작동해서 생성한 데이터
- 사람이 직접 작성한 코드
기본적으로 ansible에서 말하는 재사용성이란 파일을 용도별로 구분해서 재사용하기 위함이다.
ansible에서 재사용할 수 있는 파일의 종류
- 변수 파일
- 작업 파일
- play/playbook file
- 역할(Role)
✔️ 변수 파일
vars_files
vars_file은 플레이의 키워드이다.
- hosts: x
vars_files:
- vars/a.yaml
tasks:
....
[vagrant@controller ~]$ ansible-doc include_vars
변수 파일을 동적으로 파일이나 디렉토리에서 읽어들인다.
- dir - 변수 파일을 모아놓은 디렉토리를 지정
- file - 특정 파일명 (파일이 하나일 때)
- freeform - 파일의 위치를 직접 지정, 사용할 변수를 직접 지정한다는 등
ansible-doc vars_files // 모듈이 아니다 play의 keyword이다.
✔️ include_vars 모듈
module이자 tasks로서 작동한다.
- hosts: x
tasks:
- include_vars:
dir: vars/ # var 디렉토리에 있는 파일들을 읽어서 변수로 만든다.
예제test.yaml
- hosts: 192.168.100.11
tasks:
- include_vars: var.yaml
- debug:
msg: "{{ message }}"
var.yaml
---
message: hello world
[vagrant@controller 07_include_vars]$ ansible-playbook test.yaml
PLAY [192.168.100.11] ***************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [192.168.100.11]
TASK [include_vars] *****************************************************************************************************************
ok: [192.168.100.11]
TASK [debug] ************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "hello world="
}
PLAY RECAP **************************************************************************************************************************
192.168.100.11 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
vars_files 같은 경우는 include_vars 앞의 변수를 참조하는 경우 message undefined 에러가 뜬다.
✔️ 인벤토리 변수
✔️ 인벤토리 내부 파일에 변수 설정
호스트 변수
node1 message="hello world"
그룹 변수
반드시 그룹을 지정해야 하며 vars를 사용해 변수를 지정할 수 있다.
[wordpress]
node1
node2
[wordpress:vars] # wordpress라는 그룹에 부여하는 변수
message="hello world"
✔️ 인벤토리 외부 파일에 변수 설정
인벤토리 파일 또는 플레이북 파일이 있는 디렉토리에 변수를 설정한다.
group_vars/<GROUP_NAME>
host_vars/<HOST_NAME>
ansible automation 엔진이 이 디렉토리에 변수를 알아서 가져온다.
그러기 위해서 그룹 이름 또는 호스트 이름으로된 디렉토리 파일을 만들어야 한다.
<GROUP_NAME>
,<HOST_NAME>
: 디렉토리 또는 파일을 생성
디렉토리를 만드는 경우 파일을 분리해서 제공할 수 있어 변수 파일의 라인 수를 줄여 효과적으로 관리할 수 있다.
예제ansible.cfg
[vagrant@controller 08_artifact_vars]$ cat ansible.cfg
[defaults]
inventory=inven.ini
inven.ini
[nodes]
node1
node2
[vagrant@controller 08_artifact_vars]$ ansible-inventory --graph
@all:
|--@nodes:
| |--node1
| |--node2
|--@ungrouped:
node1, 2는 nodes에 속하며 nodes 그룹은 all 그룹에 속한다.
host_vars 라는 디렉토리 명은 지정된 디렉토리명이며
하위에 만들 인벤토리 외부 파일은 ansible engine에 의해 읽혀지기 위해
호스트 이름이나 그룹 이름과 일치해야 하므로 파일을 다음과 같이 만들어야 한다.
mkdir host_vars
code host_vars/node1
host_vars/node1
message: hello node1
[vagrant@controller 08_artifact_vars]$ tree
.
├── ansible.cfg
├── host_vars
│ └── node1
└── inven.ini
1 directory, 3 files
[vagrant@controller 08_artifact_vars]$ ansible-inventory --list
{
"_meta": {
"hostvars": {
"node1": {
"message": "hello node1"
}
}
},
"all": {
"children": [
"nodes",
"ungrouped"
]
},
"nodes": {
"hosts": [
"node1",
"node2"
]
}
}
_meta
에서 node1에 부여되어 있는 변수를 볼 수 있다.
다음과 같이 리스트가 아니라 구체적으로 host 이름을 지정해서 node1에 부여된 변수만 볼 수 있다.
ansible-inventory --host node1
inven.ini 파일을 다음과 같이 수정하면
[vagrant@controller 08_artifact_vars]$ cat inven.ini
[nodes]
192.168.100.11
192.168.100.12
[vagrant@controller 08_artifact_vars]$ ansible-inventory --host 192.168.100.11
{}
192.168.100.11로 호스트를 지정한 뒤 부여된 변수를 확인했을 때 아무것도 출력되지 않는다.
인벤토리 파일에 호스트를 지정했기 때문에 실제 host_vars 밑의 파일명이 192.168.100.11여야 한다.
하지만 현재는 구조가 이렇기 때문에 ansible 엔진이 192.168.100.11의 변수를 찾지 못한다.
[vagrant@controller 08_artifact_vars]$ tree
.
├── ansible.cfg
├── host_vars
│ └── node1
└── inven.ini
1 directory, 3 files
그러면 어떻게 해결하면 될까 ?
host_vars 밑의 node1 파일을 192.168.100.11 파일로 옮기고 ansible engine이 제대로 변수를 찾을 수 있는지
tree로 구조를 확인한뒤 다시 192.168.100.11 호스트에 부여된 변수를 확인해보자.
[vagrant@controller 08_artifact_vars]$ mv host_vars/node1 host_vars/192.168.100.11
[vagrant@controller 08_artifact_vars]$ tree
.
├── ansible.cfg
├── host_vars
│ └── 192.168.100.11
└── inven.ini
1 directory, 3 files
[vagrant@controller 08_artifact_vars]$ ansible-inventory --host 192.168.100.11
{
"message": "hello node1"
}
[vagrant@controller 08_artifact_vars]$ cat host_vars/192.168.100.12
---
message: "hello node2"
[vagrant@controller 08_artifact_vars]$ ansible-inventory --host 192.168.100.12
{
"message": "hello node2"
}
[vagrant@controller 08_artifact_vars]$ ansible-inventory --host 192.168.100.11
{
"message": "hello node1"
}
✔️ 인벤토리 외부 파일 사용의 장점
이러한 인벤토리 외부 파일 사용의 장점은 같은 변수를 호스트에 따라서 다른 값으로 제공할 수 있다는 것이다.
또는 특정 그룹에 따라 변수를 다르게 설정할 수 있다.
여기서 중요하게 생각해야 될 것은 변수를 설정할 때는 변수가 미치는 범위 "scope"을 생각해야 된다는 것이다.
인벤토리 외부 파일 사용 전의 예제들에서 플레이 내에 변수를 선언했을 때 변수가 미치는 범위는 그 플레이를 실행하는 모든 호스트에 동일한 변수가 할당되었던 것이다.
인벤토리 외부 파일을 사용할 때는 맹목적으로 사용하지 않고 목적, 의도를 생각한뒤 사용해야 한다.
호스트마다 똑같은 구성을 하려면 그룹이나 플레이 레벨에서 변수를 선언하고
호스트 별로 다른 구성, 다른 변수를 가져야 한다면 호스트 변수를 사용한다.
보통은 재사용성을 위해 이렇게 사용한다.
group_vars/<GROUP_NAME>
host_vars/<HOST_NAME>
조금 더 나아가, host_vars 밑에 디렉토리를 만드는 것도 가능하다.
[vagrant@controller 08_artifact_vars]$ rm host_vars/192.168.100.12 # 파일을 삭제
[vagrant@controller 08_artifact_vars]$ mkdir host_vars/192.168.100.12 # 디렉토리를 생성
그리고 디렉토리 내에 var.yaml 파일을 만들어 구성해도 변수가 부여된다.
[vagrant@controller 08_artifact_vars]$ code host_vars/192.168.100.12/var.yaml
[vagrant@controller 08_artifact_vars]$ tree
.
├── ansible.cfg
├── host_vars
│ ├── 192.168.100.11
│ └── 192.168.100.12
│ └── var.yaml
└── inven.ini
2 directories, 4 files
[vagrant@controller 08_artifact_vars]$ ansible-inventory --host 192.168.100.12
{
"message": "hello node2"
}
어떻게 할 것인지는 우리가 선택적으로 할 수 있다.
✔️ 그룹 변수
[vagrant@controller 08_artifact_vars]$ mkdir group_vars
[vagrant@controller 08_artifact_vars]$ code group_vars/nodes
group_vars/nodes
---
service_port: 8080
[vagrant@controller 08_artifact_vars]$ tree
.
├── ansible.cfg
├── group_vars
│ └── nodes
├── host_vars
│ ├── 192.168.100.11
│ └── 192.168.100.12
│ └── var.yaml
└── inven.ini
3 directories, 5 files
[vagrant@controller 08_artifact_vars]$ ansible-inventory --host 192.168.100.11
{
"message": "hello node1", # 자신의 호스트에 부여된 변수
"service_port": 8080 # 그룹에게 부여된 변수
}
test.yaml
- hosts: nodes
tasks:
- debug:
msg; "{{ message }} - {{ service_port }}"
[vagrant@controller 08_artifact_vars]$ ansible-playbook test.yaml
PLAY [nodes] ********************************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************************************
ok: [192.168.100.11]
ok: [192.168.100.12]
TASK [debug] ********************************************************************************************************************************************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "hello node1 - 8080"
}
ok: [192.168.100.12] => {
"msg": "hello node2 - 8080"
}
PLAY RECAP **********************************************************************************************************************************************************************************************************************************************************
192.168.100.11 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.100.12 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
인벤토리 파일과 플레이북 파일이 항상 같은 위치에 있다고 볼 수 없다.
인벤토리 파일은 home 디렉토리 플레이북 파일은 별도의 디렉토리에 있을 수 있으므로
우선적으로 같은 위치에 있는 것을 비교하면 playbook에 있는 변수가 우선시 된다.
우선 순위를 비교해보자 숫자가 클수록 우선 순위가 높아진다.
- group_vars/all - 모든 호스트는 all 이라는 그룹에 속하므로 all 이라는 group에 부여할 변수라는 의미
- group_vars/* - all을 제외한 그룹 이름
- host_vars/* - 제일 우선순위가 높다.
예시
[vagrant@controller 08_artifact_vars]$ code group_vars/nodes
[vagrant@controller 08_artifact_vars]$ cat group_vars/nodes
---
service_port: 8080
message: hello world
[vagrant@controller 08_artifact_vars]$ ansible-inventory --host 192.168.100.11
{
"message": "hello node1",
"service_port": 8080
}
group_vars/nodes에 변수가 선언되어 있음에도 불구하고
host_vars 하위의 192.168.100.11 파일에 선언한 변수인 "hello node1"이 출력된다.
위에서 확인한대로 host_vars/*가 우선 순위가 더 높기 때문에 그렇다.
다만 우선 순위의 높고 낮음을 비교해야 할 때는 같은 변수가 다른 디렉토리에 있을 때에만 한정되므로 일단 scope을 위주로 생각하면 된다.
'DevOps > Ansible' 카테고리의 다른 글
[Ansible] artifact 재사용 - 역할(roles) (0) | 2022.04.21 |
---|---|
[Ansible] artifact 재사용 - 파일 재사용 (2) (0) | 2022.04.20 |
[Ansible] 작업 제어 (Task Controll) (0) | 2022.04.20 |
[Ansible] 태그 (Tag) (0) | 2022.04.20 |
[Ansible] 블록 (Block) (0) | 2022.04.20 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!