본문 바로가기

DevOps/Ansible

[Ansible] 9. ansible Module (systemd, service)

systemd와 service 모듈은 daemon 등록과 관련된 앤서블 모듈입니다. 앤서블 모듈을 먼저 알아보기전에, systemd와 service의 경로나 관리하는 방법에 대해서 먼저 알아야 합니다.

 

systemctl 이란?

RHEL 7 에 도입된 systemd 를 관리하는 명령어

 

service 이란? 

/systemd/system/{{서비스이름.service}}

디렉토리 아래에 확장자가 .service인 파일을 만들면, systemctl 명령을 통해 서비스를 제어할 수 있습니다.

 

systemd service가 등록되어 있지 않아도, service를 실행하면 자동으로 systemctl에 등록됩니다

 

 

(참고로 CentOS 7 이전에는 기존 서비스 관리 명령어였던 chkconfig를 통해 /etc/init.d/* 에 등록된 서비스들을 제어했었습니다.

CentOS 7에서는 systemctl을 통해 서비스를 관리합니다.)

 

 

---

- name: service module test
  systemd:
    name: network
    state: stopped

- name: Ensure MySQL is started and enabled on boot.
  service: "name={{ mysql_daemon }} state=started enabled={{ mysql_enabled_on_startup }}"

 

 

systemd 모듈과 service 모듈을 사용하는 예제를 위에 소개했다.

하지만, 다음 모듈들을 사용하는것은 전혀 어렵지 않으나, 바이너리 설치시 서비스를 등록하고, 사용하는것에서 조금

어려움을 느꼈기 때문에, 해당 내용을 중점으로 포스팅을 이어나가겠다.

 

항상, 마리아 디비 설치하는것이 조금 어려운것 같다.

그래서 mysql을 설치하고, 서비스를 등록하는것 까지에 대한 example을 제시한다.

 

기본적으로 tar file을 준비하고, 언아카이브를 하는 작업을 선행하는데, 이부분에서는 어려운 점이 없기 때문에 

건너 뛰겠다.

 

  • 그 이후에 유저등록 ( user add ) 과  그룹 등록을 하고 (group add)
  • /usr/local/mysql 로 심볼릭 링크를 딴다
  • 해당 폴더에 폴더 ownership을 수정한다.
  • /etc/my.cnf를 생성해준다.
  • mariadb log를 기록할 파일과  pid 파일을 생성해준다.
  • log file 과 pid file에 권한을 부여한다.
  •  /etc/my.cnf에 소켓, 데이터dir, user, port, pid-file, log-file 들의 경로를 입력해준다.
  • mysql install 스크립트를 돌린다.
  • mysql_safe로 실행한다
  • 서비스를 등록한다.

 

서비스를 실행하는데는 문제가 없지만 기본적으로 바이너리 설치할때 /usr/local/mysql/support-files/mysql.server을 

 

/etc/init.d/mariadb 로 복사를 해놓아야 한다. (systemctl)

/etc/systemd/system/mariadb.service (service)

 

mysql.server 파일의 주석을 확인하면 Redhat 기준으로 /etc/init.d/ 아래로 copy하라고 내용이 적혀 있는데

국내 블로그에 포스팅 된 내용으로는 /etc/systemd/system/ 아래에 위치하라는 내용이 다수다.

 

 

my.cnf 파일도 수정이 필요한데 다음과 같이 jinja 템플릿을 만들어서 적용시키면 편하다.

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql


# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0
port={{ mysql_port }}

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file={{ __pidfile }}

 

 

템플릿을 사용하는 모듈은 이렇게 사용하면 된다.

- name: Create Mysql configuration file
  template: src=my.cnf.j2 dest=/etc/my.cnf
  notify:
  - restart mariadb

 

여기서 notify: 옵션은 

해당 내용이 수정되면서 service를 재시작 해주도록 예약하는 옵션이다.

핸들러에 task를 등록해 두고, 사용하는것 같다.

 

 

약간 헷갈릴 수 있는데, service 데몬을 만들때와 

systemd 아래에 들어갈 init.script를 만들때 양식도 다르고 대체 systemd에 등록할때와 service에 등록할때 뭐가 다른거냐는 

궁금증이 생겼는데

 

https://conory.com/blog/42241

 

systemd에서 부팅시 실행할 서비스 관리하기 (CentOS 7)

원래 부팅시 정해진 서비스 또는 스크립트를 실행시키는 건 init (System V Init)라는 프로그램의 몫이였습니다. 유닉스가 처음 생길때부터 그래왔고, 지금도 그렇습니다.(하지만 지금은 다른 아이로

conory.com

 

이 분의 블로그를 꼭 읽어 보길 바란다.

요약해서 설명하자면, sysv (init ) 을 유닉스 부터 Centos 6 까지 사용하다가 

Centos 7 부터 systemd 에 pid 1 번을 빼앗겼다는 뭐 그런 슬픈 스토리다.

 

Linux는 Unix부터 발전해오면서 계속 사용하는 방법들이 바뀌고 그 변화를 추적해 나가는 노력이 필요한것 같다.