티스토리 뷰

DevOps/System&Tools

Ansible run at the special point

jacobbaek Jacob_baek 2020. 10. 29. 18:15

목적

ansible playbook을 특정 시점부터 실행하면 어떨까 하는 생각이 들었다.

실제 신규 playbook을 사용하는 경우 중간에 에러가 발생되어 처음부터 다시 시작시키는 경우가 있었고

이러한 상황마다 다시시작하게 되어 시간낭비가 있다고 생각이 들어 중간부터(필요한 task부터)

시작하는 방법이 없는지 찾게 되었다.

조사를 해보니 아래와 같은 몇가지 방식이 있다.

개인적인 의견으로는 playbook과 같은 다수의 task가 include되거나 role로 사용되고 있는 경우
tags 이외에는 별다른 방법이 없어보인다.

각 항목은 예시와 함께 설명을 할 예정이다.
관련 설명은 다음과 같은 playbook을 기반으로 진행할 예정이다.

jacob@jacob-laptop:~/workspaces/ansible/ansible-test$ cat site.yml 
---
- hosts: all
  gather_facts: no

  tasks:
  - name: print debug always
    ansible.builtin.debug:
      msg: "always run"
    tags:
    - always

  - name: print debug for tag number 1
    ansible.builtin.debug:
      msg: "runs with tag1 tag"
    tags:
    - tag1

  - name: print debug for tag number 2
    ansible.builtin.debug:
      msg: "runs with tag2 tag"
    tags:
    - tag2

  - include: inc_task.yml
    tags:
    - tag3

  roles:
    - name: print debug for test1 role
      role: roles/test1
    - name: print debug for test2 role
      role: roles/test2

위 playbook의 경우 테스트를 위해 사용한것으로 아래 링크에서 확인할수 있다.
(아래 예제를 위한 것으로 참고용으로 사용하기를 권장한다.)

start-at-task 옵션

특정한 task부터 시작하도록 할수 있다.
다만 여러 제약사항이 존재한다.

먼저 사용방법은 다음과 같다.

jacob@jacob-laptop:~/workspaces/ansible/ansible-test$ ansible-playbook -i hosts.ini --start-at-task="print debug for tag number 1" site.yml 

PLAY [all] ******************************************************************************************************************************************************************

TASK [print debug for tag number 1] *****************************************************************************************************************************************
ok: [127.0.0.1] => {
    "changed": false,
    "msg": "runs with tag1 tag"
}

TASK [print debug for tag number 2] *****************************************************************************************************************************************
ok: [127.0.0.1] => {
    "changed": false,
    "msg": "runs with tag2 tag"
}

TASK [print message for include task.] **************************************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": "include task"
}

PLAY RECAP ******************************************************************************************************************************************************************
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

위 playbook의 경우 다양한 role과 include를 이용한 yaml 파일을 실행하도록 되어 있는데 이의 경우 제한적으로 사용이 이루어진다.
먼저 include를 사용한 task가 있는경우 아래와 같이 사용이 불가하다.

jacob@jacob-laptop:~/workspaces/ansible/ansible-test$ ansible-playbook -i hosts.ini --start-at-task="print debug for tag number 3" playbook.yml

PLAY [all] ******************************************************************************************************************************************************************

PLAY RECAP ******************************************************************************************************************************************************************

 [ERROR]: No matching task "print debug for tag number 3" found. Note: --start-at-task can only follow static includes.

또한 role에 대한 부분도 사용이 불가하다.

jacob@jacob-laptop:~/workspaces/ansible/ansible-test$ ansible-playbook -i hosts.ini --start-to-task="print message with test2 role" site.yml 
ERROR! the playbook: --start-to-task=print message with test2 role could not be found

step 옵션

step 옵션은 시작부터 각 task를 실행할지에 대한 input을 받는다.
원하지 않는 task는 실행하지 않을수 있고 필요한 부분부터는 계속 실행시킬수 있으나
그 필요한 부분까지 no를 지속적으로 입력해야 하기에 다수의 task가 존재하는 경우는 사용이 어렵다.

jacob@jacob-laptop:~/workspaces/ansible/ansible-test$ ansible-playbook -i hosts.ini --step site.yml 

PLAY [all] ******************************************************************************************************************************************************************
Perform task: TASK: roles/test1 : print message with test1 role (N)o/(y)es/(c)ontinue: no

Perform task: TASK: roles/test1 : print message with test1 role (N)o/(y)es/(c)ontinue: **************************************************************************************
Perform task: TASK: roles/test2 : print message with test2 role (N)o/(y)es/(c)ontinue: no

Perform task: TASK: roles/test2 : print message with test2 role (N)o/(y)es/(c)ontinue: **************************************************************************************
Perform task: TASK: print debug always (N)o/(y)es/(c)ontinue: no

Perform task: TASK: print debug always (N)o/(y)es/(c)ontinue: ***************************************************************************************************************
Perform task: TASK: print debug for tag number 1 (N)o/(y)es/(c)ontinue: no

Perform task: TASK: print debug for tag number 1 (N)o/(y)es/(c)ontinue: *****************************************************************************************************
Perform task: TASK: print debug for tag number 2 (N)o/(y)es/(c)ontinue: yes

Perform task: TASK: print debug for tag number 2 (N)o/(y)es/(c)ontinue: *****************************************************************************************************

TASK [print debug for tag number 2] *****************************************************************************************************************************************
ok: [127.0.0.1] => {
    "changed": false,
    "msg": "runs with tag2 tag"
}
Perform task: TASK: print message for include task. (N)o/(y)es/(c)ontinue: c

Perform task: TASK: print message for include task. (N)o/(y)es/(c)ontinue: **************************************************************************************************

TASK [print message for include task.] **************************************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": "include task"
}

PLAY RECAP ******************************************************************************************************************************************************************
127.0.0.1                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

tags 활용

tags는 특정 task들을 지정하여 동작시키도록 할수 있다.
다만 특정한 시점부터 그 이후 모든 task를 동작시키는 개념과는 좀 다르다고 할수 있기에 원하는 방식으로 사용하기에는 좀 어려움이 있었다.

jacob@jacob-laptop:~/workspaces/ansible/ansible-test$ ansible-playbook -i hosts.ini -t tag4 site.yml 

PLAY [all] ******************************************************************************************************************************************************************

TASK [roles/test1 : print message with test1 role] **************************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": "run as test1 role."
}

TASK [print debug always] ***************************************************************************************************************************************************
ok: [127.0.0.1] => {
    "changed": false,
    "msg": "always run"
}

PLAY RECAP ******************************************************************************************************************************************************************
127.0.0.1                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

jacob@jacob-laptop:~/workspaces/ansible/ansible-test$ ansible-playbook -i hosts.ini -t tag2 site.yml 

PLAY [all] ******************************************************************************************************************************************************************

TASK [print debug always] ***************************************************************************************************************************************************
ok: [127.0.0.1] => {
    "changed": false,
    "msg": "always run"
}

TASK [print debug for tag number 2] *****************************************************************************************************************************************
ok: [127.0.0.1] => {
    "changed": false,
    "msg": "runs with tag2 tag"
}

PLAY RECAP ******************************************************************************************************************************************************************
127.0.0.1                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

위와 같이 tag의 경우는 include 및 role에 대한 제한 없이 사용이 가능하다.

다만, tag를 사전에 playbook 내에 필요에 맞게 삽입해놓아야 하기 때문에 이에 대한 사전 구현이 필요하다.

참고로 always로 선언한 task의 경우는 지정한 tag가 아니어도 무조건 실행되게 된다.

jacob@jacob-laptop:~/workspaces/ansible/ansible-test$ ansible-playbook -i hosts.ini playbook.yml

PLAY [all] ******************************************************************************************************************************************************************

TASK [print debug always] ***************************************************************************************************************************************************
ok: [127.0.0.1] => {
    "changed": false,
    "msg": "always run"
}

TASK [print debug for tag number 1] *****************************************************************************************************************************************
ok: [127.0.0.1] => {
    "changed": false,
    "msg": "runs with tag1 tag"
}

TASK [print debug for tag number 2] *****************************************************************************************************************************************
ok: [127.0.0.1] => {
    "changed": false,
    "msg": "runs with tag2 tag"
}

PLAY RECAP ******************************************************************************************************************************************************************
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

'DevOps > System&Tools' 카테고리의 다른 글

Ansible run at the special point  (0) 2020.10.29
Jenkins Slave with SSH  (0) 2020.09.09
Jenkins pipeline has triggered by github webhook  (0) 2020.08.17
Jenkins Directories  (0) 2020.08.14
Jenkins Debugging  (0) 2020.08.13
How to use minio as Terraform backend  (0) 2020.05.28
댓글
댓글쓰기 폼
공지사항
최근에 달린 댓글
Total
50,182
Today
8
Yesterday
62
링크
«   2020/11   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
글 보관함