Search

include_tasks + when

Tags
ansible
include_tasks
when
Created
2024/04/27 22:39
Created time
2024/04/27 13:39
category
ansible

개요

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에 종속되니까)