아티팩트 재사용
Artefact, Artifact
- 애플리케이션이 작동하여 생성한 데이터
- 사람이 직접 작성한 코드
파일을 용도별로 구분을 하여 재사용하기 위함
앤서블에서는 다음 파일들을 분리하여 재사용성을 높인다.
- 변수 파일(vars file)
- 작업 파일
- 플레이/플레이북 파일
- 역할(Role)
변수 파일 재사용
vars_files: 플레이북의 키워드이다.
- name: test
hosts: x
vars_files:
- a.yml
- b.yml
- c.yml
include_vars: 모듈로 기능은 vars_files 와 동일하다.
- name: test
hosts: x
- include_vars:
dir: vars/ # vars 디렉토리에 있는 변수 파일들을 읽는다.
- include_vars: var.yml # free-form 형태로 변수 파일을 읽는다.
- include_vars:
file: a.yml
인벤토리 파일 내부에 변수 설정
호스트 변수
node1 message="hello world"
그룹 변수
[wordpress]
node1
node2
[wordpress:vars]
message="hello world"
인벤토리 외부 파일에 변수 설정하여 변수 재사용
인벤토리 파일 또는 플레이북 파일이 있는 디렉토리에 아래와 같은 디렉토리가 존재할 경우
- group_vars/<GROUP NAME>
- host_vars/<HOST NAME>
앤서블 인벤토리에 있는 호스트 이름과 똑같은 이름으로 host_vars 디렉토리 밑에 똑같은 이름으로 파일을 만들면 앤서블 엔진이 자동으로 변수를 추적해준다. 즉, 해당 파일에 있는 변수를 자동으로 가져와준다.
그룹 이름과 똑같은 이름으로 group_vars 디렉토리 밑에 똑같은 이름으로 파일을 만들면 앤서블 엔진이 자동으로 변수를 추적해준다. 즉, 해당 파일에 있는 변수를 자동으로 가져와준다.
<GROUP NAME>, <HOST NAME> 디렉토리 또는 파일을 생성하여 변수를 관리해준다.
변수 우선순위는 위와 같고, 항상 host_vars 가 group_vars 보다 우선순위가 높다.
작업 파일 재사용
공식 문서: https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse.html
[vagrant@controller 08_artifact]$ ansible-doc -l | grep include_
include_vars Load variables from files, dynamically within a task
include_role Load and execute a role
include_tasks Dynamically include a task list
[vagrant@controller 08_artifact]$ ansible-doc -l | grep import_
import_playbook Import a playbook
import_role Import a role into a play
import_tasks Import a task list
include
- include_vars: 변수 가져오기
- include_role: 역할 가져오기
- include_tasks: 작업 가져오기
import
- import_playbook: 플레이북 가져오기
- import_role: 역할 가져오기
- import_tasks: 작업 가져오기
import vs include
import 와 include 의 차이를 알아야 한다.
- include 는 동적으로 파일을 가져오고 import 는 정적으로 파일을 가져온다.
- include 는 해당되는 yml 파일에 가서 해당하는 내용을 읽는다. 처음 시작할 때 어떤 작업을 실행하는지를 모른다. import 는 이미 입력된 항목들을 읽어서 플레이북을 만든다.
아래는 import 일 경우에 작업들이 미리 셋팅된 것을 확인할 수 있다.
[vagrant@controller 09_artifact_tasks]$ cat test.yml
---
- hosts: 192.168.100.11
tasks:
- debug:
msg: in play
- import_tasks:
file: task.yml
- debug:
msg: in play
[vagrant@controller 09_artifact_tasks]$ ansible-playbook test.yml --list-tasks
playbook: test.yml
play #1 (192.168.100.11): 192.168.100.11 TAGS: []
tasks:
debug TAGS: []
debug TAGS: []
debug TAGS: []
debug TAGS: []
아래는 include 일 때로 tasks 에 어떤 작업들도 셋팅되지 않은 것을 확인할 수 있다.
[vagrant@controller 09_artifact_tasks]$ cat test.yml
---
- hosts: 192.168.100.11
tasks:
- debug:
msg: in play
- include_tasks:
file: task.yml
- debug:
msg: in play
[vagrant@controller 09_artifact_tasks]$ ansible-playbook test.yml --list-tasks
playbook: test.yml
play #1 (192.168.100.11): 192.168.100.11 TAGS: []
tasks:
debug TAGS: []
include_tasks TAGS: []
debug TAGS: []
- include 는 반복문이 가능하지만 import 는 반복문이 불가능하다.
실제로 import 모듈 자체를 반복문을 돌릴 수 없다. 하지만 task.yml 파일 안에서 자체적으로 반복문을 돌리는 경우에는 상관없다.
[vagrant@controller 09_artifact_tasks]$ cat test.yml
---
- hosts: 192.168.100.11
tasks:
- debug:
msg: in play
- import_tasks:
file: task.yml
with_sequence: start=1 end=3
- debug:
msg: in play
[vagrant@controller 09_artifact_tasks]$ ansible-playbook test.yml
ERROR! You cannot use loops on 'import_tasks' statements. You should use 'include_tasks' instead.
The error appears to be in '/home/vagrant/code/09_artifact_tasks/test.yml': line 6, column 7, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
msg: in play
- import_tasks:
^ here
반면 include 모듈은 모듈에 반복문을 걸 수 있다.
[vagrant@controller 09_artifact_tasks]$ cat test.yml
---
- hosts: 192.168.100.11
tasks:
- debug:
msg: in play
- include_tasks:
file: task.yml
with_sequence: start=1 end=3
- debug:
msg: in play
[vagrant@controller 09_artifact_tasks]$ ansible-playbook test.yml
PLAY [192.168.100.11] *****************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************
ok: [192.168.100.11]
TASK [debug] **************************************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "in play"
}
TASK [include_tasks] ******************************************************************************************************************************************
included: /home/vagrant/code/09_artifact_tasks/task.yml for 192.168.100.11
included: /home/vagrant/code/09_artifact_tasks/task.yml for 192.168.100.11
included: /home/vagrant/code/09_artifact_tasks/task.yml for 192.168.100.11
TASK [debug] **************************************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "inner module 1"
}
TASK [debug] **************************************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "inner module 2"
}
TASK [debug] **************************************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "inner module 1"
}
TASK [debug] **************************************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "inner module 2"
}
TASK [debug] **************************************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "inner module 1"
}
TASK [debug] **************************************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "inner module 2"
}
TASK [debug] **************************************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "in play"
}
PLAY RECAP ****************************************************************************************************************************************************
192.168.100.11 : ok=12 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- --start-at-task 로 특정 작업부터 시작하고자 할 때 include 의 경우 동적이기 때문에 사용할 수 가 없다. import 는 가능하다.
- include 는 handler 를 사용할 수 없다.
command 모듈은 항상 changed 상태로 변경시킨다.
notify 를 받을 작업이 task.yml 에 있을 경우 include 는 핸들러를 작동할 수 없다.
**[vagrant@controller 09_artifact_tasks]$ cat task.yml**
---
- name: hello notify
debug:
msg: hello notify
**[vagrant@controller 09_artifact_tasks]$ cat test.yml**
---
- hosts: 192.168.100.11
tasks:
- command: hostname
notify:
- hello notify
handlers:
- include_tasks: task.yml
**[vagrant@controller 09_artifact_tasks]$ ansible-playbook test.yml**
PLAY [192.168.100.11] *****************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************
ok: [192.168.100.11]
TASK [command] ************************************************************************************************************************************************
ERROR! The requested handler '-hello notify' was not found in either the main handlers list nor in the listening handlers list
하지만 include_tasks 에 notify 에서 호출하는 name 을 붙여줄 경우엔 handlers 를 사용할 수 있다.
**[vagrant@controller 09_artifact_tasks]$ cat task.yml**
---
- hosts: 192.168.100.11
tasks:
- command: hostname
notify:
- hello notify
handlers:
- name: hello notify
include_tasks: task.yml
**[vagrant@controller 09_artifact_tasks]$ ansible-playbook test.yml**
PLAY [192.168.100.11] *****************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************
ok: [192.168.100.11]
TASK [command] ************************************************************************************************************************************************
changed: [192.168.100.11]
RUNNING HANDLER [hello notify] ********************************************************************************************************************************
included: /home/vagrant/code/09_artifact_tasks/task.yml for 192.168.100.11
RUNNING HANDLER [hello notify] ********************************************************************************************************************************
ok: [192.168.100.11] => {
"msg": "hello notify"
}
PLAY RECAP ****************************************************************************************************************************************************
192.168.100.11 : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0