개요
Ansible의 site.yml (playbook.yml)에 따라 Role을 수행할 때, 길게 작성된 main.yml을 여러 Task로 분리할 때 분기에 따라 처리 가능한지 확인
방법
서버 상에 설치된 어플리케이션의 버전에 따라 Filebeat를 다르게 설정하는 경우를 가정
아래와 같이 include_tasks를 이용하여 사전에 작성된 YAML 파일을 수행하도록 만들고, when에 따라 분기 처리 되도록 설정
** 이전에는 include_tasks에 해당되는 각 Task들이 한 파일 내에 나열되어 난잡한 형태
# Common Task
- name: get package info
include_tasks: get_info.yml
# 오래된 Filebeat 삭제
- name: remove legacy filebeat
include_tasks: remove_legacy_filebeat.yml
when: opendistro_elasticsearch_version is undefined and filebeat_package_info is defined and filebeat_package_info['version'] is version(filebeat_version, '<')
# Filebeat 최선 버전 설치
- name: install filebeat
include_tasks: install_filebeat.yml
when: opendistro_elasticsearch_version is undefined
# [5, 7) 버전 ES의 Filebeat 설정
- name: copy filebeat config (5 <= elasticsearch_version < 7)
include_tasks: copy_plain_config.yml
when: elasticsearch_version is defined and elasticsearch_version is version('5.0', '>=') and elasticsearch_version is version('7.0', '<')
# [7, 9) 버전 ES의 Filebeat 설정
- name: copy filebeat config (7 <= elasticsearch_version < 9)
include_tasks: copy_json_config.yml
when: elasticsearch_version is defined and elasticsearch_version is version('7.0', '>=') and elasticsearch_version is version('9.0', '<')
# OpenSearch의 Filebeat 설정
- name: copy filebeat config for opensearch
include_tasks: copy_opensearch_config.yml
when: opensearch_version is defined
# Common Task
- name: restart filebeat
service:
name: filebeat
state: restarted
YAML
복사
고찰
when 구문 역시 include_tasks안에 넣을 수 있을 것으로 보았고, 이와 같이 작성하면 main.yml의 스크립트 길이가 더 짧아짐
main.yml이 짧은 것을 목표로 한다면 해볼만하지만, when을 include_tasks 스크립트 내부로 숨기면 main.yml을 읽었을 때 각 구문들이 모두 실행되는 것으로 오인 가능
결론적으로 include_tasks의 의도를 드러내기 위해선 when을 숨기는 것보다는 include_tasks와 함께 기재하는 것이 나은 것 같고, when을 빼는 것이 각 스크립트의 의존성을 낮추는 것이 되지 않을까 싶음 (when을 숨기는 경우엔 Task가 when에 종속되니까)