[Ansible] 변수 재사용

728x90

아티팩트 재사용

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
728x90