-
[Ansible] WinSVR 업데이트 Playbook 고도화 (V3)오픈소스 2022. 8. 4. 10:16
개요
요즘 인프라하면서 개발의 어려움을 조금씩이나마 겪고 있다. 주변에 같이 배워서 직접 해보려는 사람들은 정말 소수일 뿐이고, 시작도 하기 전에 보안적인 이슈가 있다고 트집을 잡거나 명확한 이유없이 오픈소스라는 이유로 무지성으로 비난하거나 안정성이 떨어진다고 말하는 사람들이 아직도 많고.. 정말 많다..
(양질의 자료를 무료로 공유해주시는 세상 모든 개발자분들 정말 감사합니다... ㅠㅠㅠ)
지난 포스팅 이후로 추가 요청 사항이 있어서 V3로 새롭게 개선하였다. 주요 개선사항은 패치를 수행하는 서버들을 각각 개발/운영 그룹으로 나누고 각 그룹에 대하여 다른 패치 파일을 적용시켜야 한다는 것이었다. 다른 패치를 수행함에 있어서는 문제 되는 부분이 없었으나 명령어를 통해 수집하는 정보로는 이를 구분할 수 없다는 것이 문제였다. 하여 필자는 When 조건문과 Inventory 그룹화를 통하여 이를 해결하였다.
Inventory 그룹화
Ansible Inventory를 작성하는 방식은 정말 다양하다. 1개 장비에 대한 정보를 트리 형태로 나열하는 방식도 있고 한 줄의 형태로 계속해서 작성해나가기도 한다. 하여 본 포스팅에서 기재한 방식만이 정답은 아니라는 것을 반드시 인지해야 한다.
위 그림을 민감 정보만 변경하여 필자가 실제로 사용했던 파일이다. 기존에 사용하던 형식과의 큰 차이점은 [ ] 를 통하여 대상 장비를 2개의 그룹으로 그룹화 하였는데 단순히 대상 장비 상단에다가 그룹명만을 명시해주면 된다. 이후 패치를 수행하는 Playbook에서 그룹명을 명시해주면 그룹에 포함된 대상 장비만이 Task를 수행할 수 있게 된다.
1번 행 : 개발그룹[DEV] / auto 1, 2, 3, 6
7번 행 : 운영그룹[PRD] / auto 4, 5, 7
When 조건문
먼저 지난번에 사용했던 When 구문을 보면 Gather_facts를 통해 수집한 정보를 통하여 OS 버전을 구분하였다.
그리고 아래는 새롭게 변경한 When 조건문인데, AS-IS와는 다르게 한줄이 더 추가되어 총 2개의 조건을 and 조건으로 판별하도록 한다. 그리고 명확한 원인은 확인하지 못했는데 OS를 판별하는 구문도 변경되었는데 기존에 사용하던 구문으로 사용했을 때, 문법이 맞지 않다는 오류가 발생하여 수정한 것임으로 굳이 오류가 나지 않는다면 AS-IS 구문으로 사용해도 무방할 것으로 보인다. 간단히 해결되었기에 원인은 찾지 않았지만 아마도 버전상의 이유로 추정된다.
그렇다면 변경된 조건문은 어떤 순서로 통하여 진행되는 것일까. 순서대로 풀어보면 아래와 같다.
inventory_hostname Inventory에 기재된 장비의 이름. 즉, 서버명 in groups ['PRD'] and 해당 서버가 PRD에 속한 장비이고
(포스팅 기준 auto 4 / 5 / 7)ansible_facts['distribution'] == 서버의 OS 정보가 "Microsoft Windows Server 2012 R2 Standard" WinSVR 2012 R2 Standard 라면 해당 Task를 수행 ※ PRD 그룹에 속한 3개의 장비 중, WinSVR 2012 R2인 auto4에 대하여 해당 Task를 수행해라.
라고 해석할 수 있는 것이다. 하여 필자는 처음으로 시작하는 Playbook에서 공통적인 부분은 기존과 그대로 유지하고 패치를 수행하는 서버의 소속그룹(DEV,PRD) / OS정보(2012,2016,2019)에 따라 패치를 수행하는 Playbook을 추가로 작성하였고, 처음으로 시작하는 Main Playbook은 아래와 같이 변경하였다.
- name: Start Main YAML hosts: all strategy: free gather_facts: True pre_tasks: - setup: filter: ansible_facts.distribution vars_files: vars.yml tasks: - name: Call in Common Process Playbook import_tasks: 01_common.yml - name: Call in WinSVR 2012 Patch Playbook (PRD) import_tasks: 02_PRD_WinSVR_2012.yml when: - inventory_hostname in groups['PRD'] and ansible_facts['distribution'] == "Microsoft Windows Server 2012 R2 Standard" - name: Call in WinSVR 2016 Patch Playbook (PRD) import_tasks: 02_PRD_WinSVR_2016.yml when: - inventory_hostname in groups['PRD'] and ansible_facts['distribution'] == "Microsoft Windows Server 2016 Standard" - name: Call in WinSVR 2019 Patch Playbook (PRD) import_tasks: 02_PRD_WinSVR_2019.yml when: - inventory_hostname in groups['PRD'] and ansible_facts['distribution'] == "Microsoft Windows Server 2019 Standard" - name: Call in WinSVR 2012 Patch Playbook (DEV) import_tasks: 02_DEV_WinSVR_2012.yml when: - inventory_hostname in groups['DEV'] and ansible_facts['distribution'] == "Microsoft Windows Server 2012 R2 Standard" - name: Call in WinSVR 2016 Patch Playbook (DEV) import_tasks: 02_DEV_WinSVR_2016.yml when: - inventory_hostname in groups['DEV'] and ansible_facts['distribution'] == "Microsoft Windows Server 2016 Standard" - name: Call in WinSVR 2019 Patch Playbook (DEV) import_tasks: 02_DEV_WinSVR_2019.yml when: - inventory_hostname in groups['DEV'] and ansible_facts['distribution'] == "Microsoft Windows Server 2019 Standard" - name: Call in Last CleanUp Playbook import_tasks: 03_cleanup.yml - name: Call in CheckPatch Result Playbook (PRD) import_tasks: 04_PRD_CheckPatch.yml when: - inventory_hostname in groups['PRD'] - name: Call in CheckPatch Result Playbook (DEV) import_tasks: 04_DEV_CheckPatch.yml when: - inventory_hostname in groups['DEV']
vars.yml
변경된 방식에 따라 변수 파일에도 수정이 필요하게 되었다. AS-IS는 OS정보에 따라서만 구분해주면 되었지만 TO-BE에서는 소속그룹까지 반영하여 총 6개의 패치 파일 이름을 명시해주어야 한다.
#### Common Variables #### Ansible_MasterDir: "/etc/ansible/YAML/Ansible_WinSVR_V3" Ansible_ClientDir: "C:\\AnsiblePM" #### WinSVR Patch Variables #### DEV_SVR2012_Stack: KB5001403.msu DEV_SVR2012_Rollup: KB5011564.msu #DEV_SVR2012_additional_1: KB1111111.msu PRD_SVR2012_Stack: KB5014025.msu PRD_SVR2012_Rollup: KB5014011.msu #PRD_SVR2012_additional_1: KB1111111.msu DEV_SVR2016_Stack: KB5011570.msu DEV_SVR2016_Rollup: KB5011495.msu #DEV_SVR2016_additional_1: KB1111111.msu PRD_SVR2016_Stack: KB5014026.msu PRD_SVR2016_Rollup: KB5015019.msu #PRD_SVR2016_additional_1: KB1111111.msu PRD_SVR2019_Patch_Total: KB5014022.msu DEV_SVR2019_Patch_Total: KB5011503.msu
마무리
V3는 크게 달라진 부분이 없고 깔끔하게 정리하지도 못한 부분이 많아서.. 전체 Playbook을 첨부하지는 않았으니 별도로 필요한 댓글을 남겨주길 바란다.
궁금하신 내용은 댓글로 남겨주시고, 많은 블로그 방문은 저에게 큰 힘이 됩니다. ・ᴥ・
'오픈소스' 카테고리의 다른 글
[Ansible] 신규 Client 서비스 활성화 (WINDOW/LINUX) (0) 2022.09.27 [Docker] 파이썬(Python3.8) 개발 환경 구축하기 (0) 2022.08.29 [Ansible] WinSVR 업데이트 Playbook 고도화 (V2) (0) 2022.07.18 [Ansible] Window Server 2019 업데이트 자동화 (5) 2022.03.29 [Ansible] VMware 프로비저닝 (VMtools 설치 및 초기 설정) (0) 2021.07.22