전공영역 공부 기록

Ansible mysql 플러그인을 잘못 사용해서 발생한 오류

악분 2024. 7. 26. 08:42
반응형

1. 오류내용

Ansible에서 mysql플러그인 동작을 잘 이해하지 못해 생긴 오류가 있었습니다. 개발환경에서 갑자기 애플리케이션이 mysql을 접속하지 못하는 오류가 발생했습니다.

 

2. 디버깅과 임시조치

1. mysql이 잘 실행되고 있는지 확인

mysql은 AWS RDS로 실행되기 때문에 mysql 는 멀쩡하다고 생각했습니다.

 

2. 애플리케이션을 실행하는 인스턴스에서 mysql연결 확인

nc, telent을 사용해서 mysql과 네트워크 문제가 있는지 확인했습니다. 잘 연결되었습니다.

 

3. 최근 작업확인

mysql DML는 ansible로 관리되고 있습니다. 그래서 ansible 실행이력을 확인했습니다. 마침 오류가 발생한 시점에 ansible실행이력이 있었습니다.

 

4. 임시조치

ansible코드는 mysql user 권한을 수정하고 있었습니다. 임시로 mysql user권한을 롤백하고 ansible코드를 분석했습니다. 권한은 아래처럼 확인했습니다.

SHOW GRANTS FOR 'alice'@'%'

 

3.  원인

문제가 있었던 ansible코드는 mysql플러그인이었습니다. mysql_user모듈을 사용해서 use권한을 수정하는데 priv에서 리스트 형식을 사용했던게 문제였습니다. mysql_user모듈의 priv는 리스트 형식으로 사용하게 되면, 가장 마지막 적용한 값만 user에 권한이 적용되었습니다.

 

예를 들어 아래 ansible코드를 실행하면 log스키마 권한만 적용됩니다. shop스키마에 대한 권한은 적용되지 않습니다.

tasks:
  - name: Create MySQL user 'alice' and grant privileges on 'shop' and 'log'
    mysql_user:
      name: "alice"
      password: "your_secure_password"
      priv: "{{ item }}.*:ALL"
      state: present
    with_items:
      - shop
      - log

 

4.  해결방법

priv에 적용할 권한을 리스트에서 개행으로 변경했습니다.

tasks:
  - name: Create MySQL user 'alice' and grant privileges on 'shop' and 'log'
    mysql_user:
      name: "alice"
      password: "your_secure_password"
      priv: 
        'shop.*:ALL'
        'log.*:ALL'
      state: present
반응형