운영 Ansible - tags 활용
페이지 정보
본문
전체 플레이북을 실행하는 대신 특정 부분만 실행하는 것이 유용할 경우, Ansible tag를 활용하여 작업을 수행할 수 있습니다.
개별 task에 하나 이상의 태그를 적용할 수 있습니다.
> 두 개의 작업에 서로 다른 태그를 지정
>둘 이상의 개별 작업에 동일한 태그 적용
include_* 작업의 태그는 포함된 task 또는 role 내의 모든 작업이 아니라 include 자체에만 적용됩니다.
> foo 태그는 bar 라는 이름의 role 내부 작업에는 적용되지 않음
* 이와 관련된 내용은 4번에서 자세히 다룰 예정 *
play 내의 모든 task가 동일한 tag를 가져야 하는 경우, play 전체에 tag 지정이 가능합니다.
role 에 tag 를 추가하는 방법은 다음과 같습니다.
1) roles 내에 tag 지정
2) import_role 을 활용하여 tag 지정
3) role 내의 개별 task에 tag 지정
role 내에서 일부 task만 실행하거나 건너뛰어야 할 때 사용되는 유일한 방법입니다.
include_role 을 활용하여 해당 작업에 tag를 지정해야 합니다.
하지만 Ansible은 include_role, include_task 와 같은 동적 작업에서는 tag 상속이 불가능합니다.
즉, include를 통해 포함된 파일이나 role 내의 task가 아닌 '포함' 자체에만 tag가 적용됩니다.
이를 해결하기 위해 apply 키워드 또는 block 을 활용할 수 있습니다.
> apply 키워드 활용
> block 활용
Ansible은 always와 never 라는 특수한 태그를 갖고 있습니다.
- always : 별도로 skip 명령을 실행하지 않는 한, 해당 태그로 지정된 작업을 무조건 수행.
- never : 별도로 tag 실행 명령을 실행하지 않는 한, 해당 태그로 지정된 작업을 무조건 skip.
> always 태그 활용
> never 태그 활용
--tags all : 모든 작업 실행, tag 무시 (default)
--tags [tag1,tag2] : 해당 tag가 있는 작업만 실행
--skip-tags [tag3,tag4] : 해당 tag가 있는 작업을 제외한 모든 작업을 실행
--tags tagged : 하나 이상의 tag가 있는 작업만 실행
--tags untagged : tag가 없는 작업만 실행
> configuration, packages 태그 작업만 실행
> packages 태그가 지정된 작업을 제외한 모든 작업 실행
role이나 playbook 을 실행할 때, 어떤 task에 어떤 tag가 있는지 모르거나 기억하지 못할 수 있습니다.
이러한 상황에 tag 사용 결과를 미리 확인 할 수 있는 command가 있습니다.
--list-tags : 사용 가능한 tag 목록 생성
--list-tasks : --tags / --skip-tags 명령 실행 시 수행될 task를 미리 확인 가능
> 적용 가능한 모든 tag 확인 가능
> 실행하고자 하는 tag를 어떤 task가 가지고 있는지 불확실할 경우, 해당 tag가 포함된 task 나열 가능
* 주의 : 이러한 command는 동적으로 포함된 파일 또는 role 내의 tag나 task를 확인할 수 없습니다.
1. 개별 task에 tag 추가
개별 task에 하나 이상의 태그를 적용할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | tasks: - name: Install the servers yum: name: - httpd - memcached state: present tags: - packages - webservers - name: Configure the service template: src: templates/src.j2 dest: /etc/foo.conf tags: - configuration | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | --- # file: roles/common/tasks/main.yml - name: Install ntp yum: name: ntp state: present tags: ntp - name: Configure ntp template: src: ntp.conf.j2 dest: /etc/ntp.conf notify: - restart ntpd tags: ntp - name: Enable and run ntpd service: name: ntpd state: started enabled: yes tags: ntp | cs |
2. include task에 tag 추가
include_* 작업의 태그는 포함된 task 또는 role 내의 모든 작업이 아니라 include 자체에만 적용됩니다.
1 2 3 4 5 6 7 | - hosts: webservers tasks: - name: Include the bar role include_role: name: bar tags: - foo | cs |
* 이와 관련된 내용은 4번에서 자세히 다룰 예정 *
3. play 전체에 tag 추가
play 내의 모든 task가 동일한 tag를 가져야 하는 경우, play 전체에 tag 지정이 가능합니다.
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 | - hosts: all tags: ntp tasks: - name: Install ntp yum: name: ntp state: present - name: Configure ntp template: src: ntp.conf.j2 dest: /etc/ntp.conf notify: - restart ntpd - name: Enable and run ntpd service: name: ntpd state: started enabled: yes - hosts: fileservers tags: filesharing tasks: ... | cs |
4. role 에 tag 추가
role 에 tag 를 추가하는 방법은 다음과 같습니다.
1) roles 내에 tag 지정
1 2 3 4 5 | roles: - role: webserver vars: port: 5000 tags: [ web, foo ] | cs |
2) import_role 을 활용하여 tag 지정
1 2 3 4 5 6 7 8 9 10 11 12 | - hosts: webservers tasks: - name: Import the foo role import_role: name: foo tags: - bar - baz - name: Import tasks from foo.yml import_tasks: foo.yml tags: [ web, foo ] | cs |
3) role 내의 개별 task에 tag 지정
role 내에서 일부 task만 실행하거나 건너뛰어야 할 때 사용되는 유일한 방법입니다.
include_role 을 활용하여 해당 작업에 tag를 지정해야 합니다.
하지만 Ansible은 include_role, include_task 와 같은 동적 작업에서는 tag 상속이 불가능합니다.
즉, include를 통해 포함된 파일이나 role 내의 task가 아닌 '포함' 자체에만 tag가 적용됩니다.
이를 해결하기 위해 apply 키워드 또는 block 을 활용할 수 있습니다.
1 2 3 4 5 6 7 8 | - name: Apply the db tag to the include and to all tasks in db.yaml include_tasks: file: db.yml # adds 'db' tag to tasks within db.yml apply: tags: db # adds 'db' tag to this 'include_tasks' itself tags: db | cs |
1 2 3 4 | - block: - name: Include tasks from db.yml include_tasks: db.yml tags: db | cs |
5. 특수 태그(Special Tags)
Ansible은 always와 never 라는 특수한 태그를 갖고 있습니다.
- always : 별도로 skip 명령을 실행하지 않는 한, 해당 태그로 지정된 작업을 무조건 수행.
- never : 별도로 tag 실행 명령을 실행하지 않는 한, 해당 태그로 지정된 작업을 무조건 skip.
1 2 3 4 5 6 7 8 9 10 11 12 | tasks: - name: Print a message ansible.builtin.debug: msg: "Always runs" tags: - always - name: Print a message ansible.builtin.debug: msg: "runs when you use tag1" tags: - tag1 | cs |
1 2 3 4 5 | tasks: - name: Run the rarely-used debug task debug: msg: '{{ showmevar }}' tags: [ never, debug ] | cs |
6. tag 실행 관련 command
--tags all : 모든 작업 실행, tag 무시 (default)
--tags [tag1,tag2] : 해당 tag가 있는 작업만 실행
--skip-tags [tag3,tag4] : 해당 tag가 있는 작업을 제외한 모든 작업을 실행
--tags tagged : 하나 이상의 tag가 있는 작업만 실행
--tags untagged : tag가 없는 작업만 실행
1 | ansible-playbook example.yml --tags "configuration,packages" | cs |
1 | ansible-playbook example.yml --skip-tags "packages" | cs |
7. tag 사용 결과 미리보기
role이나 playbook 을 실행할 때, 어떤 task에 어떤 tag가 있는지 모르거나 기억하지 못할 수 있습니다.
이러한 상황에 tag 사용 결과를 미리 확인 할 수 있는 command가 있습니다.
--list-tags : 사용 가능한 tag 목록 생성
--list-tasks : --tags / --skip-tags 명령 실행 시 수행될 task를 미리 확인 가능
1 | ansible-playbook example.yml --list-tags | cs |
1 | ansible-playbook example.yml --tags "configuration,packages" --list-tasks | cs |
* 주의 : 이러한 command는 동적으로 포함된 파일 또는 role 내의 tag나 task를 확인할 수 없습니다.
- 이전글Ansible - Loop 활용 21.02.05
- 다음글Ansible - 권한 에스컬레이션 21.01.22
댓글목록
등록된 댓글이 없습니다.