Devops/Ansible

MSSQL CU Update, Ansible 로 업데이트 하기

BabyTT 2023. 3. 19. 10:37

 MSSQL 2019부터 CU업데이트 (2017에도 진행했지만 잘 사용하는 버전이 아니어서 2019부터 사용) 설치가 필요하였고 여러 대의 서버에 자동화된 설치를 위해 playbook role을 개발하여 사용합니다.

 

 Ansible 로 CU update 시 .exe 파일을 사용하고,

설치 후에는 reboot이 필요하다는 return code 3010을 보내면서 Ansible이 정상 완료로 처리하는 0이 아니기 때문에

에러가 발생합니다. 이 부분을 ignore_error로 하였는데 설치 부분에서 실제 에러가 발생할 경우에는 확인하는 절차가 필요하기 때문에 return code 3010 이 아닐 경우에 대해서는 예외 처리를 할 예정입니다.

 

defaults/main.yml

SQLServerCU:
  mssql2019_cu11: SQLServer2019-CU11-x64.exe
  mssql2019_cu18: SQLServer2019-CU18-x64.exe

 

tasks/sql2019_cu_update.yml

- name: CU update file copy
  win_copy:
    remote_src: no
    src:"{{ source_path }}{{ item.update_exe_file }}"
    dest: "{{ dest_path }}"
  when: "{{ item.when }}"
  with_items:
    - { update_exe_file: "{{ SQLServerCU.mssql2019_cu11 }}", when: Version=='SQL2019_CU11' }
    - { update_exe_file: "{{ SQLServerCU.mssql2019_cu18 }}", when: Version=='SQL2019_CU18' }

# Adding "ignore_error": it returns "3010" code which is not "0" as an expected success return code. (it means need to reboot.)
- name: CU update
  win_command: "{{ dest_path }}{{ item.update_exe_file }} /quiet /Action=Patch /IAcceptSQLServerLicenseTerms /AllInstances"
  when: "{{ item.when }}"
  with_items:
    - { update_exe_file: "{{ SQLServerCU.mssql2019_cu11 }}", when: Version=='SQL2019_CU11' }
    - { update_exe_file: "{{ SQLServerCU.mssql2019_cu18 }}", when: Version=='SQL2019_CU18' }
  ignore_errors: true    
    
- name: reboot
  win_reboot:
  
- name: Check its version
  win_shell: Invoke-sqlcmd -Serverinstance "{{ inventory_hostname }}.cloud.ncsoft,62222" -Username 데이터베이스계정 -Password 데이터베이스비밀번호 -Database "master" -Query "select LEFT(@@version, 70)"
  register: present_cu_version
  
- name: Send result mail
  win_shell: |
    $Servername = "{{ mail_nodename }}"
    $From = 발신자주소
    $To = 수신자주소
    $Subject = "Report from $Servername"
    $SmtpServer = 메일서버주소
    $Body = "Installed Cu version - {{ present_cu_version.stdout_lines[3] }}"
    $Attachement = Get-ChildItem -Path "C:\Program Files\Microsoft SQL Server\150\Setup Bootstrap\Log\Summary.txt" | %{$_/FullName}
    Send-MailMessage -From $From -To $To -Subject $Subject -Body -SmtpServer $SmtpServer